问题标签 [vertex-array-object]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 顶点数组的问题
我正在尝试学习如何处理 VBO(VertexBufferObjects),但我无法比 Vertex Arrays 更进一步。我遵循了一些关于这个主题的基本教程,每个教程都以不同的方式进行教学,这让我很难理解和实施。
问题:渲染glDrawArrays();
应该与立即模式渲染相同。因此,我尝试通过songho.ca测试代码,但我得到的只是本机代码中的 JVM 崩溃。询问谷歌根本没有帮助,因为这种方法有几十种变体。但我认为我的参数是主要问题。
这是我到目前为止得到的:
我使用 LWJGL,所以我将数据存储在 FloatBuffer 中:
我的三角形类由 3 个向量 ABC 组成,每个向量定义一个顶点。在第一行中,我为顶点分配空间,每个三角形 9 个浮点数(每个顶点 3 个浮点数,每个三角形 3 个顶点)。到目前为止没有什么异常,放入缓冲区的浮点数正好等于分配的大小。
立即模式渲染:
也没什么特别的,到目前为止看到的一切对我来说都很好。但是 Array 变体让我头疼......
崩溃的 JVM 产生的错误日志指向该glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
行,但我找不到我的错误...
opengl - Haskell opengl 属性未激活
我正在尝试从顶点缓冲区对象呈现一些数据。但是很少使用 glutil 和 raw。当程序运行时,它陷入了无限循环,我得到了你在下面看到的错误。
顶点着色器
片段着色器
我曾尝试使用 430,但没有奏效。所以我尝试使用 150,因为我看到很多人在使用它。此外,我在使用 raw 时尝试过使用布局,但这没有用。
使用实例
错误
c++ - 调用 glBindVertexArray(vao):如果 'vao' 已经绑定,它会做什么,以及如何相应地设计形状类?
我正在再次尝试 OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,所以我创建了一个Shape
带有静态 VAO 成员的类,该成员glGenVertexArrays(1, &vao)
在创建第一个实例时调用Shape
。现在有一个方法void Shape::render()
:
这是一个好方法吗?我的意思是,当在实际程序中绘制 的所有实例时,Shape
会反复调用 bind ,但我的猜测是,如果当前已经绑定Shape::vao
,它实际上并没有做任何事情。vao
这个猜测正确吗?
另外,我前段时间看到一个教程,它曾经glBindVertexArray(0)
在render()
. 当有许多形状时,这不是潜在的性能损失吗?
c++ - 使用索引三角形减少顶点缓冲区
在我的 OpenGL 程序中有一个巨大的顶点缓冲区,其中包含 2048x2048 点的数据(法线、位置、texcoords)。在每一帧中,我使用 LOD 算法减少我的索引缓冲区并再次绑定 GL_ELEMENT_ARRAY_BUFFER。
我想知道另外减少顶点缓冲区是否有意义,以便它只包含索引缓冲区中使用的顶点。所以问题是,即使每帧重建和重新绑定顶点数组,是否也能提高性能。
java - 无法使用 LWJGL 在 Java 中使用数组缓冲区进行渲染
我正在尝试学习如何使用顶点数组/顶点缓冲区对象以现代方式在 OpenGL 中编程。我现在正在使用 LWJGL wiki 上的教程,即使我复制并粘贴教程代码,我也会得到一个背景颜色设置正确但顶部没有呈现形状的窗口。教程页面显示了一个在背景上呈现白色矩形的屏幕截图。这是一个常见问题,还是有什么方法可以获取有关我的错误的更多信息?
编辑:使用着色器并在顶点上添加一些颜色可以解决问题。不过,我还没有将其作为答案发布,因为我假设教程代码旨在在不使用着色器的情况下工作。(在教程的后面部分)
这是教程页面上的代码:
performance - 在考虑性能的同时,如何正确管理现代 OpenGL 中的数据?
在现代 OpenGL (3.x+) 中,您创建包含顶点属性的缓冲区对象,例如位置、颜色、法线、纹理坐标和索引。
然后将这些缓冲区分配给相应的顶点数组对象 (VAO),该对象本质上包含指向所有数据以及数据格式的指针。
有很多关于如何创建 VAO 以及如何使用它的教程;不幸的是,尚不清楚应该如何将 VAO 用于大型应用程序或游戏。
例如,一个游戏可能包含许多 3D 模型,用不同的 VAO 分隔每个模型似乎是合适的。
另一方面,粒子系统包含许多相互独立的不连贯图元。在这种情况下,每个系统使用单个 VAO 可能会提高 CPU-GPU 传输的性能。然而,在这种情况下,基元需要以不同的方式进行转换,因此将每个粒子分离成一个非常小的 VAO 似乎是可行的。
问题:
- 对于大量的小数据集(例如四边形粒子系统),应该将所有数据打包到1个VAO中还是分成多个VAO?每种方法的性能优势/缺点是什么?
假设使用 1 个 VAO,转换每个独立数据子单元的唯一明显方法是修改实际位置信息并将其重新加载到 GPU 中。多次这样做在时间性能方面是昂贵的。
假设使用了许多 VAO,那么 GPU 必须为每个 VAO 存储重复的格式化信息。就空间而言,这似乎很昂贵(但我不确定这是否一定很慢)。
旁注:
是的,我个人对管理粒子系统很感兴趣。为了使这个问题更通用,对其他人更有用,我在询问整个 VAO 管理。我很好奇在考虑存储的数据类型以及需要什么样的性能(时间/空间)时,哪种管理方法比其他管理方法更合适。
VAO 的创建在这里有很好的描述:
c++ - 如何在不调用 glDeleteVertexArrays 的情况下删除 OpenGL 顶点数组对象?
我正在开发一个 After Effects 插件,我在其中使用 VAO 进行 OpenGL 渲染。在全屏 RAM 预览后,句柄编号为 1 的 VAO 以某种方式被删除(glGenVertexArrays 再次生成 1)。奇怪的是着色器和帧缓冲区仍然有效,所以重置的不是整个 OpenGL 上下文。有谁知道这可能是什么原因?
c++ - 在 OpenGL 中设置 VAO 的过程
我可以得到更全面/一般的描述吗?
我整个星期都在尝试研究这些东西,但我只涉及到超级技术的解释或示例。
有人可以解释这些 VAO 的整体过程或目标吗?也许概述了在 OpenGL 中设置 VAO 的“逐步”流程图?
我从来都不是通过例子学习的人......所以到目前为止我在网上找到的所有东西都真的没有帮助。
d - glGenVertexArrays() 使 DerelictGL3 程序崩溃
该函数调用glBindVertexArray(0)
,glGenVertexArrays(1, &vertex_array_object)
并glBindVertexArray(vertex_array_object)
导致我的程序崩溃。当我运行代码if(glGenVertexArrays == null)
时,它评估为真。这让我相信我没有正确加载函数。我正在使用DerelictGL3.load()
并DerelictGL3.reload()
加载我的功能,但我不确定它是否正常工作。其他函数似乎确实加载了,只有与顶点数组对象有关的函数会使程序崩溃。
编辑:我不确定实际问题是什么,但它似乎与 Mac OSX 加载 OpenGL 函数的方式有关。我的代码在 Linux 上不会崩溃。
opengl - 具有多个 VAO 的 Opengl 2.0
我试图设置一个带有两层绘图的 2d 屏幕
1) 由白色实线组成的网格 2) 由彩色正方形组成的瓷砖
这是我的opengl代码:
设置网格
设置磁贴
画瓷砖
绘制网格
通过只保留 setup+draw 网格产生这个:
通过仅保留设置+绘制图块会产生以下效果:
VAO 自身正常工作。
然而,魔术从这里开始:
如果我做的组合
它产生这个:
看起来绘制网格代码从瓷砖的 VAO 中获取缓冲区。请帮助:D
更新:
更正后glGenVertexArrays
同样的问题仍然发生
但我发现两个 VAO 都是 0
输出: