2012-03-13 2 views
6

glUseProgram()은 얼마나 빠릅니까? 더 좋은 일이 있나요 (빠른)? 여기glUseProgram() 및 속도 이후의 유니폼 동작

내 생각은 다음과 같습니다

  1. 사용 1 개 보편적 인 쉐이더 프로그램 만 이상의
  2. 사용 이상 (각 그래픽 클래스에 대한 설정) 많은 입력 설정 및 속성 각 그래픽 클래스마다 1 개의 셰이더

셰이더 프로그램을 변경 한 후 유니폼은 어떤 상태입니까? 값 (예 : 행렬 값)을 저장합니까?

  • 사용하지 않습니다 glUseProgram()

과 # 2의 장점 :

  • 없음 여기

    내가 할 # 1의 장점을 고려 무엇인가 행렬 변경 (예 : 클래스 Menu 및 클래스 Scene3D에 다른 투영 행렬이있는 경우)

답변

6

두 가지 옵션 중 무엇이 더 좋은지는 셰이더가하는 일, 셰이더의 종류, 설정 한 속성/유니폼의 수 및 변경 빈도에 따라 크게 달라집니다. 모든 경우에 대해 정답은 없습니다.

그렇습니다 : 상태 변화에 대한 비용뿐만 아니라 셰이더 런타임 비용도 있고 버텍스 및 조각 당 지불해야한다는 점을 명심하십시오. 따라서 셰이더의 복잡성을 낮추는 것은 항상 좋은 생각이며 유니버설 셰이더는 특수한 셰이더보다 복잡합니다.

상태 변경을 최소화하십시오. 프로그램 X를 사용하는 오브젝트 A, C, E가 있고 프로그램 Y를 사용하는 B, D, F가있을 경우 ABCDEF가 아닌 ACEBDF 순서로 렌더링됩니다.

마지막 질문에 관해서 : 프로그램은 자신의 상태와 유니폼 값을 다시 평생 걸쳐 유지합니다. 그러나 유니폼은 프로그램 상태에 따라 다릅니다. 즉, 서로 다른 프로그램에 동일한 이름과 유형의 유니폼이 두 개 있으면 한 프로그램에서 다른 프로그램으로 값이 옮겨 가지 않습니다.

+0

"두 옵션 중 무엇이 더 큰지는 주로 셰이더의 기능에 달려 있습니다."- 작업은 간단합니다 - 효과없이 텍스쳐로 렌더링합니다 (일부는 셰이더 효과가 있어야 함). –

+0

일부는 매우 간단하고 일부는 효과가있는 경우 텍스처 만있는 간단한 쉐이더 (openg gl 2.x 이상을 가정)와 효과 클래스 당 하나를 사용합니다. 그러나 실제로 더 많이 알지 못하면 판단하기가 어렵습니다. 아마도 큰 그림에서는별로 중요하지 않을 것입니다. 성능에 문제가없고 그것이 상태 변경으로 인한 것이 아니라면 더 편리하게 작업하십시오. – haffax

+1

유니폼 버퍼 개체를 사용하여 프로그램간에 유니폼을 공유 할 수 있습니다 (예 : [Shared Uniforms] (http://arcsynthesis.org/gltut/Positioning/Tut07%20Shared%20Uniforms.html) 참조). – stativ