c++ - Opengl 顶点属性跨度

标签 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);”指向顶点数组。索引是我想要使用的属性之一,除了步幅之外其他一切都很好。在我决定将其添加到等式之前它就起作用了。我通过了 sizeof(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( float 的大小)。
哦,还有一件事是显示器是空的。
谁能帮我解决这个问题?
非常感谢。

最佳答案

如果您有这样的结构,那么 stride 就是 sizeof SVertex 并且每个属性都相同。这里没有什么复杂的。

如果这不起作用,请在其他地方查找您的错误。

例如这里:

surface->GetIndexCount()/3

此参数应该是要发送的顶点数,而不是基元数 - 因此我会说这个除以三是错误的。保留为:

surface->GetIndexCount()

关于c++ - Opengl 顶点属性跨度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4291271/

相关文章:

ios - GL图纸 View 在旋转时清除图纸

c++ - 为指针或标量优化函数

c++ - 可以在构造函数中创建 Pthreads 吗?

android - 文本到语音 - 空指针异常

c - 返回指向子数组的指针

objective-c - 顶点数组对象 (VAO) 能否在 OpenGL ES 中的 EAGLContext 之间共享?

c++ - 我想知道为什么用 vector 可以成功而用数组却不行?

c++ - 使用 "redefinition"关键字时 "differs in levels of indirection"错误更改为 `auto`

无法理解如何从 C 中的函数返回字符串

ios - UIScrollView 损坏并停止使用 OpenGL 渲染滚动(相关 CADisplayLink、NSRunLoop)