OpenGL Multitexture - 第二个纹理操作无效

时间:2012-03-28 10:04:03

标签: ios opengl textures

我正在进行多纹理操作,将一定量的灰色混合到纹理中,然后使用另一种颜色进一步调整纹理。请注意,原始纹理已预先乘以alpha。

以下是代码:

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)来创建它。 我当然检查了颜色的值,它不是白色的。

我无耻地复制了here的大部分代码。

知道为什么会失败吗?

2 个答案:

答案 0 :(得分:3)

某些OpenGL函数的命名有点令人困惑。 glGenTextures不会生成纹理对象,但会生成未使用的纹理名称。在较旧的OpenGL版本(< = OpenGL-2.1)中,您甚至可以自己进行名称管理,而根本不使用glGenTextures。仅使用未使用名称的glBindTexture就足够了。通过调用glTexImage2D创建实际纹理对象。

我可以问你为什么要经历纹理合成器的挣扎,而不是简单地使用碎片着色器吗?

答案 1 :(得分:2)

尽管它是虚拟纹理,但我认为仅仅调用glGenTextures是不够的。你还必须调用glTexImage2D给它一个大小。还要检查glGetError是否收到任何错误代码。