2015-11-24 1 views
0

Я передаю GL_TEXTURE_3D в шейдер фрагмента в приложении iOS. Я использую фильтры минимизации и увеличения как GL_LINEAR для этой текстуры. Однако получающаяся в результате текстура, созданная в приложении, имеет блоки вместо плавного перехода цветов, что подразумевает использование интерполяции GL_NEAREST. Вот скриншоты из ожидаемых против получили выходное изображение expected output output receivedИнтерполяция в texture3D в OpenGL ES 3.0 на iOS

PS: Если я использую 2D текстуру вместо этого, передать в 3D текстуры как сведенное 2D текстуры и сделать интерполяцию вручную в затенении, его работает отлично, и я получаю ожидаемый результат.

Вот код для установки GL_LINEAR:

GLenum target, minificationFilter, magnificationFilter; 
target = GL_TEXTURE_3D; 
minificationFilter = GL_LINEAR; 
magnificationFilter = GL_LINEAR; 
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minificationFilter); 
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magnificationFilter); 
+1

Можете ли вы показать код, где вы установили GL_LINEAR? –

+0

@RhythmicFistman: Я редактировал сообщение, чтобы включить код. Спасибо за вопрос. – user5597458

+0

Эти блоки довольно большие. Может быть, это квантование текстуры? Как вы загружаете текстуру? –

ответ

1

линейной фильтрации текстур с внутренним форматом GL_RGBA32F не поддерживается в ES 3.0.

Вы можете видеть, какие форматы поддерживают линейную фильтрацию в таблице 3.13 документа спецификации ES 3.0, на страницах 130-132. Последний столбец с заголовком «Texture-filterable» указывает, какие форматы поддерживают фильтрацию. RGBA32F не имеет галочки в этой колонке.

Если вам нужна линейная фильтрация для плавающих текстур, вы ограничены 16-битными поплавками компонентов. RGBA16F в той же таблице имеет галочку в последнем столбце.

Данное ограничение по-прежнему существует в последней спецификации ES 3.2.

Существует расширение, чтобы снять это ограничение: OES_texture_float_linear. Однако это расширение не указано в разделе supported extensions on iOS.

+0

Переключение с 'RGBA32F' на' RGBA16F', похоже, сделало трюк для меня. Спасибо за подробное объяснение и указав ссылку в документации. – user5597458

0

При переключении из формата GL_RGBA32F флоат одинарной точности в формате половинной флоат GL_RGBA16F затем GL_LINEAR увеличение работает отлично.

Я не могу найти какую-либо документацию, чтобы предположить, почему это не должно работать, и единственное ограничение на одноточечные текстуры float, по-видимому, используется при использовании в качестве целей рендеринга, поэтому я предполагаю, что это ошибка, GL_RGBA32F игнорирует GL_LINEAR увеличение на iOS 9 ".

Если действительно является ошибка, тогда понимание - я представить себе OpenGLES 3 реализацию, чтобы быть одной из частей большой, самый ужасный переключатель-заявление с приводом кода, который один мог бы иметь несчастье работать. Если вы считаете, что любой гламур, который раньше мог повлечь за собой работу, был вытеснен выпуском более быстрого, более сексуального и без устаревших Metal, тогда вы, вероятно, говорите о очень нелюбимой кодовой базе, поддерживаемой очень несчастными людьми. Вам повезло, плоские затененные треугольники даже работают.

p.s. при использовании GL_TEXTURE_3D не забудьте зажать в третьей координат (GL_TEXTURE_WRAP_R)

тест p.p.s это на устройстве. ни GL_RGBA32F, ни GL_RGBA16F не похоже на работу с GL_LINEAR на тренажере

+0

Я попробую GL_RGBA16F и вернусь к вам. PS - Я зажимаю третью координату :), и я тестирую ее на устройстве. Я согласен с тем, что симулятор не очень надежный. – user5597458

+0

'GL_RGBA16F' вместо' GL_RGBA32F' отлично работает с GL_LINEAR. Благодаря! – user5597458

 Смежные вопросы

  • Нет связанных вопросов^_^