我的着色器工作正常,现在我想在同一渲染过程中添加变换反馈,只需在几何着色器out vec3 vertexPosition
中指定一个额外的变量。
然而,当我添加
glTransformFeedbackVaryings(_programHandle, _numVaryings, _varyings, _bufferMode);
然后我的drawCall:
glDrawElements(GL_TRIANGLES, meshRenderable._mesh->_indices.size(), GL_UNSIGNED_INT, NULL);
会导致访问冲突。
Exception thrown at 0x000000005851968A (atio6axx.dll) in Shady.exe: 0xC0000005: Access violation reading location 0x0000000000000014.
If there is a handler for this exception, the program may be safely continued.`
如果没有glTransformFeedbackVaryings
,则glDrawElements
调用正常。着色器由顶点着色器,几何着色器(将每个三角形转换为4个三角形)和片段着色器组成。
为什么指定transformFeedback变化会导致访问冲突?我甚至没有使用glGetBufferSubData
,也没有为TF创建缓冲区,我认为绑定的VAO很好,否则我不会在没有glTransformFeedbackVaryings
的情况下获得corect绘制调用!
我使用glGetString
验证是否支持EXT_transform_feedback
并且EXT显示并验证了返回Validation successful
的着色器。
更新:drawElements导致访问冲突的原因可能是因为我没有指定所有TF元素(没有缓冲区,没有TF对象,没有glBindBufferBase
)。我假设如果我从不打电话glBeginTransformFeedback
这不会引起任何副作用,因为没有变换反馈会激活。但是,这似乎是一个错误的假设。如果有人能够解释在没有设置其他TF对象的情况下指定变化是否有效以及为什么OpenGL需要对TF进行适当的设置,即使TF从未启用也是非常好的。