在顶点着色器中移动顶点

Orp*_*eon 2 opengl directx 3d procedural-generation vertex-shader

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

glTranslated(-camera.x, -camera.y, -camera.z);
Run Code Online (Sandbox Code Playgroud)

工作正常,但这意味着你可以直到网格的边缘.

我想过将相机位置发送到着色器,并让整个位移被它偏移.因此最终的顶点着色器代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我修复了一个缺陷,顶点本身不应该水平移位.

但是出于某种原因,当我运行它并改变相机位置时,屏幕会闪烁,但没有任何动作.顶点被噪声值正确移位,着色和一切都有效,但位移不会移动.

作为参考,这里是git存储库:https://github.com/Orpheon/Synthworld

我究竟做错了什么?

PS:"闪烁"是错误的.这就好像在某些位置它不会绘制任何东西,而其他位置则从位置0绘制正常场景,因此如果我在不停止的情况下移动它会闪烁.我可以在它保持黑色的地方停留,或者在它保持正常的地方停留.

Nic*_*las 5

gl_Position = ftransform();
Run Code Online (Sandbox Code Playgroud)

那就是你做错了.ftransform不会隐含地将其gl_Vertex作为参数.它完全按照它应该做的:完全执行顶点位置的转换,就好像这是固定功能管道一样.因此,使用该值gl_Vertex已经开始.

您需要对此进行适当的转换:

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
Run Code Online (Sandbox Code Playgroud)

  • @Orpheon:没有"标准3D空间坐标". (2认同)