,在顶点着色器中执行高度贴图可能会遇到顶点数量不足以用来渲染所需的细 节的情况。现在我们有了生成大量顶点的方法,让我们回到Hastings-Trew 的月球表面纹理 贴图[HT16]并将其用作高度贴图,提升曲面细分顶点来生成月球表面细节。正如我们将看到 的,这具有一些优点,可以让顶点的几何形状更好地匹配月亮图像,并且提升轮廓(边缘) 细节。
1
opengl贝塞尔曲面细分,win7+VS017,win10+vs2019版本 现在让我们扩展我们的程序,使它将我们简单的矩形网格转换为贝塞尔曲面。细分网格 应该为我们提供了足够的顶点来对曲面进行采样(如果我们想要更多的话,我们可以增加 内部/外部细分级别)。我们现在需要的是通过管线发送控制点,然后使用这些控制点执行计 算以将细分网格转换为我们所需的贝塞尔曲面。
2022-04-25 16:05:24 115.05MB opengl曲面细分着色器 贝塞尔曲面实现
1
现在让我们扩展我们的程序,使它将我们简单的矩形网格转换为贝塞尔曲面。细分网格 应该为我们提供了足够的顶点来对曲面进行采样(如果我们想要更多的话,我们可以增加 内部/外部细分级别)。我们现在需要的是通过管线发送控制点,然后使用这些控制点执行计 算以将细分网格转换为我们所需的贝塞尔曲面。 假设我们希望建立一个立方体贝塞尔曲面,我们将需要16 个控制点。我们可以通过VBO 从C++端发送它们,或者我们可以在顶点着色器中硬编码写死它们。 现在是更准确地解释曲面细分控制着色器(TCS)如何工作的好时机。与顶点着色器类 似,TCS 对每个传入顶点执行一次。另外,回想一下第2 章,OpenGL 提供了一个名为 gl_VertexID 的内置变量,它保存一个计数器,指示顶点着色器当前正在执行哪次调用。曲 面细分控制着色器中存在一个类似的内置变量gl_InvocationID。 曲面细分的一个强大功能是TCS(以及TES)着色器可以同时访问数组中的所有控制 点顶点。首先,当每个调用都可以访问所有顶点时,TCS 对每个顶点执行一次可能会让人 感到困惑。在每个TCS 调用中,冗余地在赋值语句中指定曲面细分级
1
OpenGL 对硬件曲面细分的支持,通过3 个管线阶段提供: (1)曲面细分控制着色器; (2)曲面细分器; (3)曲面细分评估着色器。 (1)C++/OpenGL 应用程序: 创建一个摄像机和相关的MVP 矩阵,视图(v)和投影(p)矩阵确定摄像机朝向,模 型(m)矩阵可用于修改网格的位置和方向。 (2)顶点着色器: 在这个例子中基本上什么都不做,顶点将在曲面细分器中生成。 (3)曲面细分控制着色器: 指定曲面细分器要构建的网格。 (4)曲面细分评估着色器: 将MVP 矩阵应用于网格中的顶点。 (5)片段着色器: 只需为每个像素输出固定颜色。 曲面细分器生成由两个参数定义的顶点网格:内层级别和外层级别。在这种情况下, 内层级别为12,外层级别为6——网格的外边缘被分为6 段,而跨越内部的线被分为 12 段。 程序12.1 中的特别相关的新结构被高亮显示。让我们首先讨论第一部分——C++/ OpenGL 代码。 编译这两个新着色器,跟顶点和片段着色器完全相同。然后将它们附加到同一个渲染程 序,并且链接调用保持不变。唯一的新项目是用于指定要实例化的着色器类型的常量——新 常量如下: G
2022-04-09 17:05:37 33.88MB openGL曲面细分着色器
1