OpenGL-移动相机内的天空盒

问题描述:

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

enter image description here

这里有两种状态 - 第一个被启用时翻译我得到。我希望在第二个图像中靠近山脉。

+0

很多事情都可能出错。没有至少看到截图就很难提供帮助。 – jimvonmoon

+0

@jimvonmoon @jimvonmoon,我已经下载了图片,代码本身相当大,并且它大部分与教程 –

+0

一样,在天空盒中移动,会有点失败天空盒的整体目的。关于也是预期行为的教程。 – Vallentin

尽管这个问题已经过去几年了,但是对于这个问题的解决方案是,您必须设置视图矩阵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); 
... 

您必须将它应用到了需要一个视图矩阵中的每个着色器程序的统一前启动着色器后更新的视图。