[英]Sequential draw commands with glVertexAttribBinding not working as expected
我有一个结构顶点{glm :: vec4 t,n,v;}。 我已经编写了一个obj loader,它使用两个参数,obj文件路径作为字符串和对“顶点”向量的引用。 这个函数填充我的向量并返回索引的数量(在我的情况下,索引只是顺序编号)。
因为我有6个对象要渲染,所以在使用该函数6次之后,我得到以下内容
vector<Vertex> objects[6];
GLint SIZES[6],OFFSETS[6],SIZES_I[6],OFFSETS_I[6];
填充。 SIZES是“顶点”(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 loader很好。 无论如何要确保它,我只是加载了一个模型。 它的工作正常。
我的第二次调试尝试:我的怀疑自然落在绑定调用和偏移量上。 为了解决这个问题,我在第一种方法中删除了for循环,并用0初始化了i(因为第二种方法(即基本顶点方法有效),所以我们不用理会)。 我的第一个模特出现在屏幕上。 接下来,我用1初始化'i'变量。我的第二个模型显示在屏幕上。 我一直重复到i = 5。 我的6个模型中的每个模型均正确显示。 所以我的模型是单独显示的。 但是,当我依次组合调用时,我得到了一些完整的模型,一些局部的模型以及一些根本没有的模型。
我的第三次调试尝试:似乎只显示最后2个模型,因此显示。 其余未绘制或部分绘制。 因此,我从i = 5开始递减for循环并递减。 现在显示前两个模型,以此类推(这里的“前两个”和“后两个”指的是在obj reader中加载模型的顺序。我没有改变)。 好像后续的绘图命令以某种方式使早期绘图命令的工作消失了。 有点。
而已。 在这里,我死胡同了。 任何想法可能有什么问题,或者我应该如何进行进一步的调试?
原来,这是由于我的驱动程序中的错误所致。 相同的代码在我同事的计算机上工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.