- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现我可以使用glBindBuffer(GL_ARRAY_BUFFER, vbo);绑定(bind)顶点缓冲区。这可行,我还可以使用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); 绑定(bind)元素数组。当使用这些时,一切都会根据需要绘制。
在阅读第 10.3.1 节中的 OpenGL 4.4 规范时,我发现提到了 glBindVertexBuffer
。看起来这允许绑定(bind)多个顶点缓冲区,然后同时渲染它们。它是否正确?另外,它与使用 glBindBuffer 有什么不同?与此绑定(bind)顶点缓冲区时可以使用元素数组缓冲区吗?
最佳答案
实际上,glBindVertexBuffer (...)
的意义完全不同。
在GL_ARB_vertex_attrib_binding
中引入时的想法的目的是分离顶点缓冲区和指针之间始终存在的固定映射,并将其替换为更灵活的系统,该系统允许您为顶点属性设置格式,绑定(bind)位置 em> 要使用的顶点缓冲区/属性,然后简单地交换绑定(bind)到该位置的缓冲区。
您不会简单地用这个新函数替换对 glBindBuffer (...)
的调用,您至少还需要调用两个其他函数来设置通用顶点属性,以便能够利用glBindVertexBuffer (...)
:
glVertexAttribFormat (...)
- 这实际上与 glVertexAttribPointer (...)
相同,只是它不设置指针,而只是确定如何解释与此属性配对的缓冲区。
glVertexAttribBinding (...)
- 这将通用属性位置与新类型的绑定(bind)位置(顶点缓冲区)相关联绑定(bind)),以便您可以使用 glBindVertexBuffer (...)
将您的 VBO 绑定(bind)到该属性将使用的位置。
glVertexBindingDivisor (...)
- 这是 glVertexAttribDivisor()
的替代品。此替换尊重由 glVertexAttribBinding(...)
建立的顶点属性索引和绑定(bind)槽索引之间的绑定(bind)关联。这是值得指出的,因为它的名称与上面列出的其他两个函数有些不符,而旧的 glVertexAttribDivisor()
看起来更符合形式,但使用的是错误的函数。
为了正确地理解这一点,我在扩展规范中添加了一些伪代码,这些伪代码展示了 glVertexAttribPointer (...)
如何与这个新的 API 添加相关。
void glVertexAttribPointer (GLuint index, GLint size, GLenum type,
GLboolean normalized, GLsizei stride,
const GLvoid *pointer);
void glVertexAttribIPointer (GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *pointer);
void glVertexAttribLPointer (GLuint index, GLint size, GLenum type,
GLsizei stride, const GLvoid *pointer);
控制顶点属性状态、顶点缓冲区绑定(bind)以及顶点属性与顶点缓冲区绑定(bind)之间的映射。
if (no buffer is bound to GL_ARRAY_BUFFER and pointer != NULL)
{
generate GL_INVALID_OPERATION;
}
glVertexAttrib*Format (index, size, type, {normalized, }, 0);
glVertexAttribBinding (index, index);
if (stride != 0) {
effectiveStride = stride;
} else {
compute effectiveStride based on size/type;
}
GL_VERTEX_ATTRIB_ARRAY_STRIDE[index] = stride;
// GL_VERTEX_BINDING_STRIDE will be set to effectiveStride
// by glBindVertexBuffer.
glBindVertexBuffer (index, <buffer bound to GL_ARRAY_BUFFER>,
(GLchar *)pointer - (GLchar *)NULL, effectiveStride);
<小时/>
一开始有点难以理解,但归根结底,这与 GL 3.3 中引入采样器对象时采样器状态与纹理对象的分离非常相似。您可以继续使用旧的 API,但这个替代解决方案为您提供了更大的灵 active 。
关于元素数组缓冲区,没有。 API 的这一新部分与此无关,因为顶点数组对象实际上管理唯一的元素数组缓冲区绑定(bind)。
关于opengl - glBindVertexBuffer 与 glBindBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21153729/
我目前这样做是为了设置我的 vao: glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); ... glBindBuffer(GL_E
根据NVIDIA's OpenGL 4.5 Update presentation的第23张幻灯片以下说法正确的是: 非 DSA:glGenBuffers + glBindBuffer DSA:glC
我正在阅读 this教程,我在如何使用顶点缓冲区接近尾声,我看到我生成并调用 glBindBuffer 的顶点缓冲区已经我必须第二次绑定(bind): glBindBuffer(GL_ARRAY_BU
我发现我可以使用glBindBuffer(GL_ARRAY_BUFFER, vbo);绑定(bind)顶点缓冲区。这可行,我还可以使用 glBindBuffer(GL_ELEMENT_ARRAY_BU
( Segmentation fault with glBufferData()) 上有一篇类似的帖子,但它没有解决我的问题。 当我在下面调用 glBingBuffer() 时第二个参数为 0 以解除
好吧,我从 OpenGL 开始,通过阅读有关 glBindBuffer 的文档,我有点困惑。 "glBindBuffer binds a buffer object to the specified
我对 VBO 感到困惑, glGenBuffers(1, &positionBufferObject); glBindBuffer(GL_ARRAY_BUFFER, positionBufferObj
我认为glBindBuffer(target, buffer)的作用是将缓冲区的地址存储在目标上,这是一个特殊的地址。 但我找到了glBindBufferBase(target, index, buf
在OpenGL(特别是OpenGL ES 2.0)中,每次绑定(bind)新的VBO时是否都需要调用glVertexAttribPointer? 例如: glBindBuffer(GL_ARRAY_B
我写这个是为了测试如何使用opengl缓冲区绘图,这是初始化的函数: #include "GL/glew.h" #include "GL/glfw.h" int main ( int argc
我是 OpenGL 和图形编程的新手。到目前为止,我一直在阅读一本非常透彻且写得很好的教科书。但是,我在代码中遇到了一个我不太理解的点,我想在我理解这些行之前继续前进。 GLuint abuffer;
这个问题在这里已经有了答案: OpenGL object in C++ RAII class no longer works (2 个答案) 关闭 5 年前。 好吧,我在设置我的 OpenGL 代码
上面有区别吗,因为它们看起来都具有相同的效果,我的假设是un-map buffer方法更适合un-mapping而不是绑定(bind)一个buffer到0来un-map 最佳答案 Is there a
glBindBuffer 等同于 glBindBufferARB 吗? 枚举(如 GL_ARRAY_BUFFER 和 GL_ARRAY_BUFFER_ARB)是否等价?我可以在 glBindBuffe
我读到在 OpenGL 2(尤其是 ES)中优化非透明对象渲染顺序的最佳方法是优先避免上下文更改(绑定(bind)不同的缓冲区、着色器程序等)而不是深度排序。 如果你用一个已经绑定(bind)的缓冲区
我一直在尝试在我的计算机上实现 VBO,但遇到了段错误: Unhandled exception at 0x00000000 in attocube.exe: 0xC0000005: Access v
要在 OpenGL 中创建一个统一的缓冲区对象,为什么我必须同时调用 glBindBuffer 和 glBindBufferRange?根据documentation , Think of glBin
我已经制作了一个顶点缓冲区,在使用 glDrawArrays 时可以正确绘制,但是它们无法加载到 VBO 中。这是代码: FloatBuffer circleBuffer = ByteBuffer.a
我正在尝试在 qt 5.1.1 中使用着色器使用 opengl 渲染编写 map 应用程序。我能够使用 Glew 显示顶点。但我想使用 qopenglfunctions.h 中提供的功能奇怪的是,即使
我有一个初始化我的 VBO/VAO 的方法: glBindBuffer(GL_ARRAY_BUFFER, mVBO_VertexShader); glBufferDat
我是一名优秀的程序员,十分优秀!