2018년 3월 27일 화요일

5.2.1 디폴트 블록 유니폼


  1. 유니폼
    1. 애플리케이션이 직접 쉐이더 스테이지로 데이터를 전달하는 방법
    2. 디폴트 블록 유니폼
      1. 위치, 텍스처 좌표 등 버텍스별로 필요한 데이터가 아닌,
        전체 프리미티브 배치를 렌더링하는 동안 또는 그 후에도 변하지 않는 데이터를 쉐이더에 전달하는 방법 (ex. 변환행렬)
      2. 유니폼은 어떤 쉐이더 스테이지에도 들어갈수있다.
      3. Example
        1. uniform float fTime;
          uniform int iIndex;
      4. 항상 상수로 간주. 선언시에 디폴드 값 초기화 외에는 쉐이더 내에서 변경 불가능.
      5. 동일한 유니폼을 여러 쉐이더 스테이지에 선언한다면, 각각의 스테이지는 동일한 유니폼값을 가진다.
      6. Example
        1. layout (location = 17) uniform vec4 myUniform;
          1. 위치 17에 할당됨
          2. 설정하지 않을 시에 OpenGL이 자동으로 설정
          3. glGetUniformLocation
            1. uniform 변수에 어떤 위치가 할당되었는지 확인
            2. GLint glGetUniformLocation(GLuint program,
               const GLchar *name);
            3. Example
              1. GLint loc = glGetUniformLocation(myProgram, "vColor");
            4. 유니폼 이름이 프로그램에 없는 경우 -1 리턴
              1. 쉐이더에서 해당 유니폼을 사용하지 않을 경우,
                컴파일시 사라질 수도 있다.
            5. 대소문자 유의
      7. 설정
        1. 스칼라 및 벡터
          1. void glUniform1f(GLint location,
             GLfloat v0);
             
            void glUniform2f(GLint location,
             GLfloat v0,
             GLfloat v1);
             
            void glUniform3f(GLint location,
             GLfloat v0,
             GLfloat v1,
             GLfloat v2);
             
            void glUniform4f(GLint location,
             GLfloat v0,
             GLfloat v1,
             GLfloat v2,
             GLfloat v3);
             
            void glUniform1i(GLint location,
             GLint v0);
             
            void glUniform2i(GLint location,
             GLint v0,
             GLint v1);
          2. Example
            1. glUseProgram(myShader);
              glUniform1f(locTime, 12.3f);
              glUniform1i(locFlag, GL_TRUE);
              glUniform4f(locColor, 0.0f, 1.0f, 0.0f, 1.0f);
        2. 배열
          1. void glUniform1fv(GLint location,
             GLsizei count,
             const GLfloat *value);
             
            void glUniform2fv(GLint location,
             GLsizei count,
             const GLfloat *value);
             
            void glUniform3fv(GLint location,
             GLsizei count,
             const GLfloat *value);
             
            void glUniform4fv(GLint location,
             GLsizei count,
             const GLfloat *value);
             
            void glUniform1iv(GLint location,
             GLsizei count,
             const GLint *value);
             
            void glUniform2iv(GLint location,
             GLsizei count,
             const GLint *value);
          2. Example
            1. GLfloat vColors[2][4] = {{1.0f, 1.0f, 1.0f, 1.0f,
                                                    1.0f, 1.0f, 1.0f, 1.0f}};
              glUniform4fv(locColor, 2, vColors);
        3. 행렬
          1. void glUniformMatrix2fv(GLint location,
             GLsizei count,
             GLboolean transpose,
             const GLfloat *value);
             
            void glUniformMatrix3fv(GLint location,
             GLsizei count,
             GLboolean transpose,
             const GLfloat *value);
             
            void glUniformMatrix4fv(GLint location,
             GLsizei count,
             GLboolean transpose,
             const GLfloat *value);
             
            void glUniformMatrix2x3fv(GLint location,
             GLsizei count,
             GLboolean transpose,
             const GLfloat *value);
             
            1. count: 포인터 인자 value가 가리키는 행렬 개수
            2. transpose: GL_FALSE(열 우선, 기본), GL_TRUE(행 우선)

댓글 없음:

댓글 쓰기