2016-10-02 7 views
1

Betrachten Sie die folgende Vertex-Shader:Übersetzungen gelten nicht für All Points

attribute vec4 a_Position; 
uniform mat4 u_ModelMatrix; 
void main() { 
    gl_Position = u_ModelMatrix * a_Position; 
    gl_PointSize = 3.0; 
} 

In meinem Javascript-Programm manipulieren ich die u_ModelMatrix eine Rotation und Translation zu haben. Das funktioniert auf einem Dreieck, das ich zeichne. Aber ich merkte, dass, wenn ich ein zweites Objekt mit einem eigenen Eckpunktpufferspeicher Objekt zeichnen:

var vertexBuffer = gl.createBuffer(); 
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 
gl.bufferData(gl.ARRAY_BUFFER, point, gl.STATIC_DRAW); 
gl.uniform4f(u_FragColor, 1,1,0,1); 
gl.drawArrays(gl.POINTS, 0, 1); 

Dann wird die Übersetzungen und Drehungen gelten nicht für dieses Objekt. Ich dachte, es wäre seit gl_Position im GLSL-Programm die Punkte multipliziert mit der Matrix. Dies ist, was ich gerne geschehen würde, aber ich bin nur neugierig, warum ist das der Fall?

+1

Vielleicht ist es nur zur Veranschaulichung, aber wenn nicht, dann ist die Tatsache, dass die Puffer-Erstellung und der 'drawArrays'-Aufruf zusammen erscheinen, zumindest verdächtig. Ändern Sie das Programm zwischen dem ersten und zweiten Objekt? – Marco13

Antwort

1

Puffer werden an Scheitelpunktattribute gebunden, wenn Sie gl.vertexAttribPointer aufrufen. Welcher Puffer beim Aufruf gl.vertexAttribPointer an gl.ARRAY_BUFFER gebunden war, ist jetzt an dieses Attribut gebunden. Oben erstellen Sie einen neuen Puffer, aber da kein Aufruf an gl.vertexAttribPointer ist, zeigt Ihr Attribut immer noch auf den Puffer, den Sie zuvor angehängt haben.

Ob Sie den Inhalt des vorherigen bereits vorhandenen Puffers ersetzen oder einen neuen Puffer erstellen möchten, bleibt Ihnen überlassen.

+0

Danke. Was also, wenn ich eine andere Transformation für das andere Objekt durchführen wollte? – foobar5512

+0

Ist das hilfreich? http://stackoverflow.com/a/20850791/128511 – gman