在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中绘制几何图形的主要内容,如果未能解决你的问题,请参考以下文章