问题描述
我正在尝试使用几何着色器渲染立方贝塞尔曲面 所以我有16个控制点都是vec3 我将其更改为vec4s,在顶点着色器中添加了w = 1
这是问题所在:
几何着色器采用原始形式的顶点数组吗?(例如点,线,三角形),并且每次我必须知道全部时,它们最多只能获得6个顶点(三角形邻接的情况)我绘制任何东西之前的16个顶点(它们是三次贝塞尔曲面的控制点)中的一个。
我该如何解决这个问题?是glDrawArrays()不是我应该使用的功能吗?
解决方法
对于简单的曲线,它像这样rendering 2D cubic BEZIER with GLSL
所以也许您可以尝试做类似的事情。例如:
-
在CPU上将每个补丁点16点的多边形传递给GPU
这些点必须具有特定的拓扑/顺序,以便您知道哪些点是哪个。 (但是我不确定16个顶点是否在几何着色器限制之内)
-
在几何着色器中发出BBOX +系数矩阵
因此,您发出单个QUAD或几个三角形或覆盖补丁区域的任何内容...但是,您可以传递预先计算的系数矩阵,而不是原始的16个点。
-
在片段着色器中
计算最接近表面的距离,然后渲染或
discard
。
但是,最接近曲面的距离需要2D搜索/拟合,这比1D搜索/拟合曲线要慢得多。因此,如果速度太慢,您可以发出四边形的几何形状,而片段将仅渲染四边形(用正方形近似表面,在大多数情况下使用照明看起来可以)