我有一个未声明顶点属性的顶点着色器。它根据 UBO、gl_VertexId
和 gl_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/