我的代码创建了许多顶点的网格,然后在顶点着色器中用高度随机噪声值替换它们。四处走动
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绘制正常场景,所以如果我在不停止的情况下移动它会闪烁。我可以停留在它保持黑色的地方,或者在它保持正常的地方。
答案 0 :(得分:5)
gl_Position = ftransform();
这就是你做错了。 ftransform
不会隐式地将gl_Vertex
作为参数。它完全按照它应该做的:完全执行顶点位置的转换,就好像这是固定功能管道一样。因此,它使用gl_Vertex
最初 的值。
您需要对此进行适当的转换:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
答案 1 :(得分: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