如何在OpenGL的“几何着色器”中获得16个顶点作为曲面的控制点?

问题描述

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

这是问题所在:

几何着色器采用原始形式的顶点数组吗?(例如点,线,三角形),并且每次我必须知道全部时,它们最多只能获得6个顶点(三角形邻接的情况)我绘制任何东西之前的16个顶点(它们是三次贝塞尔曲面的控制点)中的一个

我该如何解决这个问题?是glDrawArrays()不是我应该使用的功能吗?

解决方法

对于简单的曲线,它像这样rendering 2D cubic BEZIER with GLSL

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

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

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

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

    因此,您发出单个QUAD或几个三角形或覆盖补丁区域的任何内容...但是,您可以传递预先计算的系数矩阵,而不是原始的16个点。

  3. 在片段着色器中

    计算最接近表面的距离,然后渲染或discard

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...