【发布时间】:2016-11-06 16:12:08
【问题描述】:
我对实例化绘图和每个实例数据比较熟悉:我过去成功地实现了这一点。
现在我正在重构一些旧代码,并且我引入了一个关于如何将每个实例数据提供给着色器的错误。 相关位如下:
- 我有一个使用 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 错误。
我的问题是:有谁知道在什么情况下每个实例数据的设置可能会静默失败?或者有关如何进一步调试此问题的任何建议?
【问题讨论】:
-
我不太了解设置。
Model不应该是统一的,它是一个常规属性(......顶点着色器的输入)。您只需在其上设置一个非零除数,然后它将在每个实例的基础上提供(实例编号 i 的所有顶点着色器调用都将获得 i / divisor i> 来自该属性数组的属性)。为什么在上面使用uniform?
标签: c++ opengl shader geometry-instancing