每个着色器属性的VBO没有VAO,或不同的方法

VBO per shader attribute without VAO, or different approach?

本文关键字:VAO 方法 没有 VBO 属性      更新时间:2023-10-16

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

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

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

我欣赏正常的路线是使用VAO,它允许您将多个vbo分配给相同的目标,但我不能使用它们,因为我的几何上下文是共享的,而VAO不是。这个问题有没有其他的解决办法?

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

您的问题与vao或缓冲区对象无关。vao不允许您拥有多个索引列表。他们不允许你有"正常面孔"。

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

你需要把你的顶点位置分成不同的面。所以你需要重复位置值,这样每个唯一的位置/法线对都是唯一的。vao不能绕过这个限制。

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