【发布时间】:2014-07-11 18:41:10
【问题描述】:
我正在编写一个可视化洞穴的 OpenGL 程序,所以当我可视化地表地形时,我想让它透明,这样你就可以看到下面的洞穴。我假设我可以将来自数字高程模型的数据标准化为与 X/Z 轴对齐且间距规则的网格,并将每个网格单元呈现为两个三角形。使用对齐的网格,我可以在应用画家算法时避免排序成本(以确保适当的透明度效果);相反,我可以逐行渲染单元格,从最远的行和每行最远的单元格开始。
这一切都很好,但我对 OpenGL 专家的问题是,我怎样才能使用 OpenGL 最有效地绘制地形(并且以一种可以缩放到高分辨率地形的方式)?必须有比为每个网格单元调用一次glDrawElements() 更好的方法。以下是我正在考虑的一些方法(它们涉及我尚未尝试过的功能,这就是我问专家的原因):
glMultiDrawElements创意
- 将所有地形坐标放入顶点缓冲区
- 将所有坐标索引放入元素缓冲区中
- 要进行绘制,请将每个单元格的起始索引按所需顺序写入一个数组,并使用该数组调用
glMultiDrawElements。
这看起来不错,但我想知道是否有什么方法可以避免每帧将一组索引传输到显卡,所以我想出了以下想法:
统一缓冲区理念
这似乎是使用 OpenGL 的一种落后方式,但只是把它放在那里......
- 将地形坐标放入统一缓冲区中的二维数组中
- 将坐标索引偏移量 0..5 放入顶点缓冲区(我知道它们必须是浮点数)
- 调用
glDrawArraysInstanced- 每个实例都是一个网格单元 - 顶点着色器检查相机相对于地形的位置并确定如何对单元格进行排序,将
gl_instanceId映射到统一缓冲区中单元格的第一个坐标的索引,并将gl_Position设置为该索引处的坐标 + 索引偏移属性
我认为可能有一些我不知道的闪亮的新 OpenGL 4.0 功能会比这两种方法中的任何一种更优雅。我会很感激任何提示!
【问题讨论】:
标签: performance opengl transparency terrain