问题标签 [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.
android - android opengl-es中的顶点数组对象
听说最近发布的大部分android设备都支持opengl-es的VAO。我正在尝试在 opengl-es 2.0 环境中开发应用程序。但是,我想知道
(Q1)大多数正在使用的Android设备(可能是几年前生产的)是否支持VAO?如果不是,最好不要使用 VAO,因为我们必须为支持 VAO 和不支持 VAO 的设备编写单独的代码
(Q2)它真的给我们带来了很大的性能优势(与仅使用顶点缓冲区对象(VBO)相比)来使用它们吗?如果是这样,我们如何在 opengl-es2.0 环境中使用它们?
c++ - 绘制多个立方体时出现 glGenVertexArrays 和 glGenVertexBuffers 的问题
我写了一个小程序,它应该用 OpenGL 4.3 显示几个立方体。我使用 SDL 2.0 创建上下文,但我不认为我的问题来自那里。
我有一个Cube
具有多个属性的类,包括GLuint m_vao
顶点数组的一个和GLuint m_vbo
顶点缓冲区的一个。
为了显示几个立方体,我用不同的坐标创建了这个类的几个实例。我在. glGenVertexArrays(1, &m_vao)
_glGenBuffers(1, &m_vbo)
Cube
创建这样的多维数据集时我没有问题:
这将创建四个具有唯一属性m_vao
和m_vbo
属性的立方体(1 个用于 c,2 个用于 c2,3 个用于 c3,4 个用于 c4)。
但是,当我像这样创建我的多维数据集时:
my 中的所有立方体vector
都具有相同的m_vao
和m_vbo
属性,在这种情况下,它们都具有 1m_vao
和m_vbo
。如果我在手动创建立方体 c、c2、c3 和 c4 后执行此操作,它们都会得到 4。当然,由于它们都使用相同的 VBO,它们都具有相同的坐标,最后只出现了一个立方体。
std::vector
所以我的问题是:手动创建多维数据集(工作正常)和在循环中创建它们for
(为所有多维数据集生成相同的 VAO 和 VBO)之间有什么不同?
opengl - 主机内存中的 OpenGL 缓冲区管理和主机设备同步
我想知道如何让我的应用程序与必须进行大量更改的 3D 模型进行交互。例如,我希望能够从应用程序本身自由修改颜色、纹理 ID、位置甚至法线。我认为每次模型更改或每一帧都重新上传模型(glBufferData),但这对我来说似乎是一种内存密集型。
另外,我不太确定我应该如何让一个类访问主机内存中缓冲区的一部分。示例:具有属性并且可以随时修改它们的类“Shape”,修改缓冲区包含的内容。为此,我不知道从哪里开始。我必须指出,我需要在这些类中有更多不能发送到 GPU 的属性。我可以研究的任何提示/技术?
编辑:我在Buffer Object Streaming上找到了这篇文章,并且对使用 glBufferData 和 glBufferSubData 将数据流式传输到 GPU 感到非常舒服。不过,我仍然很难找到一种在缓冲区中定义对象的好方法。
我研究了创建自己的类“SubArray”,其中包含 CPU 内存中的数组、偏移量和长度。它有一个索引器来验证索引并在不在正确范围内时抛出异常,但我觉得使用这种方法不太舒服,因为我无法更改简单对象的块大小(添加顶点)。
c++ - 使用顶点缓冲区的直接状态访问
从 2010 年的这个问题来看,关于现代 OpenGL 中的顶点缓冲区,是否仍然存在直接状态访问不可用的情况?我已经修改了我的大部分图形库以使用带有帧缓冲区、纹理等的 DSA,但我仍然需要“绑定”来设置我的顶点数组状态(绑定数组、绑定索引缓冲区、绑定顶点缓冲区、取消绑定数组等)。 )。
更新 1: 我无法从 BDL 的回答中理解参数的作用。我对一个非常简单的顶点缓冲区(一个属性,一个位置)的单元测试给了我一个空白屏幕(它适用于描述顶点流的旧方法)。它应该只绘制一个三角形,不需要索引缓冲区。
这是我正在做的事情,评论是我的理解:
现在,我想我“明白”了绑定点。它们是我可以分配的任意数字,这样我就可以快速轻松地交换一组不同的属性。所以在这个简单的测试中只使用 0 就足够了。
我正在使用 glCreateBuffers 来创建 vbo 和 glCreateVertexArrays 来创建 vao(从以前的可绑定样式更改)。没有调试输出(调试上下文已打开),每个调用都使用 glGetError 检查,并且没有报告错误。
更新 2: glVertexArrayVertexBuffer 步幅和偏移量的顺序错误。现在可以了。
更新 3: glVertexArrayVertexBuffer 被调用一次,而不是为 VBO 中的每个属性调用一次(如果你有交错的位置、纹理等)。
c++ - OpenGL 大项目、VAO-s 等
所以我一直在https://open.gl/上学习 OpenGL 3.3 ,我对一些东西感到非常困惑。
- VAO-s。据我了解,它们用于存储
glVertexAttribPointer
呼叫。 - VBO-s。它们存储顶点。所以如果我用多个对象制作东西,我需要为每个对象一个 VBO 吗?
- 着色器程序 - 为什么我们需要多个着色器程序,它们到底是做什么的?
- 这条线到底做了什么:glBindFragDataLocation(shaderProgram, 0, "outColor");
最重要的是如何将所有这些融入到一个大项目中?VAO-s 究竟用于什么用途?大多数教程只涵盖了使用硬编码顶点绘制一个或 2 个立方体的内容,那么如何管理具有大量对象的场景呢?我已经阅读了这个线程,并对场景管理是如何发生的有了一些了解,但我仍然不知道如何将 OpenGL 的东西连接到这一切。
opengl - 将多个缓冲区对象与单个顶点数组对象绑定不起作用
我试图了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形
我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前 3 个属性来自三角形,接下来的 2 个属性来自矩形的最后 2 个点。然后我把它们画成三角形带。
从坐标中可以看出,预期的形状就像一个小屋,在矩形上相邻的三角形。但是,我得到的是这个
我是否误解了顶点数组对象的绑定或索引?完整的可编译代码在这里,我使用 GtkGlExt 但 OpenGL 部分是通用的。
qt - Qt 5.5 和 OpenGL:QVertexArrayObject::create() 调用 QPainter::drawimage()?
我知道要正确初始化和使用任何 Qt OpenGL 便利类,必须使用有效的当前上下文调用它们。因此,我将我的类设计为从我的重载QOpenGLWidget::initializeGL()
函数初始化,其中文档说明上下文已创建并成为当前的(尽管没有帧缓冲区)。
但是,当initializeGL()
尝试初始化我的一个子类MeshObject
,特别是调用函数QOpenGLVertexArrayObject::create()
时,程序崩溃并显示消息
Read access violation at 0x0
通过调试器,注意调用堆栈:
有对 QPainter::drawImage 的调用,这肯定会失败,因为没有帧缓冲区存在。
但是为什么QPainter::drawImage
当我尝试创建一个 vertexArrayObject 时会发生调用?当然,这个功能不应该涉及到屏幕上的绘画。
虽然文档还指出 QOpenGLVertexArrayObjects 只能在某些 OpenGL ES 2.0 平台上运行,但vbuffer.create()
会导致完全相同的情况发生,而且我已经QOpenGLVertexArrayObjects
在之前的项目中使用过这台机器,完全没有问题。
完整的堆栈跟踪: