- 유니폼
- 애플리케이션이 직접 쉐이더 스테이지로 데이터를 전달하는 방법
- 디폴트 블록 유니폼
- 위치, 텍스처 좌표 등 버텍스별로 필요한 데이터가 아닌,
전체 프리미티브 배치를 렌더링하는 동안 또는 그 후에도 변하지 않는 데이터를 쉐이더에 전달하는 방법 (ex. 변환행렬) - 유니폼은 어떤 쉐이더 스테이지에도 들어갈수있다.
- Example
- uniform float fTime;
uniform int iIndex; - 항상 상수로 간주. 선언시에 디폴드 값 초기화 외에는 쉐이더 내에서 변경 불가능.
- 동일한 유니폼을 여러 쉐이더 스테이지에 선언한다면, 각각의 스테이지는 동일한 유니폼값을 가진다.
- Example
- layout (location = 17) uniform vec4 myUniform;
- 위치 17에 할당됨
- 설정하지 않을 시에 OpenGL이 자동으로 설정
- glGetUniformLocation
- uniform 변수에 어떤 위치가 할당되었는지 확인
GLint glGetUniformLocation(GLuint program, const GLchar *name );- Example
- GLint loc = glGetUniformLocation(myProgram, "vColor");
- 유니폼 이름이 프로그램에 없는 경우 -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 );- Example
- glUseProgram(myShader);
glUniform1f(locTime, 12.3f);
glUniform1i(locFlag, GL_TRUE);
glUniform4f(locColor, 0.0f, 1.0f, 0.0f, 1.0f); - 배열
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 );- Example
- GLfloat vColors[2][4] = {{1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f}};
glUniform4fv(locColor, 2, vColors); - 행렬
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 );- count: 포인터 인자 value가 가리키는 행렬 개수
- transpose: GL_FALSE(열 우선, 기본), GL_TRUE(행 우선)
댓글 없음:
댓글 쓰기