繁体   English   中英

glVertexAttribBinding的顺序绘制命令无法按预期工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM