OpenGL 개발 이슈 - glUniform
레퍼런스를 가까이할수록 몸에 이로운 것 같습니다
glUniform
glUniform
은 Shader의 Uniform 변수나 배열에 값을 전달할 때 쓰입니다. 쓰는 데는 크게 어려움이 없지만 개발하면서 자주 실수했던 부분에 대해서 쓰려고 합니다. glUniform
관련 함수들은 모두 glUseProgram
과 함께 쓰여야 합니다. 사실 이는 OpenGL의 레퍼런스에도 나와 있고, 실제로 쓰일 때도 값을 전달해줄 Shader를 현재 State로 해야 하는 것이 당연하게 보입니다.
예시
Phong::Phong()
:uvScale(1, 1), uvOffset(0, 0)
{
shader = ShaderLoader::Load("Shaders/phong_vert.glsl", "Shaders/phong_frag.glsl");
diffuseTexture = glGetUniformLocation(shader, "diffuseTexture");
glUniform1i(diffuseTexture, 0);
normalTexture = glGetUniformLocation(shader, "normalTexture");
glUniform1i(normalTexture, 1);
specularTexture = glGetUniformLocation(shader, "specularTexture");
glUniform1i(specularTexture, 2);
}
위 코드는 제가 문제를 겪었던 코드입니다. Material
을 상속받는 Phong
은 diffuse
, normal
, specular
텍스쳐를 사용합니다. 따라서 텍스쳐를 여러 개 바인딩하기 위해 glUniform1i
함수를 사용하고 있습니다. 하지만 이는 정상적으로 작동하지 않는데, 그 이유는 앞서 이야기한 것 처럼 glUseProgram(shader)
를 호출하지 않았기 때문입니다.
결론
알고 본다면 당연히 문제가 되는 코드지만, 그 당시 저는 노말맵핑을 구현한 후에 렌더링이 정상적으로 되지 않아 (사실은 정상인) Tangent 공간으로의 변환 과정이나 TBN 행렬을 살펴보는 등 버그를 수정까지 많은 삽질이 있었습니다. 레퍼런스를 가까이하고 함수를 호출하기 전에 꼼꼼히 확인하는 과정이 필요함을 느꼈습니다.