사용하여 균일 한 버퍼 (즉 일정한 버퍼 D3D의 용어에서 참조).
모든 셰이더가 이러한 각 버퍼의 레이아웃과 바인딩 포인트에 동의하는 한 업데이트는 산들 바람이됩니다. 모델은 쉐이더에 대해 전혀 알 필요가 없습니다. 상수 버퍼에서 모델 뷰 행렬 만 업데이트하면 렌더링 파이프 라인에서 자동으로 사용합니다.
최소한 두 가지 버퍼가 있어야한다고 주장합니다. 첫 번째는 투영 행렬, 카메라 행렬, 연결된 카메라 투영 행렬, 뷰포트 정보, 절두체 세부 정보 및 행렬 역수를 저장해야합니다. 이 버퍼는 장면 당 한 번만 업데이트하면됩니다.
그런 다음 각 모델에 모델 뷰 행렬, 일반 행렬, 역수 및 재료 특성을 저장하는 다른 버퍼를 제공하십시오. 이것은 각 모델에 대해 한 번 업데이트되며 다른 업데이트 단계에서 수행 할 수 있습니다 (해당하는 경우). 여러 객체간에 재료를 공유 할 수있는 경우 재료 정보를 세 번째 재료 별 버퍼로 이동할 수 있습니다.
포워드 셰이딩 설정에서는 모든 라이트를 다른 버퍼에 넣는 것이 의미가 있으며, 디퍼 드 셰이딩의 경우 라이트 패스에 대한 라이트 별 버퍼를 사용하는 것이 좋습니다. 지오메트리 패스).
균일 한 버퍼를 사용하려면 (3.1 또는 확장, 일부는 오래되었지만 아직 서비스중인 랩톱을 제외하고는 오늘날 충분히 일반적) GL을 적당히 최신 버전의 GL이 필요하며 최신 버전이 필요합니다. 쉐이더 코드 내부에서 특정 바인딩 위치에 균일 한 버퍼를 바인딩 할 수 있음 (4.2; 여전히 드물지만 더 나아지고 있음) 그렇지 않으면 CPU 측 코드에서 더 많은 작업을 수행하여 설정해야합니다 (CPU 코드가 올바른 바인딩을 알아야 함) 어쨌든 그것은 심각한 문제보다 API 냄새가 더 큽니다). OpenGL | ES는 불행히도 가장 인기있는 모바일 플랫폼에서 여전히 지원되지 않는 3.0까지 균일 한 버퍼를 추가하지 않았습니다.
버퍼가 옵션이 아닌 경우 활성 셰이더의 인덱스 위치를 저장하기위한 전역 위치가 필요합니다. 당신은 사용할 수 있습니다 glGetUniformLocation
(같은 잘 알려진 이름에 대한 인덱스 찾기 위해 쉐이더를로드 한 후 ModelViewMatrix
다음이 인덱스를 저장하거나 등). 렌더는 래퍼 함수에 MODEL_VIEW
전달 된 것과 같은 열거 형 값을 매핑 SetUniform
하여 바운드 셰이더를보고 인덱스를 찾은 다음 glUniform
올바르게 호출 할 수 있습니다. 모든 유니폼을 멋지게 정리하면 개별 유니폼을 개별적으로 설정 해야하는 것 이외의 버퍼에서 클라이언트 코드 사용이 크게 변경되지는 않습니다.
GLSL 인터페이스 블록 및 균일 버퍼 객체를 참조하십시오 .