我将如何着手将天空盒应用于世界,openGL C++

How would I go about applying a skybox to the world, openGL C++

我正在尝试向 world/camera/game 添加天空盒,但我不知道该怎么做。如果有人可以指导我如何应用它,将不胜感激。

我已经加载了天空盒,我只是不知道如何正确绘制它以便它在移动时适合相机。

我设法制作了一种立方体的纹理,它可能靠近天空盒,但只能从外面看到。一旦进入立方体,就无法从内部看到它。也许如果我可以反转立方体的面,当我在立方体内部时它会显示,我可以把它变大?

从立方体外面看 从里面往外看

几周前我遇到了类似的问题,如果您正在寻找一些伪代码,我想我可能会有所帮助。首先,在渲染时使用立方体不是最好的主意,因为您的盒子看起来不自然,将其映射到球体以获得平滑效果。

  1. 围绕您的观察者创建一个相对于您的相机移动的边界球体

  2. 在那个球体上应用纹理,这会给人一种天空相对于你移动的印象

  3. 绘制时,禁用 z 缓冲区和视锥体(假设您正在使用任何剔除算法)这将允许绘制天空盒,但会确保在顶部绘制地形当深度排序算法由 OpenGL 执行时天空盒的。

注意:绘制天空盒后不要忘记重新启用z-buffer,否则你的地形元素会出现在球体之外,也就是说你只会看到天空框。

我最近在 DirectX 中编写了一个基本的地形引擎,但原理非常相似,如果您想查看 repo,可以 find it here

查看this file to see how the Skybox is rendered, then also visit the SkyBox implementation file to see how it is constructed, and the SkyShader implementation file中的第286行,看看纹理是如何映射到球体的,shader文件中主要需要关注的方法是SetShaderParameters()

关于相对于相机移动天空盒,只需将天空盒的 WVP 矩阵设置为相机的 WVP 矩阵,然后根据自己的喜好调整天空盒的 x、y、z 平面。

Extra 如果你要实现多人游戏方面,只需禁用球体的背面渲染,那么每个玩家都可以看到他们的天空盒,但对手不能。或者,您可以在世界各地创建一个大球体

希望对您有所帮助 - 如果您需要更多帮助,请直接询问,我知道这些东西起初可能相当密集:)