다소 간단한 OpenGL ES 2 프로그램을 작성하려고합니다.셰이더 프로그램 (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);
두 개의 셰이더가 별도로 실행되는 경우 (예 : 첫 번째 셰이더를 사용하여 파트에 주석 처리) 올바르게 작동합니다. 하지만 위와 같이 같이 결합하면 텍스처 맵이 사라집니다. 왜 꽤 많은 시간을 보냈는데 ...
누군가 나를 도울 수 있습니까? 감사.
이 게시물은 매우 오래된 것으로 알고 있지만이 답변을 확대 할 수 있는지 궁금합니다. 여러 개의 셰이더 프로그램을 사용할 수 없거나 특정 방식으로 수행해야한다고 말하고 있습니까? 지금 내 앱에서 여러 개의 쉐이더를 구현하려고합니다. 단 하나만 사용하기 시작했으나 프래그먼트 셰이더의 한 분기가 심각한 속도 저하를 일으켰습니다. 감사합니다 – Stuart
@ StuDev 동시에 여러 프로그램을 사용할 수 없으므로 glUseProgram을 호출 할 때마다 현재 프로그램이 함수에 전달 된 프로그램으로 바뀝니다. 이것은 동시에 다른 프로그램을 가진 각각의 그리기 개체가 아무 문제없이 작동한다는 것을 의미합니다. –
답장을 보내 주셔서 감사합니다. 그래서 내가 올바르게 이해한다면, 다음의 패턴은 단일 프레임 렌더 내에서 잘 작동해야합니다 :'glUseProgram (prog1)'->'glDrawElements()'->'glUseProgram (prog2)'->'glDrawArrays()'(다른 FBO) -> 현재 renderbuffer. 희망을 올바르게 이해했습니다. – Stuart