0

我正在尝试使用几何着色器渲染三次贝塞尔曲面,所以我有 16 个控制点,它们都是 vec3,我将它们更改为 vec4,在顶点着色器中添加了 w = 1

这就是问题所在:

几何着色器采用基元形式的顶点数组对吗?(例如点、线、三角形)并且每次只能获得最多 6 个顶点(三角形邻接的情况)但我必须知道所有 16 个顶点(在我绘制任何东西之前,它们是三次贝塞尔曲面的控制点)。

我怎么解决这个问题?glDrawArrays() 不是我应该使用的函数吗?

4

1 回答 1

0

对于简单的曲线,它可以像这样使用 GLSL 渲染 2D 三次 BEZIER

所以也许你可以尝试做类似的事情。例如:

  1. 在 CPU 上将每个补丁 16 个点的多边形传递给 GPU

    这些点必须具有特定的拓扑/顺序,以便您知道哪些点是哪些点。(但是我不确定 16 个顶点是否在几何着色器限制内)

  2. 在几何着色器中发出 BBOX + 系数矩阵

    所以你发出单个 QUAD 或几个三角形或任何覆盖补丁区域的东西......但是你传递预先计算的系数矩阵而不是原始的 16 个点。

  3. 在片段着色器中

    计算到表面的最近距离并渲染或discard

然而,离表面最近的距离需要 2D 搜索/拟合,这将比 1D 搜索/拟合曲线慢得多。因此,如果速度太慢,您可以在几何图形中发出四边形网格,而片段只会渲染四边形(用正方形近似表面,在大多数情况下,照明看起来还可以)

于 2020-10-21T10:20:41.343 回答