如何在VBO中使用跨步参数
How to use the stride parameter in 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
但是它失败了,它呈现的东西比我设置stride和指针全部为0得到的东西要多。当我这样做,我得到我的顶点数据正确渲染,但文本/颜色仍然不正确。
我不能使用&data[0]。顶点在glVertexPointer()等最后一个参数,因为我没有数据了,因为我使用VBO,该方法只适用于顶点数组。
我也不确定glDrawArrays()的计数值是如何工作的,我读的文档说它是索引,所以一个四轴将有4,对吧?但是当我把四边形的数量乘以4时,它只渲染了一半的顶点,这是怎么回事?(如果我乘以8,它会渲染所有的)
似乎你是交叉你的数据每四边形,但你应该交叉它每顶点(至少这是通常所做的)。
如果你改变顶点布局,你的代码应该是正确的:
xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba
而不是
xyzxyzxyzxyz
uvuvuvuv
rgbargbargbargba
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 如何在VBO中使用跨步参数
- 使用VBO时,glVertexAttribPointer的最后两个参数