我正在尝试编写一个相当简单的opengl es 2程序。
我有两个不同的着色器,一个为屏幕呈现纯色矩形,另一个呈现纹理贴图矩形。
我想首先绘制纯色矩形,然后在它上面绘制纹理贴图矩形。
glUseProgram(program1);
glUniform1f(shader1_uniforms[UNIFORM_SCREEN_WIDTH], (GLfloat)screenWidth);
glUniform1f(shader1_uniforms[UNIFORM_SCREEN_HEIGHT], (GLfloat)screenHeight);
glDisableVertexAttribArray(ATTRIB_TEX2);
glVertexAttribPointer(ATTRIB_VERTEX2, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX2);
glVertexAttribPointer(ATTRIB_COLOR2, 4, GL_FLOAT, 1, 0, squareColors);
glEnableVertexAttribArray(ATTRIB_COLOR2);
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D,1);
glUseProgram(program2);
glUniform1f(shader2_uniforms[UNIFORM_SCREEN_WIDTH], (GLfloat)screenWidth );
glUniform1f(shader2_uniforms[UNIFORM_SCREEN_HEIGHT], (GLfloat)screenHeight);
glUniform1i(shader2_uniforms[UNIFORM_UIMAP], 0);
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_FLOAT, 1, 0, squareColors);
glEnableVertexAttribArray(ATTRIB_COLOR);
glVertexAttribPointer(ATTRIB_TEX, 2, GL_FLOAT, 0, 0, squareTexCoords);
glEnableVertexAttribArray(ATTRIB_TEX);
// Draw
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_BLEND);
如果单独执行,则两个着色器正常工作(例如,使用第一个着色器注释零件)。但是当我将它们组合在一起时,如上所述,纹理贴图将消失。我花了很长时间试图找出原因......
有人能帮帮我吗?感谢。答案 0 :(得分:1)
您无法以这种方式组合着色器,只会使用glUseProgram指定的最后一个程序。
要组合着色器,您必须手动生成一个同时执行这两项操作的新着色器。
答案 1 :(得分:0)
我想知道glBindTexture()是否必须在用glUseProgram()切换程序后发生。这是glUseProgram this page的参考。确保glBegin和glEnd之间没有调用glUseProgram。检查glGetError以查看加载第二个顶点程序时是否导致错误。