如何使用实例化渲染实现密度映射

时间:2015-03-27 04:15:00

标签: opengl shader pixel-shading

我遇到了this关于由KévinBoulanger渲染草的惊人博客。

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

enter image description here

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

我的问题是 - 我正在使用OpenGL的实例化渲染功能在场景中渲染草。 但草地横跨整个地形。我无法将这样的密度图与我正在渲染的草的位置进行映射。

如何在实例化渲染中使用此类密度贴图?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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