0

我在我的应用程序中使用了各种“嵌套”上下文(用于着色器和几何共享),所以我不能使用 VAO,因为它们不能跨上下文共享。

我的网格数据作为唯一顶点的“池”存储在一个 VBO 中,在另一个 VBO 中存储构成面的索引。我目前正在我的 CAD 应用程序中成功地使用它进行线框渲染,但我想添加一个平面阴影模式 - 为此我需要面部法线。

如果我需要顶点法线,我只需将数据附加到顶点位置数据,但我不能在这里这样做,因为顶点将具有不同的面法线,具体取决于它属于哪个面正在被渲染。理想情况下,我想创建另一个 VBO 对来保存我的面部法线和索引,但是如果没有 VAO,我无法将两个 VBO 绑定到同一个目标 - 即使它们用于不同的属性。

我很欣赏正常的路线是使用 VAO,它可以让您将多个 VBO 分配给同一个目标,但我不能使用它们,因为我的几何上下文是共享的,而 VAO 不是。这个问题有其他解决方案吗?

4

1 回答 1

4

如果我需要顶点法线,我只需将数据附加到顶点位置数据,但我不能在这里这样做,因为顶点将具有不同的面法线,具体取决于它属于哪个面正在被渲染。理想情况下,我想创建另一个 VBO 对来保存我的面部法线和索引,但是如果没有 VAO,我无法将两个 VBO 绑定到同一个目标 - 即使它们用于不同的属性。

您的问题与 VAO 或缓冲区对象无关。VAO 不允许您拥有多个索引列表。它们不允许您拥有“面部法线”。

顶点数组对象只不过是存储顶点属性绑定的容器。它们不能让你做任何没有它们你就不能做的事情;有一种简单的方法可以更改所有属性绑定。

您需要将顶点位置分解为不同的面。因此,您需要复制位置值,以便每个唯一位置/法线对都是正确唯一的。VAO 没有绕过这个限制。

仅供参考:不共享 VAO 的原因是因为它们太简单而无法共享。您可以很容易地在两个不同的上下文中设置相同的 VAO。只需在您想要使用它的上下文中创建一个 VAO,然后按照您通常所做的设置它。它只是一个简单的状态对象;它实际上不包含任何内容。

于 2011-12-10T20:09:01.933 回答