在opengl中绘制几何图形

Posted

技术标签:

【中文标题】在opengl中绘制几何图形【英文标题】:Drawing geometry in opengl 【发布时间】:2012-11-19 08:18:04 【问题描述】:

考虑标准的opengl 4.0+功能和规范;我已经看到可以通过两种方式创建几何形状和形状:

    利用 VAO 和 VBO s.

    使用着色器程序。

哪一种是创建形状的标准方法?它们彼此一致吗?或者它们是创建几何和形状的两种不同方式?

【问题讨论】:

几何着色器可用于修改硬件上的几何图形(例如level of detail),但它们仍需要输入数据才能使用。 【参考方案1】:

几何图形通过 VAO 和 VBO 加载到 GPU 中。

Geometry shaders 生成基于上传的新几何。使用它们以更有效的方式制作粒子、阴影(Shadow Volumes) 等特殊效果。

tessellation shaders 用于细分几何体以获得displacement mapping 等一些效果。

我强烈(非常强烈)推荐你阅读这篇http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/

【讨论】:

感谢您的回答和参考,到目前为止,我已经使用着色器来创建形状,所以您的意思是真正的交易是 VAO 和 VBO?到目前为止,我已经使用着色器创建了形状,这些形状是某种虚拟模拟形状吗?? 如果您在阅读几何着色器之前不考虑使用它们会更好。如果您需要在屏幕上绘制一些东西 - 只需上传并绘制它该死的 :) 但对于您的问题:几何图形是由存储在 GPU 内存中并注入 GPU 管道的几何着色器生成的。主要优点是您可以通过 GPU 内核以并行方式立即生成大量几何图形,并且不需要将大量数据上传到 GPU(PC 总线是瓶颈) @BulBul “到目前为止,我已经使用着色器来创建形状” - 不,你没有,相信我。您所做的是使用着色器从 VAO 和 VBO 绘制几何图形,这不是唯一的,您始终需要 VAO 和 VBO 来上传任何几何图形,无论您是否使用任何着色器更改此几何图形。【参考方案2】:

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

【讨论】:

【参考方案3】:

让我们列出全部事实。

着色器需要输入。如果没有更改的输入,每次着色器调用都将产生完全相同的值。这就是着色器的工作方式。当您发出绘图调用时,会启动许多着色器调用。 只有变量会在此绘制调用中从调用到调用发生变化是in 变量。因此,除非您使用某种输入,否则每个着色器都会产生相同的输出。

然而,这并不意味着你绝对需要一个实际包含东西的 VAO。使用没有 any attributes enabled 的 VAO 进行渲染是完全合法的(尽管有些驱动程序不支持它)(尽管您必须使用数组渲染,而不是索引渲染)。在这种情况下,顶点着色器的所有用户定义输入(如果有)将被填充到with context state,这将是常量。

顶点着色器确实有一些由系统生成的其他内置的逐顶点输入。 Namely gl_VertexID。这是 OpenGL 用来唯一标识这个特定顶点的索引。每个顶点都会有所不同。

因此,例如,您可以通过统一缓冲区、缓冲区纹理或其他机制根据此索引自行获取几何数据。或者,您可以根据索引以程序方式生成顶点数据。或者是其他东西。您可以将该数据传递给细分着色器,以便他们细分生成的数据。或者几何着色器来做任何你想做的事情。但是,您是否想将该索引转换为真实数据取决于您。

Here's an example from my tutorial series that generates vertex data from nothing more than an index.

【讨论】:

【参考方案4】:

我发现几何和形状可以通过两种方式创建:

也不是。在现代 OpenGL-4 中,您需要数据和程序。

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

【讨论】:

【参考方案5】:

顶点着色器可用于置换顶​​点,或从内置公式和顶点索引生成顶点,后者在以后的 open gl 版本中作为内置属性提供。

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

【讨论】:

以上是关于在opengl中绘制几何图形的主要内容,如果未能解决你的问题,请参考以下文章

opengl如何绘制一个三维平面

从零开始openGL—— 基本图形绘制

Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

SDL2+OpenGL 绘制立体图形

OpenGl学习进程第六课:点边和图形绘制图形

(转)使用OpenGL显示图像绘制Shapes