0

我有一个天空盒,发现它不可能在里面移动(只能旋转,而不是靠近里面的人,这不是缩放,它完全是移动),如本教程中所写https:// learnopengl.com/#!Advanced-OpenGL/Cubemaps。一旦我为相机启用平移,天空盒就变得相当难看,角落和所有边都可见,所以同时移动相机和移动天空盒的想法并不是很好。什么是合适的解决方案?我认为这是一个相当明显的问题,但我在任何地方都找不到任何解决方案。或者也许我需要使用另一种结构,而不是为此目的使用天空盒。在此处输入图像描述

在此处输入图像描述

这里有两种状态——启用翻译时我得到的第一种状态。我希望在第二张图片中更靠近山脉。

4

1 回答 1

0

尽管这个问题已经存在几年了,但这个问题的解决方案是你必须在你为天空盒“使用”你的着色器之后设置视图矩阵。您不能只在循环中设置一次视图矩阵并期望使用所有具有统一视图的着色器。

所以问题是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);
...

您必须在激活着色器后更新视图,然后再将其应用于需要视图矩阵的每个着色器程序的统一。

于 2017-12-08T10:27:18.910 回答