尽管这个问题已经存在几年了,但这个问题的解决方案是你必须在你为天空盒“使用”你的着色器之后设置视图矩阵。您不能只在循环中设置一次视图矩阵并期望使用所有具有统一视图的着色器。
所以问题是OP根据主循环中的教程有类似的东西:
glm::mat4 view = mCamera.GetViewMatrix();
glDepthFunc(GL_LEQUAL);
mSkyboxShader.Use();
mSkyboxShader.SetMat4("view", view);
mSkyboxShader.SetMat4("projection", projection);
mSkybox.Render(mSkyboxTexture);
glDepthFunc(GL_LESS);
无论代码如何,这都会将您的天空盒视为您可以移动到的任何其他对象。解决方案是:
glm::mat4 view = mCamera.GetViewMatrix();
glDepthFunc(GL_LEQUAL);
mSkyboxShader.Use();
view = mCamera.GetViewMatrix(); <----Solution
mSkyboxShader.SetMat4("view", view);
...
您必须在激活着色器后更新视图,然后再将其应用于需要视图矩阵的每个着色器程序的统一。