OpenGL Texture Combiner - градиентная текстура - PullRequest
0 голосов
/ 17 сентября 2009

У меня есть 2 текстуры RGBA8:

А) «Основная» текстура с данными для отображения на всех каналах

B) Текстура "градиент", которая имеет только значимые данные в альфа-формате (конечно, это действительно должна быть текстура A8)

Используя объединители текстур OpenGLES 1.1, я бы хотел, чтобы полученный тексель копировал RGB из текстуры #A и использовал альфа-модуляцию из обеих текстур (альфа из текстуры A * альфа из текстуры B).

У меня проблемы с кодом текстурного комбайнера (я уже пробовал с ним работать), и мне было интересно, сможет ли кто-нибудь обнаружить проблему:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, geometryP->texName);
glTexCoordPointer(2, GL_BYTE, 0, geometryP->texCoordsP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, mGradientTextureName);
glTexCoordPointer(2, GL_BYTE, 0, geometryP->texCoordsP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

Результат, который я получаю, в основном выглядит как RGBA из текстуры #A (основная текстура).

Ответы [ 3 ]

2 голосов
/ 19 сентября 2009

Возможно, я выключен, но вы уверены, что это проблема с координатами текстуры? Вы, кажется, не делаете glClientActiveTexture до вызова glTexCoordPointer ...

1 голос
/ 19 сентября 2009

BindTexture, TexEnv, glEnable (GL_TEXTURE_2D) и матрица текстуры подвержены влиянию ActiveTexture, но TexCoordPointer - нет. Фактически, второй TexCoordPointer был ненужным, и первый вызов мог быть выполнен в любом порядке. Я немного обезьян, и мой самый последний код:

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, geometryP->texName);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mGradientTextureName);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);  
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

У меня такое ощущение, что новый код верен, но моя текстура градиента может быть неправильной, поэтому я все еще работаю над ней:)

0 голосов
/ 20 сентября 2009

Бахбар, извините, вы были абсолютно правы насчет glClientActiveTexture - я не слышал об этом раньше (и путал его с glActiveTexture в моем последнем ответе). Но после использования этого и установки glEnableClientState и glTexCoordPointer для TEXTURE1, это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...