嘿。
我是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(浮动的大小)。
答案 0 :(得分:6)
如果你有这样的结构,那么stride
只是sizeof SVertex
,每个属性都是一样的。这里没什么复杂的。
如果这不起作用,请在其他地方查找您的错误。
例如:
surface->GetIndexCount()/3
这个参数应该是要发送的顶点,而不是原始 的数量 - 因此我认为这个除以三是错误的。保留为:
surface->GetIndexCount()
答案 1 :(得分:2)
然后我用了 “glVertexAttribPointer(索引,3,GL_FLOAT,GL_FALSE,步幅,V);” 指向顶点数组。该 index是属性I之一 想要使用,其他一切都还可以 除了步幅
这对texcoord不起作用(你有2x 2花车或1x 4花车)。
关于大步,就像科斯所说的那样,我认为你应该迈出16 * sizeof(float)
(你SVertex
的大小)的步伐。
另外值得一提的是。你说你想要优化性能。为什么不将顶点压缩到最大值,并抑制冗余值?这样可以节省大量的带宽。
x, y, z
没问题,但如果您的法线规范化(可能是这种情况),nx
和ny
就足够了。您可以在顶点着色器nz
中提取(假设您具有着色器功能)。同样适用于tx
和ty
。您根本不需要bx, by, bz
,因为您知道它是normal
和tangent
的交叉产品。
struct SPackedVertex
{
float x,y,z,w; //pack all on vector4
float nx,ny,tx,ty;
float tu1,tv1;tu2,tv2;
};