2012-04-04 6 views
2

Ich habe VBOs, um meine Welt zu trennen, wie im Spiel Diablo. Ich stellte die Eckendaten selbst auf die exakte Position innerhalb der Welt ein, aber mit zunehmender Position nahmen auch die Gleitkomma-Rechenfehler zu.VBO und glTranslatef macht gl_vertex in GLSL Shader muss mit etwas multipliziert werden?

Ich habe es jetzt so geändert, dass die Scheitelpunktdaten relativ zu 0,0,0 sind, und ich benutze glTranslatef, um jeden VBO an die richtige Stelle um den Player herum zu setzen.

glPushMatrix(); 
glTranslatef(m_X, m_Y, m_Z); 
draw VBO 
glPopMatrix(); 

Das macht es so, dass die X- und Z-Spielerpositionen sind immer im Bereich von 0 bis 512 (die physische Größe von 1 VBO) und wie sie es verlassen, verschiebt sich die Welt in die andere Richtung. Dies funktioniert gut und behebt die Gleitkommafehler, führte jedoch zu einem neuen Fehler.

In meinem Shader erzeuge ich einen Wasser-waving-ähnlichen Effekt, indem ich die cos/sin der X- und Z-Positionen des Scheitelpunkts multipliziert mit der Zeitvariablen nehme und die Y-Position mit ihnen verändere. Diese

uniform float timeVar; 
... 
vec4 v = vec4(gl_Vertex); 
v.y += (sin(v.x+timeVar*2)+cos(v.z+timeVar))*2-5; 
... 
gl_Position = gl_ModelViewProjectionMatrix * v; 

war zu arbeiten, wenn die Scheitelpositionen genau waren, aber jetzt vermute ich, sie liegen im Bereich von 0 bis 512, wie das ist, was sie alle gesetzt sind, bevor ich glTranslatef sie zu ihren tatsächlichen Positionen. Dies lässt die Wellen immer noch erscheinen, aber jetzt an den Rändern der VBOs ist das Wasser getrennt seit dem cos (0)! = Cos (512).

Gibt es etwas, was ich im Shader tun muss, um die tatsächliche Position des Scheitelpunkts in der Welt zu erhalten?

Antwort

1

Übergeben Sie in der Weltposition als eine Uniform.

+0

Arbeiten wie vorher! Vielen Dank. – Nyatra