簡體   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