簡體   English   中英

Opengl Vertex屬性步幅

[英]Opengl Vertex attribute stride

嘿。 我是OpenGL ES的新手,但我已經擁有了普通OpenGL的經驗。 我被告知,由於優化避免緩存未命中,使用隔行掃描數組作為頂點緩沖區要快得多。
我開發了一個頂點格式,我將使用它看起來像這樣

struct SVertex
{
    float x,y,z;
    float nx,ny,nz;
    float tx,ty,tz;
    float bx,by,bz;
    float tu1,tv1;
    float tu2,tv2;
};

然后我使用了“glVertexAttribPointer(index,3,GL_FLOAT,GL_FALSE,stride,v);” 指向頂點數組。 索引是我想要使用的屬性之一,除了步幅之外,其他一切都沒問題。 在我決定將其添加到等式之前,它起作用了。 我通過了尺寸(SVertex)和13 * 4這樣的步幅,但它們似乎都沒有效果。
如果它有任何重要性,我會畫這樣的原語

glDrawElements(GL_TRIANGLES,surface->GetIndexCount()/3,GL_UNSIGNED_INT,surface->IndPtr());
在OpenGL規范中寫道,步幅應該是從屬性末尾(在本例中為z)到同一類型的下一個屬性(在本例中為x)的字節大小。 所以通過我的計算,這應該是13(nx,ny,nz,tx,ty ...... tuv2,tv2)乘以4(浮點數的大小)。
哦,還有一件事是顯示器只是空的。
有人可以幫我這個嗎?
非常感謝。

如果你有這樣的結構,那么stride只是sizeof SVertex並且它對於每個屬性都是相同的。 這里沒什么復雜的。

如果這不起作用,請在其他地方查找您的錯誤。

例如這里:

surface->GetIndexCount()/3

這個參數應該是頂點的數量,而不是要發送的基元 - 因此我認為這個除以三是錯誤的。 保留為:

surface->GetIndexCount()

然后我使用了“glVertexAttribPointer(index,3,GL_FLOAT,GL_FALSE,stride,v);” 指向頂點數組。 索引是我想要使用的屬性之一,除了步幅之外,其他一切都沒問題

這對texcoord不起作用(你有2x 2浮點數或1x 4浮點數)。

關於大步,就像科斯所說,我認為你應該通過16 * sizeof(float) (你的SVertex的大小)的SVertex

還有一件事值得一提。 你說你想要優化性能。 為什么不將頂點壓縮到最大值,並抑制冗余值? 這樣可以節省大量帶寬。

x, y, z是正常的,但是如果你的法線被標准化,則nxny是自給自足的(可能是這種情況)。 您可以在頂點着色器nz提取(假設您具有着色器功能)。 同樣的事情適用於txty 你根本不需要bx, by, bz ,因為你知道它是normaltangent的交叉積。

struct SPackedVertex
{
    float x,y,z,w;       //pack all on vector4
    float nx,ny,tx,ty;
    float tu1,tv1;tu2,tv2;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM