Ein Uniform Block sieht bei OpenGL 3.1 (das entspricht GLSL 140) z.B. so aus:
layout(std140) uniform MVP {
mat4 p;
mat4 mv;
mat4 mvp;
};
Der Uniform Block wird über das UBO auf einen Buffer gemappt. Diesen Buffer füllst Du so, wie die Variablen im Block liegen, im Beispiel also (float[16] p, mv, mvp):
uboBuffer.put(p);
uboBuffer.put(mv);
uboBuffer.put(mvp);
Bei OpenGL 3.1 wird die Uniform Block Location wird über den Uniform Block Index hergestellt, etwa so:
final int uniformBlockIndexMVP = glGetUniformBlockIndex(program, "MVP");
glUniformBlockBinding(program, uniformBlockIndexMVP, UNIFORM_BLOCK_LOCATION_MVP);```
Neue Daten werden über das UBO so übertragen:
``` glBindBuffer(GL_UNIFORM_BUFFER, uboBufferHandle);
glBufferSubData(GL_UNIFORM_BUFFER, 0, uboBuffer);```
Und so wird das UBO an den Shader gebunden:
```glBindBufferRange(GL_UNIFORM_BUFFER, UNIFORM_BLOCK_LOCATION_MVP, uboBufferHandle, 0, uboBuffer.capacity() * 4);```
Vermutlich sind jetzt noch mehr fragen als vorher offen...
[QUOTE=mymaksimus;88370]Ist instancing zum beispiel bei einer Height map sinnvoll? Weil dort ist jedes Dreieck doch eigentlich das selbe objekt, nur mit einer anderen farbe, oder?[/QUOTE]
Nein, ein Dreieck ist zu wenig. Mögliche Beispiele wären Bäume, Player oder auch Würfel. Die Topologie des Meshs ist dabei immer gleich, unterscheiden kann sich z.B. Farbe, Textur, Position oder auch die Animationsphase.
Für eine Heightmap würde ich ein flaches Mesh als Triangle Strip anlegen und im Shader die jeweilige Höhe des Vertex anpassen.
[QUOTE=mymaksimus;88375]Ach und noch eine Frage: Ich hab jetzt n bissl über instancins gelesen. Okay, man zeichnet damit die selben Geometry Objects
mehrere male mit einem call. Also auch immer ein und das selbe vbo. Aber woher weiss mein Rechner jetzt an welcher Stelle jeder dieser Objects gemalt werden soll? :S
Blick da irgendwie nicht ganz durch :/[/QUOTE]
Du hast im Shader eine gl_InstanceID, das ist eine ID, die für jede Instance eindeutig ist. Zusätzlich überträgst Du ein Array von (Transformations-)Matrizen z.B. via UBO:
layout(std140) uniform MVP {
mat4 p;
mat4 v;
mat4 vp;
};
layout(std140) uniform Instance {
mat4 m[256];
};
layout(location = 0) in vec4 v;
void main() {
vec4 current = m[gl_InstanceID] * v;
gl_Position = vp * current;
}
Wenn ein UBO zu klein wird (mindestens 16KB), kann man die Matrizen auch als Textur übertragen. (Oder ab OpenGL 4.3 als [SSBO](https://www.opengl.org/wiki/Shader_Storage_Buffer_Object), die sind richtig fancy ;)).
Viele Grüße
Fancy