[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은 블록 귀속점을 통일하는 색인을 가리킨다
  • 버퍼를 같은 귀속점에 귀속시켜 버퍼의 데이터를 통일된 블록에 전달한다.glBindBufferBase(GL_UNIFORM_BUFFER, index, buffer);//index 바인딩 포인트 인덱스, UniformBlockBinding;//GL_UNIFORM_버퍼는 하나의 버퍼를 통일된 버퍼의 귀속점에 귀속시킨다는 것을 표시합니다.

  • 예:
    서로 다른 버퍼 객체가 서로 다른 균일 값 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 전환 프로그램을 사용해도 버퍼에 저장되어 사용됩니다.

    좋은 웹페이지 즐겨찾기