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绘制正常场景,因此如果我在不停止的情况下移动它会闪烁.我可以在它保持黑色的地方停留,或者在它保持正常的地方停留.
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)
| 归档时间: |
|
| 查看次数: |
4235 次 |
| 最近记录: |