3

我正在制作一个类似于Minecraft的地形引擎来学习一些 OpenGL 和 3D,除了我不满意的 FPS 之外,一切都运行良好。

大约 66 fps,50k 顶点/帧

当前:我目前只绘制可见面并使用平截头体剔除,立方体为 16 x 16 x 32 立方体块(目前)。

我每个块使用 6 个显示列表,每边一个(左、右、前、后、上、下),所以立方体不是一个一个地绘制,而是整个块的一面。

使用这种方法,我得到大约 20-100fps,这不是很好。分析说我向显卡发送了大约 100k 个顶点,当我看到天空并且顶点低于 10k 时,我的速度达到了 200+fps,所以我想这是我的瓶颈。

我想做的是:因为少即是多,我继续前进并发现了这个: http://ogre3d.org/forums/viewtopic.php?f=2&t=60381&p= 405688#p404631

据我了解,Kojack使用巨大平面的 3D 网格,并以某种方式将 2D 纹理图集中的纹理绘制到这些巨大平面的某些位置。他说他使用 256x256x256 的 3D 纹理和绿色和蓝色通道来映射到 2D 纹理图集。

他的方法总计平面的顶点数量是恒定的,如果我的地图被应用的话,有时是无用的,但它仍然比我现在拥有的少。

我的问题:我没听懂他说的任何话像素)。他如何将纹理从纹理图集中映射到平面的一部分,而这通过使用一些 3D 纹理贴图......

任何人都可以解释Kojack做了什么或指向一些有用的地方,即使谷歌现在也没有任何帮助。

4

2 回答 2

4

这是您的问题的答案。首先,他将场景视为 256 x 256 x 256 的立方体。对于每个轴,他在每个轴值(即从 0,0,0 到 0,256,256,然后从 1,0,0 到 1,256,256 等等)渲染 256 个正方形(每个由两个三角形组成)立方体的全尺寸256,0,0 到 256,256,256)。然后他面向另一个方向做同样的事情 - 使用相反的法线 - 每个轴总共给出 512 个正方形 / 1024 个三角形。对 y 和 z 重复该过程,总共得到 3072 个三角形和 3072 个顶点(顶点仅出现在 256 x 256 x 256 立方体的边缘)。

现在是纹理。实际上,他正在绘制每个立方体,但是通过使该位置的纹理透明来使一些不可见。他有两个纹理,一个 256 x 256 x 256 3D 纹理和一个 16 x 16纹理图集由较小的纹理组成。为了绘制纹理,首先他使用他正在绘制的立方体的坐标作为 3D 纹理中的纹理坐标。因此,如果他在 42、7、13 等位置绘制立方体,则 3D 纹理坐标为 42、7、13。在 3D 纹理中,他存储的所有值都是绿色和蓝色值,它们对应于子的 u、v 坐标-要绘制的纹理图集中的纹理。所以在他的例子中,3D 纹理中的颜色是 R = 0(未使用),G = 2,B = 4,A = 0(未使用)。他使用 2 & 4 作为 u, v 坐标,然后在纹理图集中的 2, 4 位置绘制纹理。由于纹理图集基本上只是一个巨大的纹理,对应于 16 x 16 (256) 个较小的纹理,

如果他想挖出一个立方体,他需要做的就是改变那个点存储在3D纹理中的值指向图集中的透明子纹理,所以如果纹理图集中的0,0是一个子- 完全透明的纹理,他可以在 3D 地图集中将该位置的纹理设置为 R = 0(未使用),G = 0,B = 0,A = 0(未使用)。

于 2011-01-29T11:26:34.957 回答
2

尝试将您的面部纹理放入纹理图集中。每个面的纹理绑定太多了。

于 2011-01-31T14:47:47.127 回答