gpt4 book ai didi

c++ - 在不同的 VBO 中存储不同的顶点属性

转载 作者:可可西里 更新时间:2023-11-01 17:39:39 26 4
gpt4 key购买 nike

是否可以将不同的顶点属性存储在不同的顶点缓冲区中?

到目前为止我见过的所有例子都是这样做的

float data[] = 
{
//position
v1x, v1y, v1z,
v2x, v2y, v2z,
...
vnx, vny, vnz,

//color
c1r, c1g, c1b,
c2r, c2g, c2b,
...
cnr, cng, cnb,
};
GLuint buffname;
glGenBuffers(1, &buffname);
glBindBuffer(GL_ARRAY_BUFFER, buffname);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);

绘图是这样完成的:

glBindBuffer(GL_ARRAY_BUFFER, buffname);
glEnableVertexAttrib(position_location);
glEnableVertexAttrib(color_location);
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, (void*)(3*n));

glDrawArrays(GL_TRIANGLES, 0, n/3);

glDisableVertexAttrib(position_location);
glDisableVertexAttrib(color_location);
glBindBuffer(GL_ARRAY_BUFFER, 0);

不是可以把位置数据和颜色数据存储在不同的VBO中吗?问题是我不明白这是怎么回事,因为你不能同时绑定(bind)两个缓冲区,是吗?

如果有一个简单但效率低下的解决方案,我会更喜欢它而不是一个更复杂但效率更高的解决方案,因为我处于初级学习状态,我不想让事情变得太复杂。

另外,如果我问的是可能的,这是个好主意吗?

澄清一下: 我确实了解如何在不同的 VBO 中存储不同的属性。我不明白我以后怎么画它们。

最佳答案

属性位置 X 和提供该属性的缓冲区对象之间的关联是通过 glVertexAttribPointer 建立的命令。它的工作方式很简单,但不直观。

当时glVertexAttribPointer被称为(这是很多人没有得到的部分),无论缓冲区对象当前绑定(bind)到GL_ARRAY_BUFFER与属性 X 关联,其中 X 是 glVertexAttribPointer 的第一个参数.

所以如果你想要一个来自一个缓冲区的属性和一个来自另一个缓冲区的属性,你可以这样做:

glEnableVertexAttrib(position_location);
glEnableVertexAttrib(color_location);
glBindBuffer(GL_ARRAY_BUFFER, buffPosition);
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, buffColor);
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, 0);

至于是否应该将属性拆分到不同的缓冲区...我会说只有在您有可证明的需要时才应该这样做。

例如,假设您正在制作动态高度图,可能是为了某种水效果。每个元素的 Z 位置发生变化,但这也意味着法线发生变化。但是,XY 位置和纹理坐标不会改变。

高效的流通常需要双缓冲缓冲区对象或使它们无效(使用 glBufferData(NULL) 或 glMapBufferRange(GL_INVALIDATE_BIT) 重新分配它们)。只有当流式数据位于非流式数据的另一个缓冲区对象中时,这两种方法才有效。

可证明需求的另一个示例是,如果内存是一个问题并且多个对象共享某些属性列表。也许对象具有不同的位置和法线数组,但具有相同的颜色和纹理坐标数组。或者类似的东西。

但除此之外,最好将一个对象的所有内容都放入一个缓冲区中。即使您不交错排列。

关于c++ - 在不同的 VBO 中存储不同的顶点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com