OpenGL 개발 이슈 - glUniform

2020-02-17

preview 레퍼런스를 가까이할수록 몸에 이로운 것 같습니다

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을 상속받는 Phongdiffuse, normal, specular 텍스쳐를 사용합니다. 따라서 텍스쳐를 여러 개 바인딩하기 위해 glUniform1i 함수를 사용하고 있습니다. 하지만 이는 정상적으로 작동하지 않는데, 그 이유는 앞서 이야기한 것 처럼 glUseProgram(shader)를 호출하지 않았기 때문입니다.

결론

알고 본다면 당연히 문제가 되는 코드지만, 그 당시 저는 노말맵핑을 구현한 후에 렌더링이 정상적으로 되지 않아 (사실은 정상인) Tangent 공간으로의 변환 과정이나 TBN 행렬을 살펴보는 등 버그를 수정까지 많은 삽질이 있었습니다. 레퍼런스를 가까이하고 함수를 호출하기 전에 꼼꼼히 확인하는 과정이 필요함을 느꼈습니다.

유용한 링크

OpenGL-Refpages - glUniform