2

私のコードは、多数の頂点のグリッドを作成し、頂点シェーダーの高さのランダムなノイズ値によってそれらを置き換えます。を使用して移動

glTranslated(-camera.x, -camera.y, -camera.z);

正常に動作しますが、それはグリッドの端まで行くことができることを意味します。

カメラの位置をシェーダーに送信し、ディスプレイスメント全体をシェーダーでオフセットすることを考えました。したがって、最終的な頂点シェーダーコードは次のとおりです。

uniform vec3 camera_position;
varying vec4 position;

void main()
{
    vec3 tmp;
    tmp = gl_Vertex.xyz;
    tmp -= camera_position;
    gl_Vertex.y = snoise(tmp.xz / NOISE_FREQUENCY) * NOISE_SCALING;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    position = gl_Position;
}

編集:欠陥を修正しました。頂点自体が水平方向に移動しないようにする必要があります。

どういうわけか、これを実行してカメラの位置を変更すると、画面がちらつきますが、何も動きません。頂点はノイズ値によって正しく変位し、カラーリングとすべてが機能しますが、変位は移動しません。

参考までに、ここにgitリポジトリがあります:https ://github.com/Orpheon/Synthworld

私は何が間違っているのですか?

PS:「フリック」は間違っています。何も描かない位置もあれば、0位から通常のシーンを描く位置もあるので、止めずに動かすとちらつきます。でも、黒のままの場所、または正常な場所で停止できます。

4

2 に答える 2

5
gl_Position = ftransform();

それはあなたが間違っていることです。暗黙的にパラメータとしてftransform取りません。gl_Vertex本来の目的を正確に実行します。これが固定機能パイプラインであるかのように、頂点位置の変換を実行します。したがって、最初gl_Vertexに持っていた値を使用します。

これに対して適切な変換を行う必要があります。

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
于 2012-05-09T21:04:19.107 に答える
1

glUniform3fvを使用して、このバグを修正することができました。

main.c exterp:

// Sync the camera position variable
GLint camera_pos_ptr;
float f[] = {camera.x, camera.y, camera.z};
camera_pos_ptr = glGetUniformLocation(shader_program, "camera_position");
glUniform3fv(camera_pos_ptr, 1, f);

// draw the display list
glCallList(grid);

バーテックスシェーダー:

uniform vec3 camera_position;
varying vec4 position;

void main()
{
    vec4 newpos;
    newpos = gl_Vertex;
    newpos.y = (snoise( (newpos.xz + camera_position.xz) / NOISE_FREQUENCY ) * NOISE_SCALING) - camera_position.y;
    gl_Position = gl_ModelViewProjectionMatrix * newpos;
    position = gl_Position;
}

誰かが完全なコードを見たい場合は、ここに再びgitリポジトリがあります:https ://github.com/Orpheon/Synthworld

于 2012-05-17T08:55:00.597 に答える