实例化渲染不正确

时间:2015-10-27 17:59:23

标签: c++ opengl rendering

以前,为了渲染一堆四边形,我只是使用了一些制服(一个用于模型矩阵,另一个用于纹理层ID),但是,我宁愿不必遍历每个四边形并设置两个每次制服,每一帧。

所以我继续寻找更好的替代方案,我可以用一个电话来渲染所有东西。

现在我正在使用实例渲染:

// In VAO definition            
glGenBuffers(1, &instanceVBO);
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glBufferData(GL_ARRAY_BUFFER, 0, nullptr, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(RenderingData), nullptr);
glVertexAttribDivisor(3, 1);
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(RenderingData), (GLvoid*)(sizeof(glm::vec4)));
glVertexAttribDivisor(4, 1);
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(RenderingData), (GLvoid*)(sizeof(glm::vec4) * 2));
glVertexAttribDivisor(5, 1);
glEnableVertexAttribArray(6);
glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(RenderingData), (GLvoid*)(sizeof(glm::vec4) * 3));
glVertexAttribDivisor(6, 1);
glEnableVertexAttribArray(7);
glVertexAttribIPointer(7, 1, GL_UNSIGNED_INT, sizeof(RenderingData), (GLvoid*)(sizeof(glm::mat4)));
glVertexAttribDivisor(7, 1);

// In quad adding function
instanceData.push_back(quad->data);
glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(RenderingData) * quads.size(), &instanceData[0], GL_DYNAMIC_DRAW);

// Rendering
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, quads.size());

我正在使用2个VBO:一个用于每顶点数据(位置,法线等矢量),另一个用于每个实例数据(模型矩阵和纹理层ID)。

我的问题如下:http://imgur.com/20Wb9pQ

正如你所看到的,中间和底部的图像没有正确渲染(中间的一个太拉伸,而底部的一个是不正确的,因为它们没有填满整个四边形),但是,我是98我确定我的顶点和实例数据都是正确的,因为当我使用前面提到的制服时,它们是正确渲染的。

此外,我 可能会 发现问题:索引。不知何故,如果我改变我的glDrawElementsInstanced的计数值,比如12个索引,中​​间的一个正确呈现,而另外2个,不要(证明:http://imgur.com/PDQqbuT),如果我将它们更改为18(最后一个)一个渲染正确,另一个2,不要)。

问题可能是什么?

0 个答案:

没有答案