在球体上使用GPU渲染

3
我正在尝试编写一段优化的代码,使用OpenGL在球体上呈现3D场景,并在屏幕上显示展开后的球面地图,即生成一个纯粹反射球体的平面映射。数学上来说,我想生成一个投影地图,其中x轴是极角,y轴是方位角。
我试图通过将相机放置在球探中心并拍摄周围的平面照片来实现这一目标,以便用截锥体的平面瓦片近似球形四边形。然后,我可以将其用作纹理应用于畸变的平面补丁。
对我而言,这似乎是一种非常繁琐的方法。我想知道是否有一种使用着色器或某些GPU智能方法来解决这个问题的方法。
谢谢。
S.
3个回答

0

当你费心去构建模型、拍摄平面照片、应用非仿射变换并将所有东西拼接在一起时,你可能没有获得性能提升,但增加了相当大的复杂性。只需数学投影平面图像即可完成。


问题在于我需要对大量的球探头执行此操作。因此,准手动光栅化确实不是一个选项。我认为使用GPU方式是有意义的,我只想解决线性变换不能由纯OpenGL管线完成的问题。 - Steve
@Steve:你在计算球面调和函数吗? - Calvin1602

0

您似乎在询问OpenGL的球面映射。NeHe有一个教程关于球面映射,可能会对您有所帮助。


不,球面映射是将UV坐标映射到球体上。他想在一个球体上渲染场景。 - Calvin1602
非常正确。我正在寻找相反的东西。谢谢你。 - Steve

0

我可以给你两个解决方案。

第一个是使用附加为目标缓冲区的立方体贴图来制作标准的渲染到纹理,如果您的硬件足够新,可以在单个传递中完成。这将处理所需的所有数学运算,但立方体贴图的数据重分配并不理想(角落处会有相当多的扭曲)。在大多数情况下,这应该已经足够了。

之后,您需要向屏幕渲染一个四边形,并在着色器中使用简单的球面映射将UV坐标映射到xyz向量。硬件将为您计算要采取的立方体贴图的哪一侧以及哪个UV。

第二个与第一个差不多,但具有自定义变形和较少的硬件支持:dual paraboloids。两个抛物面可能不够,但您可以自由地稍微修改方程式并进行6次传递。渲染传递相同,但这次您需要自己选择正确的纹理并计算UV。


非常感谢C。我认为将渲染到纹理的想法似乎非常有趣,而且可能非常高效。我会尝试并检查错误。如果太大,我将研究您的第二个建议,这似乎更加复杂。感激不尽。S。 - Steve
顺便说一句,我更愿意把你引导到《ShaderX 6》中的“isocube”和“uniform cubemaps”,而不是使用抛物面。(这仍然是相同的想法) - Calvin1602

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接