Поиск текстур в вершинном шейдере ведет себя по-разному на устройстве iPad и симуляторе iPad - OpenGL ES 2.0 - PullRequest
8 голосов
/ 15 ноября 2010

У меня есть вершинный шейдер, в котором я выполняю поиск текстуры, чтобы определить gl_Position. Я использую это как часть системы моделирования частиц GPU, где положения частиц хранятся в текстуре.

Кажется, что: vec4 textureValue = texture2D(dataTexture, vec2(1.0, 1.0)); ведет себя по-другому на симуляторе, чем на устройстве iPad. На симуляторе поиск текстуры успешен (значение в этом месте 0,5, 0,5) и моя частица появляется там. Однако на самом iPad поиск текстур постоянно возвращает 0.0, 0.0.

Я пробовал обе текстуры в формате GL_FLOAT и GL_UNSIGNED_BYTE.

Кто-нибудь еще испытывал это? В спецификации GLSL ES говорится, что поиск текстур можно выполнять как в вершинном, так и в фрагментном шейдерах, поэтому я не вижу, в чем проблема.

Я использую последнюю бета-версию iOS SDK 4.2

.

Ответы [ 5 ]

10 голосов
/ 20 июля 2011

Я только что проверил это.Используя iOS 4.3, вы можете выполнить поиск текстуры в вершинном шейдере как на устройстве, так и на симуляторе.Хотя есть некоторая странность (возможно, поэтому она и не «официальная», как упоминал Сзу).На реальном устройстве (я тестировал на iPad 2) вам нужно найти фрагментный шейдер, а также вершинный шейдер.То есть, если вы на самом деле не используете его в фрагментном шейдере, вам все равно придется ссылаться на него каким-то образом.Вот тривиальный пример, где я передаю текстуру и использую красный пиксель, чтобы немного переместить значение y вершины:http://www.mat.ucsb.edu/a.forbes/blog/?p=453

6 голосов
/ 26 апреля 2011

из официального «Руководства по программированию OpenGL ES для iOS», раздел «Замечания по платформам»

«Вы не можете использовать поиск текстур в вершинном шейдере.»

1 голос
/ 16 ноября 2010

У меня такое чувство, что GLES на iPad (или iPhone) не поддерживает поиск текстур в вершинном шейдере, но не цитируйте меня.

Если он поддерживает поиск текселей в вершинных шейдерах, возможно, у вас есть текстурные координаты, обрезанные или обернутые? Потому что 1.0x1.0 находится за пределами текстуры IIRC.

1.0x1.0 в режиме обтекания должно быть 0.0x0.0. 1.0x1.0 в отсечении должен быть последним texel.

1 голос
/ 28 января 2011

Я попробовал это сам, и Texture2D работает на iPad (как на устройстве, так и на симуляторе) под iOS 4.2 при использовании в вершинном шейдере.

Мое лучшее предположение, что у вас включено mip mapping, и в этом проблема.Я заметил, что поиск в mip-отображении в вершинном шейдере с использованием Texture2D работает в симуляторе, но не на устройстве.Вы не можете использовать mip-карты с Texture2D в вершинном шейдере, потому что у него нет возможности выбрать, какой уровень mip-map использовать.Вам нужно отключить mip-mapping для этой текстуры или использовать вместо него Texture2DLod, который поддерживает mip-карты.

1 голос
/ 15 ноября 2010

Это не единственное, что ведет себя по-разному в симе по сравнению с устройством.Я сделаю вам то же самое предложение, что и всем остальным: игнорируйте симулятор, когда вам нужно проверить, как все выглядит на устройстве так, как должно.Только проверяйте такие вещи, как логика, функциональность, не смотрите на сим и только если можете.

...