2

ゲームDiabloのように、自分の世界を切り離すVBOがあります。以前は頂点データ自体をワールド内の正確な位置に設定していましたが、位置が大きくなるにつれて、浮動小数点の計算エラーも大きくなりました。

頂点データが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)であるため、水が分離されます。

ワールド内の頂点の実際の位置を取得するために、シェーダーで行う必要があることはありますか?

4

1 に答える 1

1

ユニフォームとして世界のポジションを通過します。

于 2012-04-04T05:20:17.820 に答える