【问题标题】:glDrawArrays with count potentialy exceeding buffer size计数可能超过缓冲区大小的 glDrawArrays
【发布时间】:2018-02-06 08:01:48
【问题描述】:

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

know 必须绑定非零 VAO 才能进行渲染。

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

【问题讨论】:

  • 我认为这是灾难的根源,因为您不知道驱动程序将来会如何发展,即使它今天可能在您的机器上运行。其次,为什么要超出自己的缓冲区?访问内存的方式与通常访问的方式不同吗?
  • @StarShine 我不想超出我的缓冲区。我的顶点着色器根本不访问任何顶点数组缓冲区。但是自上次绘制调用以来,某些缓冲区可能仍被绑定,并且如果它使用顶点属性,它可能比当前绘制调用可能访问的更短。我担心实现会隐式执行缓冲区访问。而“技巧”的目的是避免多余的VAO绑定调用。
  • 听起来你最好使用计算着色器,让你正在做的事情更加明确。
  • @Robinson 我当时仅限于 OpenGL 3.0,所以我什至没有几何着色器。
  • @Sergey: "但自上一次绘图调用以来可能仍会绑定一些缓冲区" 如果您的 VS 没有任何输入,则相应的 VAO 不应启用任何数组属性。目前尚不清楚这里究竟关注的是什么,除非您试图避免更改 VAO 以匹配您正在渲染的内容。

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


【解决方案1】:

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

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

客户端顶点和索引数组 - 所有顶点数组属性和元素数组 索引指针必须指向缓冲区对象。默认顶点数组对象 (名称零)也已弃用。打电话 顶点属性指针 没有的时候 缓冲区对象或没有绑定顶点数组对象将生成一个 无效的_- 手术 错误,当没有验证时调用任何数组绘图命令 tex 数组对象已绑定。

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

【讨论】:

  • 很好的答案,但是您能否参考规范或官方 Khronos 文档来证明它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多