2010-06-22 5 views
5

다소 간단한 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); 

두 개의 셰이더가 별도로 실행되는 경우 (예 : 첫 번째 셰이더를 사용하여 파트에 주석 처리) 올바르게 작동합니다. 하지만 위와 같이 같이 결합하면 텍스처 맵이 사라집니다. 왜 꽤 많은 시간을 보냈는데 ...

누군가 나를 도울 수 있습니까? 감사.

답변

1

그런 식으로 쉐이더를 결합 할 수 없으며, glUseProgram으로 지정된 마지막 프로그램 만 사용됩니다.

셰이더를 결합하려면 두 섀시를 동시에 수행하는 새 셰이더를 수동으로 생성해야합니다.

+0

이 게시물은 매우 오래된 것으로 알고 있지만이 답변을 확대 할 수 있는지 궁금합니다. 여러 개의 셰이더 프로그램을 사용할 수 없거나 특정 방식으로 수행해야한다고 말하고 있습니까? 지금 내 앱에서 여러 개의 쉐이더를 구현하려고합니다. 단 하나만 사용하기 시작했으나 프래그먼트 셰이더의 한 분기가 심각한 속도 저하를 일으켰습니다. 감사합니다 – Stuart

+2

@ StuDev 동시에 여러 프로그램을 사용할 수 없으므로 glUseProgram을 호출 할 때마다 현재 프로그램이 함수에 전달 된 프로그램으로 바뀝니다. 이것은 동시에 다른 프로그램을 가진 각각의 그리기 개체가 아무 문제없이 작동한다는 것을 의미합니다. –

+0

답장을 보내 주셔서 감사합니다. 그래서 내가 올바르게 이해한다면, 다음의 패턴은 단일 프레임 렌더 내에서 잘 작동해야합니다 :'glUseProgram (prog1)'->'glDrawElements()'->'glUseProgram (prog2)'->'glDrawArrays()'(다른 FBO) -> 현재 renderbuffer. 희망을 올바르게 이해했습니다. – Stuart

0

glUseProgram()으로 프로그램을 전환 한 후에 glBindTexture()가 발생해야하는지 궁금합니다. glUseProgram this page에 대한 참조가 있습니다. glBegin과 glEnd 사이에 glUseProgram이 호출되지 않는지 확인하십시오. glGetError를 검사하여 두 번째 정점 프로그램을로드 할 때 오류가 발생하는지 확인합니다.