[OpenGL] 고급 셰이더 응용프로그램 통합 버퍼 객체(Uniform Buffer Object)
4070 단어 opengl
통합 버퍼 객체(Uniform Buffer Object)
이점:
Example:
셰이더 코드는 다음과 같습니다.
uniform TransformBlock
{
float scale;
vec3 translation;
float rotation[3];
mat4 projection_matrix; //
} Transform;
Uniform 이름은 Transform Block, 인스턴스는 Transform
통합 블록 유형 구축:
일반적으로 glBufferData/glMapBuffer 버퍼 객체를 사용하여 데이터를 채웁니다.데이터가 버퍼에 저장되는 방식에는 일반적으로 두 가지가 있습니다.
1. 공유 레이아웃(Shared layout) - 버퍼의 데이터는 OpenGL이 실행 성능과 착색기 접근이 가장 좋은 방식에 따라 버퍼의 위치를 결정합니다. -OpenGL이 버퍼에 데이터를 배열할 때, 이 배열은 같은 통일된 블록 성명을 공유하는 여러 프로그램과 착색기 사이에서 같다.기본 레이아웃입니다.이런 방식은 프로그램 개발자에게 위치 편이량 등을 처리해야 하기 때문에 비교적 번거롭다. 여기서는 생략한다.
2. 표준 레이아웃(Standard Layout) - 버퍼의 데이터는 OpenGL에서 제공하는 여러 데이터에 대한 크기와 배열 규칙에 따라 버퍼의 위치를 결정합니다. - 레이아웃 한정자 std140 버퍼의 위치를 사용해야 합니다. 버퍼에서 N 바이트를 차지하는 유형은 이 버퍼의 N 바이트의 경계에서 시작합니다.GLSL은 다음과 같습니다.
layout(std140) uniform TransformBlock
{
float scale;
vec3 translation;
float rotation[3];
mat4 projection_matrix;
} transform;
표준 레이아웃 단계
표준 레이아웃은 실제적으로 두 단계로 나뉜다. - 통일 블록 분배 귀속점 GLuint glGet Uniform Block Index(GLuint program,const GLChar* uniform BlockName).지정한 통일 블록의 인덱스 - 버퍼를 귀속점에 귀속시켜 통일 블록과 일치시킵니다.void glUniformBlockBinding(GLuint program, GLuint unifromBlockIndex, GLuint uniformBlockBinding); uniformBlockBinding은 블록 귀속점을 통일하는 색인을 가리킨다
예:
서로 다른 버퍼 객체가 서로 다른 균일 값 GLSL Shader 코드를 바인딩합니다.
layout(std140) uniform Harry
{
float a;
mat4 b;
};
layout(std140) uniform Bob
{
int c;
ivec4 d;
};
layout(std140) uniform Suan
{
mat4 e[10];
};
서로 다른 버퍼 객체는 서로 다른 균일 값 C++ 코드를 바인딩합니다.
// glGetUniformBlockIndex
GLuint harry_index = glGetUniformBlockIndex(program, "Harry");
GLuint bob_index = glGetUniformBlockIndex(program, "Bob");
GLuint susan_index = glGetUniformBlockIndex(program, "Susan");
//
glUniformBlockBinding(program, harry_index, 1);
glUniformBlockBinding(program, bob_index, 3);
glUniformBlockBinding(program, susan_index, 0);
//
glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer_b);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, buffer_c);
glBindBufferBase(GL_UNIFORM_BUFFER, 3, buffer_a);
장점
표준적인 약속을 통해 모든 프로그램에 귀속을 설정할 수 있으며, 프로그램을 전환할 때에도 버퍼를 귀속시킬 수 있습니다.
예를 들어 투영 매트릭스, 뷰포트 크기 등 상대적으로 고정된 파라미터가 프로그램과 관련이 없는 파라미터가 있는데 우리는 이 정보를 귀속점 0에 귀속시킬 수 있다.그리고 모든 프로그램은 고정 상태에서 0으로 연결되어 있으며 b는glUse Program 전환 프로그램을 사용해도 버퍼에 저장되어 사용됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
3D 게임 엔진 학습 2 (HelloWorld 소스 분석)프로젝트 구조 box에서.gpb 마운트 장면 장면 카메라의 화면 비율 설정 마운트된 장면에서 방향광 노드 발견 라이트 객체 확보 불러오는 장면에서box라는 모델 노드 가져오기 노드 모델 대상 획득 설정 모형의 재질은...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.