OpenGL-在天空盒内移动相机

时间:2017-04-11 07:20:59

标签: opengl graphics camera skybox

我有一个天空盒,发现它不可能在里面移动(只是旋转,不能靠近里面的人移动,这不是缩放,它正是移动),正如本教程中所写{ {3}}。一旦我为相机启用翻译,天空盒变得相当丑陋,角落和所有侧面都可见,所以移动相机并同时移动天空盒的想法并不是很好。什么是合适的解决方案?我认为这是一个相当明显的问题,但我无法在任何地方找到任何解决方案。或者我可能需要使用另一种结构,而不是天空盒。https://learnopengl.com/#!Advanced-OpenGL/Cubemaps

enter image description here

这里有两种状态 - 第一种是在启用翻译时获得的状态。我想在第二张图片中靠近山脉。

1 个答案:

答案 0 :(得分:0)

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

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

在激活着色器之前,必须先更新视图,然后才能将其应用于需要视图矩阵的每个着色器程序的制服。