【问题标题】:OpenGL- move camera inside skyboxOpenGL-在天空盒内移动相机
【发布时间】:2017-04-11 07:20:58
【问题描述】:

我有一个天空盒,发现它不可能在里面移动(只能旋转,不能靠近里面的人左右,这不是缩放,它完全是移动),正如本教程中所写@ 987654321@。一旦我为相机启用平移,天空盒就变得相当丑陋,角落和所有边都可见,所以同时移动相机和移动天空盒的想法并不是很好。什么是合适的解决方案?我认为这是一个相当明显的问题,但我在任何地方都找不到任何解决方案。或者我可能需要使用其他结构,而不是天空盒。

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

【问题讨论】:

  • 这里很多事情都可能出错。至少没有看到屏幕截图就很难提供帮助。
  • @jimvonmoon,我已经下载了图片,有点代码本身比较大,和教程基本一样
  • 在天空盒中四处走动,有点违背天空盒的整体目的。关于教程,这也是预期的行为。
  • @Vallentin,那么当我想左右、前后移动相机时,天空盒不会应用于任务?用相机移动天空盒不是合适的解决方案吗(我没有设法让它工作)?
  • 我不确定您在说什么以及实际的问题是什么。天空盒不动不会改变任何东西。因为相机也没有移动,所以从技术上讲,是世界其他地方在移动。

标签: opengl graphics camera skybox


【解决方案1】:

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

所以问题是,根据主循环中的教程,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);
...

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

【讨论】:

  • 您能解释一下为什么不能重用视图矩阵吗?视图矩阵不应依赖于着色器,因此除非 OP 在调用 GetViewMatrixSetMat4 之间更改了它的值,否则我认为这没有问题。
猜你喜欢
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2020-02-29
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多