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

hah*_*aha 5 iphone shader opengl-es

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

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

有人能帮我吗?谢谢.

Mat*_*gro 1

您不能以这种方式组合着色器,只有使用 glUseProgram 指定的最后一个程序才会被使用。

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

  • @StuDev 意味着您不能同时使用多个程序,每次调用 glUseProgram 都会将当前程序替换为传递给函数的程序。请注意,这意味着同时使用不同程序绘制对象将可以正常工作。 (2认同)