将纹理映射到 DirectX 球体?
Mapping textures to DirectX sphere?
我正在使用类似于 Google 地球的 DirectX 编写虚拟地球仪。到目前为止,我已经完成了曲面细分,并在整个球体上使用包裹纹理进行了测试,这是成功的。我已经写了纹理坐标来对应纬度和经度(90lat,-180lon = 0,0 和 -90lat,180lon = 1,1)。
对于这个项目,我需要在球体上叠加几个图像块。例如,跨越 90 度乘以 90 度的 8 张图像。这些图块可能会动态更新(即,可能会在您平移时添加或删除图块)。我考虑过使用渲染目标视图并直接向其绘制图块,但我确信有更好的方法。
我该怎么做?有没有办法将纹理设置为仅跨越特定纹理坐标space? IE。从 (0, 0) 到 (0.25, 0.5)?
共有三种 straight-forward 解决方案(可能还有更多更复杂的解决方案)。
- 您可以创建与瓷砖覆盖的球体部分相匹配的几何体,然后绘制这些几何体,在每次绘制调用之前设置正确的纹理(如果瓷砖以简单的方式布置,您也可以生成此使用实例化和单个绘制调用的几何体)。
- 您可以编写一个像素着色器来评估纹理坐标并使用转换后的纹理坐标选择合适的纹理。
- 将所有纹理渲染成一个大纹理,然后用它来渲染球体。每当图块发生变化时,将大纹理绑定为渲染目标并在其上绘制新图块。
我正在使用类似于 Google 地球的 DirectX 编写虚拟地球仪。到目前为止,我已经完成了曲面细分,并在整个球体上使用包裹纹理进行了测试,这是成功的。我已经写了纹理坐标来对应纬度和经度(90lat,-180lon = 0,0 和 -90lat,180lon = 1,1)。
对于这个项目,我需要在球体上叠加几个图像块。例如,跨越 90 度乘以 90 度的 8 张图像。这些图块可能会动态更新(即,可能会在您平移时添加或删除图块)。我考虑过使用渲染目标视图并直接向其绘制图块,但我确信有更好的方法。
我该怎么做?有没有办法将纹理设置为仅跨越特定纹理坐标space? IE。从 (0, 0) 到 (0.25, 0.5)?
共有三种 straight-forward 解决方案(可能还有更多更复杂的解决方案)。
- 您可以创建与瓷砖覆盖的球体部分相匹配的几何体,然后绘制这些几何体,在每次绘制调用之前设置正确的纹理(如果瓷砖以简单的方式布置,您也可以生成此使用实例化和单个绘制调用的几何体)。
- 您可以编写一个像素着色器来评估纹理坐标并使用转换后的纹理坐标选择合适的纹理。
- 将所有纹理渲染成一个大纹理,然后用它来渲染球体。每当图块发生变化时,将大纹理绑定为渲染目标并在其上绘制新图块。