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

glDrawArrays with count potentialy exceeding buffer size

我有一个没有声明顶点属性的顶点着色器。它根据 UBO、gl_VertexIdgl_InstanceID.

计算所有需要的值

know 必须绑定非零 VAO 才能呈现。

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

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

编辑:规范 link 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.

但是创建和绑定 "empty" VAO 解决了这个问题。请参阅第 580 页的 table - VAO 的初始(和有效)状态已禁用所有属性。