c++ - 如何在 VBO 中使用步幅参数?

标签 c++ opengl vbo

我在理解如何使用一个包含 3 种不同数据的缓冲区时遇到问题,我的 vert、text、color 数据具有以下结构:

struct xyzf {
    float x, y, z;
};
struct xyf {
    float x, y;
};

struct vertype {
    xyzf points[4];
};
struct textype {
    xyf points[4];
};
struct coltype {
    GLuint points[4];
};

struct buftype {
    vertype vertex;
    textype texcoord;
    coltype color;
};

然后我(尝试)以下列方式使用它(这对我来说最有意义):

glBindBufferARB(GL_ARRAY_BUFFER, mybufid);
glVertexPointer(3, GL_FLOAT, sizeof(buftype), 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(buftype), (GLvoid *)sizeof(vertype));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(buftype), (GLvoid *)(sizeof(vertype)+sizeof(textype)));

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_QUADS, 0, indices);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

glBindBufferARB(GL_ARRAY_BUFFER, 0); // unbind

但它失败了,它呈现的东西与我将步幅和指针全部设置为零所得到的不同。当我这样做时,我得到了正确渲染的顶点数据,但文本/颜色仍然不正确。

我不能将 &data[0].vertex 用于 glVertexPointer() 等中的最后一个参数,因为自从我使用 VBO 以来我就没有数据了,该方法仅适用于顶点数组。

我也不确定 glDrawArrays() 的计数值是如何工作的,我读过文档说它是索引,所以四边形应该有 4,对吗?但是当我将四边形的数量乘以 4 时,它只渲染了一半的顶点,这是怎么回事? (如果我乘以 8,它将全部呈现它们...)

最佳答案

您似乎是按四边形交错数据,但您应该按顶点交错数据(至少通常是这样做的)。

如果您将顶点布局更改为这样,您的代码应该是正确的:

xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba

而不是

xyzxyzxyzxyz
uvuvuvuv
rgbargbargbargba

关于c++ - 如何在 VBO 中使用步幅参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6641573/

相关文章:

opengl - 如何在 z=0 平面中将 2D 变换矩阵(用于齐次坐标)转换为 3D?

math - 缩放至兴趣点

python - 如何在python中正确删除VBO?

java - 纹理未正确渲染 LWJGL

c++ - 带初始化的while语句

C++ : Slicing to base rvalue?

python - 如何像 3ds max 一样实现 alt+MMB 相机旋转?

opengl - 顶点数组对象和顶点缓冲区对象的使用

c++ - 将 vector 传递给函数

c++ - 在内存泄漏等方面还可以吗