我的代码创建了一个包含许多顶点的网格,然后将它们替换为顶点着色器中高度的随机噪声值。移动使用
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 绘制正常场景,所以如果我不停地移动它会闪烁。我可以停在它保持黑色的地方,或者在它保持正常的地方。