opengl - glDrawArrays 的计数可能超过缓冲区大小

标签 opengl language-lawyer access-violation vertex-shader

我有一个未声明顶点属性的顶点着色器。它根据 UBO、gl_VertexIdgl_InstanceID 计算所有需要的值。

know必须绑定(bind)非零 VAO 才能渲染。

那么,在当前 VAO 状态下的缓冲区很小(即仅包含四个 float )的情况下,调用具有大 count 参数的绘图命令是否合法?由于某些平台上的隐式和未使用的读取,可能会导致视频内存访问冲突吗?这样的绘制调用似乎在我的机器上运行良好,但我不确定它在任何地方运行是否安全。

最佳答案

这是完全合法的。非零 VAO 并不意味着属性计数不能为零。如果属性为零,则不会从顶点缓冲区读取任何内容。

编辑:规范链接 https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf

Client vertex and index arrays - all vertex array attribute and element array index pointers must refer to buffer objects. The default vertex array object (the name zero) is also deprecated. Calling VertexAttribPointer when no buffer object or no vertex array object is bound will generate an INVALID_- OPERATION error, as will calling any array drawing command when no ver tex array object is bound.

但是创建并绑定(bind)“空”VAO 可以解决问题。请参阅第 580 页上的表格 - VAO 的初始(有效)状态已禁用所有属性。

关于opengl - glDrawArrays 的计数可能超过缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48638116/

相关文章:

python - 为什么 for 循环中允许任意目标表达式?

c - 访问冲突,读取指针数组时出现未处理的异常

opengl - OpenGL中glTexSubImage和glTexImage函数的区别

c++ - opengl 代码是否在 GPU 上运行?

opengl - 如何让多边形抗锯齿工作?

c - 什么是 C 中的复合类型?

opengl - glBindVertexBuffer 与 glBindBuffer

c - strftime 和非标准化日期/时间

c++ - 我的代码有什么问题? (pdcurses/getmaxyx)

java - 我可以在崩溃的 OS API 周围放置 try/catch 吗?