Ich beginne, indem ich an meinem Programm beide Shader anschließe und dann glGetUniformBlockIndex
anrufe, um die einheitlichen Puffer zu binden. Ich würde erwarten, dass eine glBindShader
Funktion mich angeben lässt, welchen Shader ich analysieren möchte, um die Uniform zu finden, aber es gibt keine solche Sache. Wie kann ich OpenGL sagen, in welchen Shader es schauen soll?Wie weiß glGetUriformBlockIndex, ob im Vertex-Shader oder im Fragment-Shader gesucht werden soll?
Antwort
Vorausgesetzt, das Programm wurde vollständig verknüpft, spielt es keine Rolle. Hier sind die Möglichkeiten für glGetUniformBlockIndex
und ihre Folgen:
- Der einheitliche Block Name ist nicht in einem der Shader. Dann kommst du zurück
GL_INVALID_INDEX
. - Der angegebene einheitliche Blockname wird in einem der Shader verwendet. Dann bekommst du den Blockindex dafür zurück, der mit
glUniformBlockBinding
verwendet werden soll. - Der angegebene einheitliche Blockname wird in mehreren Shadern verwendet. Dann erhalten Sie den Blockindex, der bedeutet, alle, mit
glUniformBlockBinding
verwendet werden.
Der letzte Teil ist der Schlüssel. Wenn Sie einen einheitlichen Block in zwei Shadern mit demselben Namen angeben, erfordert GLSL, dass die Definitionen dieser einheitlichen Blöcke identisch sind. Wenn nicht, erhalten Sie einen Fehler in glLinkProgram
. Da sie gleich sind (sonst wären Sie nicht hierher gekommen), betrachtet GLSL sie als gleichen einheitlichen Block.
Auch wenn sie in zwei Shaderstufen sind, sind sie immer noch der gleiche einheitliche Block. Sie können also gleichmäßige Blöcke zwischen den Stufen teilen, alle mit einer Blockbindung. Solange es wirklich der gleiche einheitliche Block ist.
"Ich fange an, indem ich meinem Programm beide Shader anschließe und dann glGetUniformBlockIndex aufruft, um die einheitlichen Puffer zu binden" Sie müssen einen erfolgreichen Aufruf von ['glLinkProgram'] haben (http://www.opengl.org/wiki/GLAPI/glLinkProgram) zwischen diesen Schritten. –
Ich habe gerade bestätigt, dass das 'glLinkProgram' zwischen der Kompilation der Shader und dem Aufrufen von' glGetUniformBlockIndex' ausgeführt wird. Und es gelingt. – qdii