我对实例绘图和每个实例数据比较熟悉:我过去成功地实现了这一点。
现在我正在重构一些旧代码,并且我引入了一个关于如何将每个实例数据提供给着色器的错误。相关位如下:
- 我有一个使用glMultiDrawElementsIndirect实现的工作渲染循环:如果我忽略每个实例数据,一切都会按预期绘制。
我有一个 vbo 存储我的对象的世界变换。我使用 AMD 的CodeXL进行调试:缓冲区正确填充了数据,并且在绘制框架时被绑定。
glBindBuffer(GL_ARRAY_BUFFER,batch.mTransformBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * OBJ_NUM, &xforms, GL_DYNAMIC_DRAW);
着色器明确指定输入位置:
#version 450 layout(location = 0) in vec3 vertexPos; layout(location = 1) in vec4 vertexCol; //... layout(location = 6)uniform mat4 ViewProj; layout(location = 10)uniform mat4 Model;
矩阵对于所有实例都是相等的ViewProj
,并且使用以下方法正确设置:
glUniformMatrix4fv(6, 1, GL_FALSE, &viewProjMat[0][0]);
Model
每个实例的世界矩阵是错误的:包含全零。
在绑定缓冲区和绘制每一帧之前,我试图设置属性指针和除数,使每个绘制的实例都会收到不同的变换:
for (size_t i = 0; i < 4; ++i)
{
glEnableVertexAttribArray(10 + i);
glVertexAttribPointer(10 + i, 4, GL_FLOAT, GL_FALSE,
sizeof(GLfloat) * 16,
(const GLvoid*) (sizeof(GLfloat) * 4 * i));
glVertexAttribDivisor(10 + i, 1);
}
现在,我已经查看了一段时间的代码,我真的无法弄清楚我错过了什么。CodeXL 清楚地显示模型(位置 10)未正确填充。不会产生 OpenGL 错误。
我的问题是:有谁知道在哪种情况下每个实例数据的设置可能会静默失败?或有关如何进一步调试此问题的任何建议?