Opengl Vertex属性步幅

时间:2010-11-27 10:57:02

标签: c++ pointers opengl-es rendering

嘿。 我是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(浮动的大小)。
哦,还有一件事是显示器只是空的 有人可以帮帮我吗? 非常感谢。

2 个答案:

答案 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没问题,但如果您的法线规范化(可能是这种情况),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;
};