【发布时间】:2015-05-19 09:46:44
【问题描述】:
我目前正在处理 OpenGL 行星渲染。我正在使用 Tessellation 管道。到目前为止,除了一个问题外,事情进展顺利。这是我多年来一直在努力的阶段,感觉好像没有进展。
首先here is a gif 我正在处理的事情。本质上,我的问题是,每当移动鼠标时,行星都会旋转,就好像它“看着”相机指向的位置一样。
有一些图形问题,但它们是由于我只是在整个立方体贴图上重复相同的高度图。由于两边不匹配,所以接缝清晰。
下面是我的评估着色器:
void main(void) {
vec4 p0 = gl_in[0].gl_Position;
vec4 p1 = gl_in[1].gl_Position;
vec4 p2 = gl_in[2].gl_Position;
vec3 p = gl_TessCoord.xyz;
Normal_FS_in = mat3(transpose(inverse((MV)))) * (p0*p.x + (p1*p.y) + p2*p.z).xyz;
float displacment = texture(tex1, Normal_FS_in).r * 800;
gl_Position = MVP*(p0*p.x + (p1*p.y) + p2*p.z) + (vec4(vec3(displacment,displacment,0) * normalize(Normal_FS_in),1));
}
它非常简单。着色器计算输出顶点的法线。然后使用它从高度图(立方体贴图)中获取位移值。然后计算 GL_Position。我一直在努力解决的问题是我的问题是出在着色器还是在包的其余部分。
我的尝试主要是在修补。我已经将所有法线相关的东西移到了评估着色器中,而不是在顶点着色器中计算它并将它们传递给控制和评估着色器。
该问题仅在鼠标移动时出现。
任何建议都会很棒 - 希望我所需要的只是指向正确的方向。
编辑 - 对模型视图矩阵或视图矩阵进行逆转置会产生 gif 中的结果。当相机移动时,使用模型矩阵会导致法线失真,从而导致地形在该地点周围弯曲。
【问题讨论】:
-
您知道,您可能在gamedev.stackexchange.com 中得到更好的答案。不过这里也有话题。
-
感谢您的建议 - 我在那边试一试。
-
如果您决定在那里发帖,请阅读meta.stackexchange.com/questions/64068/…。另外:
(p0*p.x + (p1*p.y) + p2*p.z).xyz这看起来很时髦...您是否要插入镶嵌顶点的位置?因为我不确定这是否能达到你想要的效果。 -
是的,这就是目标。根据我所看到的,它似乎做得正确。在没有应用位移的情况下使用它会导致球体被绘制而没有任何问题。也感谢你的链接,我记下了。
-
(vec4(vec3(displacment,displacment,0) * normalize(Normal_FS_in),1))在我看来也很奇怪...我很可能是错的,但不应该是normalize(Normal_FS_in) * displacement,因为您似乎正在世界空间中进行置换?此外,如果您在正常空间中进行位移,则应在添加位置和位移向量后乘以投影矩阵。
标签: c++ opengl glsl glfw opengl-4