2012-03-18 3 views
4

OpenGL을 배우는 중입니다.보다 복잡한 쉐이더 효과를 구현하기 위해 기본적으로 두 가지 상태가 있다는 것을 알고 있습니다. 첫 번째는 주 프로그램에서 여러 가지 다른 균일 변수를 허용하는 하나의 복잡한 버텍스 및 프래그먼트 셰이더를 작성하고 셰이더에서 수행 할 작업을 결정하는 것입니다. 전의.하나의 복잡한 셰이더 또는 여러 개의 셰이더를 쓰는 것이 더 효과적입니까?

uniform int whichColor; 
int main() { 
    if (whichColor == 1) { 
     gl_FragColor = vec4(0,1.0,0,1.0); 
    } 
    else { 
      gl_FragColor = vec4(0,0,1.0,1.0); 
    } 
} 

및 루프를 그리기 내 C++에서 whichColor에 다른의 int를 통과 : 나는 파란색 한 상황에서 다른 상황에 맞는 녹색 픽셀을 만들고 싶어, 나는 GLSL에서 할 수 있습니다. 또는 두 개의 별도 쉐이더 프로그램을 정의 할 수 있습니다. 그 중 하나는 gl_FragColor를 파란색으로 설정하고 다른 하나는 녹색으로 설정하고, OpenGL 씬에서 특정 객체를 그릴 때가되면 다른 하나를로드하는 것입니다.

이러한 전략 중 어떤 것이 더 나은지에 대한 정보는 찾을 수 없습니다. 첫 번째 전략은 그래픽 카드에서 렌더링해야 할 모든 것을 복잡하게 만드는 것이 더 효과적 일 것이라고 기대할 수 있습니다.하지만 픽셀 단위 계산이 아닌 무언가를 결정할 생각을하는 경우에는 병렬 처리의 이점. 그래픽 카드에서 쉐이더 프로그램이 어떻게 실행되는지, 그리고 변수를 연결하고 전달하는 데 필요한 비용이 무엇인지는 잘 모르겠다. 그래서 내 직감이 실제로 올바른지 확신 할 수 없다.

+1

"더 나은"주관적인 질문입니다. 대답 할 수 없으므로 "더 나은"질문은 SO에 환영받지 못합니다. 적어도, 그것에 몇 가지 기준을 두십시오. "더 나은"어떤면에서? –

+0

"더 나은"은 "일반적으로 더 빠름"을 의미하거나 "시스템과 gfx 카드 메모리간에 최소한의 데이터 전송"또는 "전문 OpenGL 개발자가 실제로하는 일에 더 가깝습니다"를 의미합니다. glut display 함수에서 새로운 셰이더를로드하는 데 드는 비용은 복잡한 셰이더 하나를 작성하고 유니폼을 통해 데이터를 지속적으로 전달하는 비용과 비교하면 얼마입니까? – Tneuktippa

답변

2

얼마 전이 주제에 대한 답변을 찾았습니다. 내가 몇 가지 게임과 책에서 수집 한 것은 일반적으로 다른 셰이더를 사용한다는 것입니다.

당신은 필요한 모든 쉐이더 프로그램을 한 번 컴파일하고 필요한 쉐이더 프로그램으로 모든 객체에-그린 수 전환 할 수 있습니다 : 당신이하고 싶지 않아하는 부하가

void Draw(){ 

    glUseProgram(yourShaderProgram); 

    glUniformX(yourUniformVariables); 

    glDrawArrays(yourVAO); 

} 

이며, 쉐이더 프로그램을 링크 필요할 때마다.

대신 모든 쉐이더 프로그램의 목록을 어딘가에 보관하거나 각 개체에 프로그램의 ID를 전달하여 사용 가능하게하십시오.

+0

해답에 더하여, 합리적인 한도 내에서 쉐이더 소스 코드의 조합 폭발을 유지하기 위해서 최소한 # define을 사용할 수 있습니다. –

관련 문제