셰이더 프로그램을 변경할 때 유니폼이나 속성을 리 바인드해야합니까?


11

장면 렌더링에는 일반적으로 둘 이상의 쉐이더 프로그램이 필요합니다. 필자의 경우 모두 동일한 속성을 사용하고 적어도 일부 유니폼을 공유합니다. 그것들이 제대로 작동하게하기 위해, 나는 현재 안전하게 플레이합니다. 즉, 셰이더 프로그램간에 전환 할 때마다 속성을 리 바인드하고 적절한 균일 한 위치를 얻습니다. 따라서 기본적으로 모든 프레임에서 여러 번이 방법이 최선의 방법은 아닙니다.

그렇다면 셰이더 프로그램을 전환 한 후 속성과 유니폼을 리 바인드해야합니까 (일반적으로)? 그리고 왜?

그렇다면 프로그램을 시작할 때이 작업을 한 번만 수행하고 다시 만질 필요가 없습니까 (일관된 값 설정 제외)?

답변:


12

두 셰이더에서 위치가 동일하게 유지되는 한 속성을 리 바인드 할 필요는 없습니다. (일반적으로 layout(location = X)GLSL 에서 구문을 사용 하지만 glBindAttribLocation전자를 사용할 수없는 경우 에도 수행 할 수 있습니다.)

그러나 유니폼은 셰이더 오브젝트 상태의 일부이므로 모든 셰이더에 대해 한 번 이상 설정해야합니다. 이 비용을 최소화하는 한 가지 방법 은 모든 균일 값을 포함하고 단일 호출로 셰이더에 바인딩 할 수 있는 Uniform Buffer Object 를 사용하는 것입니다.


UBO 링크에서 : "마지막으로 서로 다른 프로그램간에 정보를 공유하는 데 사용할 수 있습니다. 따라서 단일 버퍼를 수정하면 여러 프로그램의 유니폼을 효과적으로 업데이트 할 수 있습니다."
Zouch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.