2012-04-04 3 views
2

私はゲームのディアブロのような、私の世界を切り開くVBOを持っています。私は頂点データ自体を世界の正確な位置に設定していましたが、位置が大きくなるにつれて浮動小数点数学の誤差も大きくなりました。VBLとglTranslatefはGLSLシェーダのgl_vertexを何かに乗算する必要がありますか?

頂点データが0,0,0を基準にしてglTranslatefを使用して、各VBOをプレーヤーの正しい場所に設定するように変更しました。

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

プレイヤーのXとZ位置が範囲0から512まで(1 VBOの物理的な大きさ)の中に常にあるように、これはそれを作り、彼らはそれを残して、世界は逆の道をシフトします。これはうまく動作し、浮動小数点エラーを修正しますが、新しいエラーが発生しました。

私のシェイダーでは、頂点のXとZ位置のcos/sinを時間変数で掛けてYの位置を変更することで、水のような効果を作り出します。

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; 

頂点位置が正確だったとき、これは働いていたが、今私はそれは私が彼らの実際の位置にそれらをglTranslatef前に、それらがすべてに設定されているものであるとして、彼らは、範囲0から512の範囲内にあると思います。これにより波はまだ現れますが、今度はVBOの端で、水はcos(0)!= cos(512)以来分離されています。

世界の頂点の実際の位置を得るためにシェーダで何かする必要がありますか?

答えて

1

ユニフォームとして世界の位置を通過します。

+0

前と同じように動作します!どうもありがとうございました。 – Nyatra

関連する問題