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 外部:

// 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 回答