我目前正在处理OpenGL行星渲染。我正在使用曲面细分管道。到目前为止,除了一个问题之外,事情进展顺利。在我多年来一直在敲打它的阶段,感觉没有进步。
首先,这是我正在处理的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 中生成结果。使用模型矩阵会导致照相机移动时法线失真,从而使地形围绕该位置弯曲。
可能是很多事情。以下是一些示例:1)你在着色器中搞砸了一些东西(忘记了逆变换或变换)2)你连接了错误的控件(鼠标左边做了一些奇怪的事情)。3)控制模型混乱(你移动目标而不是相机)。4)别的东西。5) 以上部分/全部。
尝试调试一下。如果完全禁用着色器,看起来还可以吗?只需绘制一个简单的立方体(可能比球体更容易跟踪)。
如果没问题,则添加着色器但不在其中执行任何操作,查看着色器中的转换是否合理(它仍然是立方体吗)。
这应该有助于缩小可能的原因。
问题是这样的:
gl_Position = MVP*(p0*p.x + (p1*p.y) + p2*p.z) + (vec4(vec3(dispeasement,dispeasement,0) * normalize(Normal_FS_in),1));
您投影一些位置,然后添加屏幕空间位移。如果不看到整个着色器,很难说到底出了什么问题。但是您可能错过了一些括号。
此外,您正在混合没有透视分割的投影矢量。
MVP*(p0*p.x + (p1*p.y) + p2*p.z)
此矢量的 w 部分不是 1,因此您的位移将根据相机位置进行缩放