在顶点着色器中移动顶点

时间:2012-05-09 20:57:03

标签: opengl 3d directx vertex-shader procedural-generation

我的代码创建了许多顶点的网格,然后在顶点着色器中用高度随机噪声值替换它们。四处走动

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绘制正常场景,所以如果我在不停止的情况下移动它会闪烁。我可以停留在它保持黑色的地方,或者在它保持正常的地方。

2 个答案:

答案 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