【发布时间】:2018-02-06 08:01:48
【问题描述】:
我有一个没有声明顶点属性的顶点着色器。它根据 UBO、gl_VertexId 和 gl_InstanceID 计算所有需要的值。
我know 必须绑定非零 VAO 才能进行渲染。
那么使用大count 参数调用绘图命令是否合法,而当前VAO 状态下的缓冲区很小,即仅包含四个floats?由于某些平台上的隐式和未使用的读取,它可能会导致视频内存访问冲突吗?这样的绘图调用似乎在我的机器上运行良好,但我不确定在任何地方运行是否安全。
【问题讨论】:
-
我认为这是灾难的根源,因为您不知道驱动程序将来会如何发展,即使它今天可能在您的机器上运行。其次,为什么要超出自己的缓冲区?访问内存的方式与通常访问的方式不同吗?
-
@StarShine 我不想超出我的缓冲区。我的顶点着色器根本不访问任何顶点数组缓冲区。但是自上次绘制调用以来,某些缓冲区可能仍被绑定,并且如果它使用顶点属性,它可能比当前绘制调用可能访问的更短。我担心实现会隐式执行缓冲区访问。而“技巧”的目的是避免多余的VAO绑定调用。
-
听起来你最好使用计算着色器,让你正在做的事情更加明确。
-
@Robinson 我当时仅限于 OpenGL 3.0,所以我什至没有几何着色器。
-
@Sergey: "但自上一次绘图调用以来可能仍会绑定一些缓冲区" 如果您的 VS 没有任何输入,则相应的 VAO 不应启用任何数组属性。目前尚不清楚这里究竟关注的是什么,除非您试图避免更改 VAO 以匹配您正在渲染的内容。
标签: opengl language-lawyer access-violation vertex-shader