2012-04-04 6 views
0

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?

+0

"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. –

+0

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

Antwort

2

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.

Verwandte Themen