有关切换着色器程序的问题(ES 2)

时间:2010-06-22 16:36:25

标签: iphone opengl-es shader

我正在尝试编写一个相当简单的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);

如果单独执行,则两个着色器正常工作(例如,使用第一个着色器注释零件)。但是当我将它们组合在一起时,如上所述,纹理贴图将消失。我花了很长时间试图找出原因......

有人能帮帮我吗?感谢。

2 个答案:

答案 0 :(得分:1)

您无法以这种方式组合着色器,只会使用glUseProgram指定的最后一个程序。

要组合着色器,您必须手动生成一个同时执行这两项操作的新着色器。

答案 1 :(得分:0)

我想知道glBindTexture()是否必须在用glUseProgram()切换程序后发生。这是glUseProgram this page的参考。确保glBegin和glEnd之间没有调用glUseProgram。检查glGetError以查看加载第二个顶点程序时是否导致错误。