【发布时间】:2015-10-17 17:55:58
【问题描述】:
我喜欢渲染几个在顶点着色器中动态计算的表面。曲面是由存储在顶点属性缓冲区中的 2d 或 3d 网格中的顶点位移生成的。
但是,如果渲染非常大(数百万个顶点)和许多具有不同分辨率的表面,我需要生成大量“无聊”的网格数据,这些数据会填满内存,可能会减慢渲染速度,如果新的渲染很大,有时会中断渲染生成网格。
有什么方法可以即时生成简单的顶点属性网格,而不需要存储它们?
【问题讨论】:
我喜欢渲染几个在顶点着色器中动态计算的表面。曲面是由存储在顶点属性缓冲区中的 2d 或 3d 网格中的顶点位移生成的。
但是,如果渲染非常大(数百万个顶点)和许多具有不同分辨率的表面,我需要生成大量“无聊”的网格数据,这些数据会填满内存,可能会减慢渲染速度,如果新的渲染很大,有时会中断渲染生成网格。
有什么方法可以即时生成简单的顶点属性网格,而不需要存储它们?
【问题讨论】:
您当然可以直接在顶点着色器中生成统一网格。在相当现代的 GL 中,您可以完全无属性地工作。着色器中的gl_VertexID 输入将告诉您当前正在处理的顶点。通过一点点整数除法和取模,您可以轻松地将其映射到 2D 网格。您仍然需要某种方式来描述位移。直观的方法似乎是为此使用 2D 纹理(您可以轻松地从网格中的坐标导出 texcoords),但有不同的选择。你甚至可以通过一些数学模型在程序上生成它。
【讨论】:
glDrawArrays?
gl_VertexID...所以 gl_VertexID 似乎并不被所有 OpenGL 风格支持,尽管这很简单。我现在只是添加一个标签 WebGL..
gl_VertexID 当然可以用一个 int 数组来模拟,并且可以在所有基元数少于其大小的情况下重用它。总比我猜的要好...