2

我偶然发现Kévin Boulanger 写的关于渲染草的精彩博客。

在他的项目中,他使用了一定的密度图:

在此处输入图像描述

黑色区域代表 3D 世界中要渲染草的地方。白色区域是没有草的地方。

我的问题是——我正在使用 OpenGL 的实例渲染功能在我的场景中渲染草。但是草几乎横跨整个地形。我无法用我正在渲染的草的位置来映射这样的密度图。

如何将此类密度图与实例渲染一起使用?

4

1 回答 1

3

Kevin 所做的基本上是在生成草地补丁网格时读取该密度图(在 cpu 上)并将值存储在顶点中(1 个刀片的所有顶点中的值相同)。然后当补丁被渲染时,在像素着色器中,如果这个值小于某个阈值,他就丢弃了这个像素。该系统是由广告牌制成的有点不同的补丁,密度是存储在纹理中而不是。所以基本上你到处渲染草,但是草在路上变得不可见。

他的论文第 67-71 页对此进行了解释。

但他所描述的不适用于实例化,因为每个补丁都是不同的网格或使用不同的纹理,因此您无法通过实例化绘制它们。

一个解决方案是将每个草叶实例的密度值存储在一个统一的缓冲区中。这样每个草块都是相同的网格并且可以被实例化。

对于由广告牌制成的补丁,它更复杂,您需要每个广告牌有“1 个纹理”。您可以制作一个大纹理(或纹理数组),其中包含多个广告牌的等价物,并将每个广告牌的纹理坐标偏移存储在常量缓冲区中。确保为在这种情况下看起来相同的广告牌重复使用纹理的相同部分。

于 2015-03-27T08:13:58.930 回答