2014-05-15 2 views
2

OpenGL ES 2를 배우기 위해 iOS의 OpenGL ES 2 프로젝트에서 작업 중입니다. 온라인 쉐이더를 링크 및 컴파일하기위한 Objective-C 구현을 발견했으며,이 구현을 자체적으로 템플릿으로 사용했습니다 . 불행히도 glUniform1i 대신 glUniform1f로 텍스처 데이터를 업로드하는 라인을 잘못 입력했습니다. ...이처럼 보였다glUniform1f와 glUniform1i 혼란

glActiveTexture(GL_TEXTURE1);     
glBindTexture(GL_TEXTURE_2D, self.texture); 
glUniform1f(_texUniform, 1);  // this line should be glUniform1i 

내 프로젝트는 자신의 텍스처 여러 개체가 있습니다. 이 오타 때문에 모든 개체에 마지막으로 그려진 개체의 텍스처 만 표시됩니다. 나는 무언가가 내 텍스처 ID 나 그와 비슷한 것으로 의심되어서 그리기 호출마다 텍스쳐 ID 등을 로그 아웃했다. 그런 식으로 잘못된 것을 찾지 못했다.

이것은 정말 어려운 버그였습니다.이 버그로 어떤 일이 벌어지고 있는지 이해하고 싶습니다. 내 질문은이 동작을 일으킬 glUniform1f 대 glUniform1i 무엇입니까? 셰이더가 연결 및 컴파일에 실패하지 않았거나 텍스처가 전혀 그려지지 않았다는 사실에 조금 놀랐습니다.

답변

4

Uniformas는 (프로그램별로) OpenGL 상태입니다. 균일 한 값을 설정하는 방법은 쉐이더를 프로그램 오브젝트에 연결하는 것과는 완전히 독립적입니다. GL은 쉐이더 링크 시간에 대해서는 아무 것도 모릅니다.이 프로그램은 많은 액티브 유니폼을 가지고 있으며 원하는대로 설정할 수 있습니다 시각.

유니폼에는 항상 유형이 있습니다. 그리고 유니폼 변수의 유형과 일치하는 올바른 glUniform*() 함수를 사용해야합니다. 그렇지 않으면 GL 오류 GL_INVALID_OPERATION이 생성됩니다 (그리고 그 작업은 더 이상 효과가 없습니다). 샘플러 유니폼의 경우, 텍스처 유닛의 인덱스를 정수로 설정해야합니다. 이 올바른 함수이고, 은 인데, 인 경우 작동하지 않습니다. 유니폼을 설정하지 않았으므로 그 유니폼의 이전 값이 사용됩니다. 설정하지 않으면 0이됩니다.

그런데 무슨 일이 일어 났는지는 텍스처 유닛 GL_TEXTURE0에 바인딩 된 텍스처에서 샘플링 한 것이지 원하는 것이 아닙니다. 텍스쳐를 만들 때 그 텍스쳐 유닛을 사용할 수 있습니다. 이것은 여전히 ​​"마지막"텍스쳐가 묶여 있음을 설명합니다.

+0

감사합니다. 지금은 이해가됩니다. – dloranz