我有一个结构Vertex {glm :: vec4 t,n,v;}。我编写了一个obj加载器,它接受两个参数,obj文件路径为字符串,并引用了'Vertex'es的向量。这个函数填充我的向量并返回索引的数量(在我的情况下,索引只是序列号,无论如何)。
由于我有6个物体要渲染,在使用该功能6次后,我有以下
vector<Vertex> objects[6];
GLint SIZES[6],OFFSETS[6],SIZES_I[6],OFFSETS_I[6];
填充。 SIZES是'Vertex'es(object [i] .size())的数量,SIZES_I是索引的数量。偏移量计算如下
for(int i=0;i<6;i++)
{
if(i==0)
{
OFFSETS[0]=0;OFFSETS_I[0]=0;
}
else
{
OFFSETS[i]=OFFSETS[i-1]+SIZES[i-1];
OFFSETS_I[i]=OFFSETS_I[i-1]+SIZES_S[i-1];
}
}
我将Vertex的矢量背对背地转移到单个VBO中。类似地对于索引,转移到绑定到元素数组缓冲区的缓冲区。该部分如下所示。
glBufferData(GL_ARRAY_BUFFER,(OFFSETS[5]+SIZES[5])*sizeof(Vertex),data,GL_STATIC_DRAW);
for(int i=0;i<6;i++)
{
glBindVertexBuffer(i,buffer[0],OFFSETS[i]*sizeof(Vertex),sizeof(Vertex));
}
glBufferData(GL_ELEMENT_ARRAY_BUFFER,(OFFSETS_I[5]+SIZES_I[5])*sizeof(GLuint),indices,GL_STATIC_DRAW);
glVertexAttribFormat(0,4,GL_FLOAT,GL_FALSE,offsetof(Vertex,v));
现在出现了我的问题。在下面显示的两个渲染代码中,第一个不起作用,但第二个完美无缺。
for(int i=0;i<6;i++)
{
glVertexAttribBinding(0,i);
glDrawElements(GL_TRIANGLES,SIZES_I[i],GL_UNSIGNED_INT,reinterpret_cast<void*>(OFFSETS_I[i]*sizeof(GLuint));
}
//second
glVertexAttribBinding(0,0);
for(int i=0;i<6;i++)
glDrawElementsBaseVertex(GL_TRIANGLES,SIZES_I[i],GL_UNSIGNED_INT,reinterpret_cast<void*>(OFFSETS_I[i]*sizeof(GLuint)),OFFSETS[i]);
总结说我做了什么,所以你们可以理解这里发生了什么,在第一种情况下,我在同一个缓冲区上创建了6个缓冲区绑定,有6个偏移量。在第二种情况下,只有一个绑定,但我使用基顶点偏移6次。顺便说两下都在编译,所以在我的标签中键入所有这些时忽略任何拼写错误。
我第一次尝试调试:由于基本顶点方法正常,obj加载器很好。无论如何要确保它,我只加载了一个模型。工作正常。
我的第二次尝试调试:我的怀疑自然落在绑定电话和抵消上。为了解决这个问题,我在第一个方法中删除了for循环并用0初始化了i(因为第二种方法,即基本顶点方法有效,我们不打扰它)。我的第一个模特出现在屏幕上。接下来我用1初始化'i'变量。我的第二个模型显示在屏幕上。我重复这个直到i = 5。我的6个模型中的每一个都正确显示。所以我的模型是单独显示的。但是当我按顺序组合我的电话时,我会得到一些完整的模型,一些部分模型,一些根本没有。
我的第三次调试尝试:似乎只显示了最后2个型号。不绘制或部分绘制剩余的。所以我从i = 5开始反转我的for循环并递减。现在显示前两个模型等(这里'前两个'和'后两个'指的是在obj阅读器中加载模型的顺序。我没有改变它)。就好像随后的绘图命令以某种方式使早期绘图命令的工作消失。有点。
多数民众赞成。在这里,我走到了尽头。任何想法可能出错或如何进行进一步的调试?
答案 0 :(得分:0)
原来这是由于我的驱动程序中的一个错误。相同的代码在我的同事的计算机上工作。