вопрос о переключении шейдерных программ (ES 2) - PullRequest
5 голосов
/ 22 июня 2010

Я пытаюсь написать довольно простую программу 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 ]

1 голос
/ 22 июня 2010

Вы не можете комбинировать шейдеры таким образом, будет использоваться только последняя программа, указанная в glUseProgram.

Чтобы объединить шейдеры, вы должны сделать это вручную, создав новый шейдер, который выполняет обе функции одновременно.

0 голосов
/ 24 июня 2010

Интересно, должно ли произойти glBindTexture () после переключения программы с помощью glUseProgram (). Вот ссылка для glUseProgram этой страницы . Убедитесь, что glUseProgram не вызывается между glBegin и glEnd. Проверьте glGetError, чтобы увидеть, не вызвана ли ошибка при загрузке второй вершинной программы.

...