在OpenGL中绘制几何图形

3
考虑到标准的OpenGL 4.0 +函数和规范,我发现可以用两种方式创建几何体和形状:
1.利用VAO和VBO。 2.使用着色器程序。
哪一种是创建形状的标准方法?它们是否互相一致或者它们是创建几何体和形状的两种不同方式?

2
几何着色器可用于在硬件上修改几何形状(例如细节级别),但它们仍需要输入数据才能工作。 - Samuel Harmer
5个回答

4

VAOs和VBOs是关于如何绘制几何图形(指定每个顶点的数据)的,而着色器程序则是关于如何绘制它们的(哪个程序应用于每个提供的顶点、每个片段等)。


4

感谢你的答案和参考,到目前为止我已经使用了渲染器来创建形状,那么你的意思是真正的高级应该用VAO和VBO吗?到目前为止我使用渲染器已经创造出了一些形状,这些形状是一些虚拟模拟的东西吗? - BulBul
1
在了解几何着色器之前最好不要考虑使用它们,如果你需要在屏幕上绘制一些东西 - 只需上传并绘制它。但是回答你的问题:由几何着色器生成的几何体存储在GPU内存中,并注入到GPU管道中。主要优点是可以通过GPU核心以并行方式立即产生大量几何体,而不需要将大量数据上传到GPU(PC总线是瓶颈)。 - JAre
2
@BulBul "到目前为止,我已经使用了着色器来创建形状" - 不,你没有。相信我,你所做的是使用着色器从VAOs和VBOs中绘制几何图形,这并不是唯一的方式,你总是需要VAO和VBO来上传任何几何图形,无论你是否使用任何着色器改变此几何图形。 - Christian Rau

3
让我们梳理完整的事实。
着色器需要输入。如果没有发生变化的输入,每个着色器调用将会产生完全相同的值。这就是着色器的工作方式。当您发出绘制调用时,会启动多个着色器调用。在此绘制调用内,仅有的会从调用到调用更改的变量是“in”变量。因此,除非您使用某种输入,否则每个着色器都会产生相同的输出。
然而,这并不意味着您绝对需要一个包含实际内容的VAO。使用一个没有启用任何属性的VAO 进行渲染是完全合法的(尽管有些驱动程序不支持),但必须使用数组渲染,而不是索引渲染。在这种情况下,所有用户定义的输入顶点着色器(如果有)将被填充上下文状态,这将是恒定的。
顶点着色器确实有一些其他的系统生成的每个顶点输入。即gl_VertexID。这是OpenGL用于唯一标识此特定顶点的索引。它对于每个顶点都是不同的。
因此,例如,您可以通过统一缓冲区、缓冲区纹理或其他机制根据此索引自己获取几何数据。或者,您可以基于该索引生成顶点数据。或者其他什么。您可以将该数据传递给镶嵌着色器,让它们对生成的数据进行镶嵌。或者传递给几何着色器,让它们对其进行任何想要的操作。如何将该索引转换为真实数据由您决定。 以下是我教程系列中的一个示例,它从仅有的一个索引生成顶点数据

2

我曾看到过创建几何形状的两种方法:

不是两者之一。在现代OpenGL-4中,你需要同时使用数据和程序。

VBOs和VAOs包含原始几何数据。着色器是程序(通常在GPU上执行),将原始数据转换为屏幕上的像素。


1

顶点着色器可用于位移顶点,或者从内置公式和顶点索引生成它们,后者在较新的OpenGL版本中作为内置属性可用。

顶点着色器和几何着色器之间的区别在于,顶点着色器是1:1映射,而几何着色器可以创建更多的顶点--可以用于自动细节级别生成,例如NURBS或基于perlin噪声的地形等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接