2014-07-17 1 views
0

균일 한 버퍼 객체를 사용하여 다른 쉐이더 (예 : 고체 객체의 지연 전달 및 투명 객체의 지연 전달)에서 투영 매트릭스를 공유하려고합니다. 나중에 복잡성이 커지면 UBO에 더 많은 데이터를 추가 할 것입니다.OpenGL - glLinkProgram 이전 또는 이후의 glUniformBlockBinding?

명시 적으로 glLinkProgram()를 호출하기 전에 호출 glUniformBlockBinding()를 균일 한 블록의 바인딩을 제어하려면 : 내 문제는 레드 북 (Red Book) 말한다는 것이다.

그러나 online documentation 말한다 :

프로그램 객체 연결되거나 연동 다시

, 활성 균일 블록들 각각에 할당되는 균일 버퍼 개체 결속 점은 제로로 리셋된다.

무엇이 누락 되었습니까? 연결 후 또는 후에 유니폼 블록을 바인딩해야합니까?

감사합니다.

답변

2

glUniformBlockBinding​에는이 특정 프로그램에서 블록을 찾을 수있는 프로그램 이름과 색인이 필요합니다.

void glUniformBlockBinding​(GLuint program​, GLuint uniformBlockIndex​, GLuint uniformBlockBinding​); 

uniformBlockIndex​glGetUniformBlockIndex 프로그램을 호출하여 얻을 수있다. 이 필요는 없습니다 있지만

프로그램이 명령 glLinkProgram 과거에 부름을 받았다해야하는 프로그램 오브젝트의 이름이어야합니다 다음 API (http://www.opengl.org/wiki/GLAPI/glGetUniformBlockIndex)에서

GLuint glGetUniformBlockIndex​(GLuint program​, const char *uniformBlockName​); 

glLinkProgram이 성공해야합니다. 활성 유니폼 수가 한계를 초과했기 때문에 링크가 실패했을 수 있습니다.

그래서 올바른 순서는 다음과 같습니다

void glLinkProgram(GLuint program​); 
GLuint glGetUniformBlockIndex​(GLuint program​, const char *uniformBlockName​); 
void glUniformBlockBinding​(GLuint program​, GLuint uniformBlockIndex​, GLuint uniformBlockBinding​); 
+0

그래서 나는 독특한 UBO를 작성하고 여러 쉐이더에서 사용하려는 가정 해 봅시다. 'glGetUniformBlockIndex'를 사용하여 각 블록 인덱스를 검색하고, 그 중 하나의 레이아웃을 사용하여'glBufferData'를 채워야합니다 ('shared'로 표시하면 같아야합니다) glUniformBlockBinding'을 호출하고 마지막으로 각 블록 인덱스에 대해 'glBindBufferBase'를 호출하여 모든 바인딩 포인터를 가리 킵니다. 그 맞습니까? –

+0

거의. 'glBindbufferBase'는 바인딩 포인트를'GL_UNIFORM_BUFFER'에 매핑하기 때문에 모든 blockIndex에 대해 바인딩 포인트를 매핑 할 필요가 없습니다. 여기 예제를 참조하십시오. http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/3490-2/ – dari

+0

대단히 감사합니다. 이제 모든 것이 명확 해집니다. –

관련 문제