OpenGL Multitexture - вторая операция текстуры не имеет никакого эффекта - PullRequest
1 голос
/ 28 марта 2012

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

Вот код:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [texture_ name]);
GLfloat g[4] = { grey, grey, grey, grey };
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, g);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB,      GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB,         GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB,     GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB,     GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB,         GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB,     GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_TEXTURE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, gTexID1);
GLfloat col[4] = { (float)color_.r/255.0, (float)color_.g/255.0, (float)color_.b/255.0, 1.0 };
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, col);
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_OPERAND0_RGB,     GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB,         GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB,     GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,    GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA,       GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA,   GL_SRC_ALPHA);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Первая часть работает просто отлично, но вторая часть не имеет никакого эффекта. Имя текстуры gTexID1 действительно пустое, так как я использую постоянный цвет для тонирования текстуры, я просто создаю его с помощью вызова: glGenTextures (1, & gTexID1). Я проверил значение цвета, конечно, это не белый.

Я бессовестно скопировал большую часть кода с здесь .

Есть идеи, почему это не удается?

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Названия некоторых функций OpenGL немного сбивают с толку. glGenTextures не генерирует объекты текстуры, но не использует имена текстур. В более старых версиях OpenGL (<= OpenGL-2.1) вам даже разрешалось самостоятельно управлять именами и вообще не использовать <code>glGenTextures. Достаточно было использовать glBindTexture с неиспользованным именем. Фактический объект текстуры создается с помощью вызова glTexImage2D.

Могу ли я спросить, почему вы проходите борьбу объединителей текстур, а не просто используете для этого фрагментный шейдер?

2 голосов
/ 28 марта 2012

Несмотря на то, что это фиктивная текстура, я считаю, что недостаточно вызвать glGenTextures.Вы также должны вызвать glTexImage2D, чтобы указать размер.Также проверьте, есть ли у вас код ошибки из glGetError.

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