- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在再次尝试 OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,所以我创建了一个 Shape
类,它有一个静态 VAO 成员,当第一个时调用 glGenVertexArrays(1, &vao)
Shape
实例被创建。现在有一个方法void Shape::render()
:
void Shape::render()
{
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, foo, bar);
}
这是个好方法吗?我的意思是,当 Shape
的所有实例都在实际程序中绘制时,会重复调用绑定(bind) Shape::vao
,但我猜它不会如果 vao
当前已经绑定(bind),则实际上不执行任何操作。猜对了吗?
另外,前段时间看到一个教程,在render()
的最后调用了glBindVertexArray(0)
。当有很多形状时,这不是潜在的性能损失吗?
最佳答案
but my guess would be that it doesn't actually do anything if vao is already bound currently. Is that guess correct?
是的。就正确性而言,重新绑定(bind)已经绑定(bind)的东西不是问题。
不过,它可能会增加一点性能损失。在这种情况下,一个合理的 GL 实现可能不会做太多事情,但是您仍然可以调用 GL 库,它必须在它有机会什么都不做之前找到线程的当前上下文。因此,可能如果您将当前的 VAO 缓存在您身边并且只在它实际发生变化时才调用 GL,您的情况可能会更好。但这是只有分析/基准测试才能告诉您的事情。如果您有数千甚至数百万个实例,那可能会成为一个真正的问题 - OTOH,如果每个实例都有一个单独的绘制调用,那么无论如何你都会被搞砸 - 在这种情况下你应该研究实例化渲染。
Also, I saw a tutorial some time ago that used to call glBindVertexArray(0) at the end of render(). Wouldn't that be a potential performance loss when there are many shapes?
是的。大多数教程这样做是为了一些“清洁”,但在大多数情况下这确实是在浪费时间。如果您可以(并且实际上打算)在“未绑定(bind)”状态下执行某些操作,则取消绑定(bind)某些 GL 对象只是一个有用的操作——比如 FBO 0,它只是默认的帧缓冲区。对于 VAO,在核心配置文件中,VAO 0 完全没用,无论如何你都必须在绘制之前绑定(bind)一个 - 所以你通过取消绑定(bind)中间的任何其他 VAO 没有任何好处。
关于c++ - 调用 glBindVertexArray(vao) : what does it do if 'vao' is already bound, 以及如何相应地设计形状类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099253/
我遇到了一个恐怕很难解决的问题,至少就谷歌搜索而言是这样。 我有一个使用 Qt 的编辑器实用程序,它为编辑器中的不同工具创建多个 OpenGL 上下文,它们是一个“世界”编辑器,它托管我的游戏场景的
我正在再次尝试 OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,所以我创建了一个 Shape 类,它有一个静态 VAO 成员,当第一个时调用 glGenVertexArrays(
环境:OpenGL 3.3+、C 编程、Windows。 我有一个函数,可以从模型加载所有顶点数据,但只返回 VAO id 和顶点数。在此过程中,它生成 VBO id,并将顶点数组数据传递到缓冲区..
假设我有 2 个不同的对象,每个对象都有自己的 VAO 和绘制调用。像这样的事情: void Object::Draw() { glBindVertexArray(vao); glDr
1 VAO 是 OpenGL 技术中提出来的 参考: 外链 其中有一段文字记录了 VAO 是什么: A Vertex Array Object (VAO) is an object which con
我最近使用顶点数组对象 (VAO) 编写了一些 OpenGL 3.3 代码,后来在英特尔图形适配器上对其进行了测试,令我失望的是,元素数组缓冲区绑定(bind)显然不是 VAO 状态的一部分,因为调用
我正在使用 OpenGL 编写一个小图形引擎(通过 OpenTK 和 C#)。 为了定义顶点属性,我有一个 VertexDeclaration 类,其中包含一组 VertexElement 结构,这些
我面临一个问题,我认为该问题与 VAO 相关,但我不确定.. 我不确定 VAO 的正确用法,我在 GL 初始化期间所做的很简单 glGenVertexArrays(1,&vao) 后跟 glBindV
假设我们将两个程序上的顶点属性位置绑定(bind)到相同的值。使用相同的顶点数组对象来使用这两个程序进行绘制是否正确? 最佳答案 定义“正确”。 如果两个程序对象使用兼容的属性位置,则它们使用相同的属
我一直在阅读一些有关 VAO 如何与 VBO 配合使用的内容。据我了解,当我们调用 glVertexAttribPointer 时,VAO 仅存储有关 VBO 的状态信息。我的问题是,它何时存储有关
我做了一个加载器类来加载 V.A.Os 纹理等但是当我使用这个方法时 GLuint Loader::loadToVAO(GLfloat* vertices) { GLuint VertexAr
据我所知,顶点获取阶段由 VAO 封装,并且 VAO 需要包含顶点获取阶段状态,以便在缓冲区对象和顶点属性之间进行管道传输以及格式化缓冲区对象中的数据。 我一直在阅读的关于这个主题的两本书,红皮书,蓝
我最近开始学习 OpenGL,我一直在尝试编写一个程序,使用带有着色器的 VAO 和 VBO 在屏幕上显示钻石。我的代码主要基于本教程: https://www.opengl.org/wiki/Tut
我刚刚开始使用 OpenGL,并且我正在尝试仅使用 3.x 及更高版本的功能。我不明白的一件事是 VAO。 我知道 VAO 封装了渲染状态,所以我可以在渲染循环之前调用所有设置函数,然后绑定(bind
VAO 是顶点数组对象,VBO 是顶点缓冲区对象。创建和绑定(bind)/解除绑定(bind) VAO 和 VBO 的调用具有如下一般格式: GLuint VAO, VBO; glGenVertexA
我希望在 Cocoa 上制作一个自定义的 NSOpenGL View 。但是,我在使用 VAO 时遇到了问题。特别是,运行时,这个虚拟测试 View : /// OpenGLTestView.h: @
我和我的 friend 正在开发一个使用 C++ 和 OpenGL 的项目。我们为“ModelObject”创建了一个C++类,每个ModelObject都有一个GLuint vao作为成员变量。然后
我很难理解 VAO 到底是如何处理缓冲区映射的。我正在做的事情可以用这个伪代码来描述: SetUp: BindVAO BindArrayBuffer glBufferData(GL_ARR
我想知道如果我想画画最好做什么超过约 6000 个不同的 VAO 使用相同的着色器。 目前,我绑定(bind)我的着色器,然后为其提供所需的所有信息(统一),然后循环遍历每个 VAO 来绑定(bind
目前我有一个包含 2 个缓冲区的系统,一个创建 CPU 端并设置为一个缓冲区。然后一个来自 ssbo 并从另一个着色器填充。 这是 ssbo 数据的结构: struct ssbo_data_t {
我是一名优秀的程序员,十分优秀!