我目前正在研究 OpenGL 行星渲染。我正在使用镶嵌管道。到目前为止,除了一个问题外,一切进展顺利。在这个阶段,我多年来一直在努力解决这个问题,感觉进展没有发生。
首先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。我一直在努力解决的问题是我的问题出在着色器还是包的其余部分。
我的尝试主要是修补。我已将所有与法线相关的内容移动到评估着色器中,而不是在顶点着色器中对其进行计算并将它们传递给控制和评估着色器。
此问题仅在移动鼠标时出现。
任何建议都会很棒 - 希望我所需要的只是指出正确的方向。
编辑 - 对模型 View 矩阵或 View 矩阵进行逆转置会产生 gif 格式的结果。当相机移动时,使用模型矩阵会导致法线失真,这样地形就会围绕该位置弯曲。
最佳答案
这可能是很多事情。这里有些例子: 1)你搞砸了着色器中的东西(忘记了逆或变换) 2) 你错误地连接了控件(鼠标左键做了一些奇怪的事情)。 3)控制模型困惑(你移动目标而不是相机)。 4)别的。 5) 以上部分/全部。
尝试调试一下。如果完全禁用着色器,它看起来还好吗?只需绘制一个简单的立方体(可能比球体更容易追踪)。
如果没问题,再添加shader但不要在里面做任何事情,看shader中的transform是否合理(还是立方体)
这应该有助于缩小可能原因的范围。
关于c++ - OpenGL Planet Generation - 简单矩阵问题(Planet "Spins"With Mouse),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091058/