每个着色器属性的VBO没有VAO,或不同的方法
VBO per shader attribute without VAO, or different approach?
我在我的应用程序中使用各种'嵌套'上下文(用于着色器和几何共享),所以我不能使用VAOs,因为它们不能跨上下文共享。
我的网格数据存储在一个VBO中作为唯一顶点的"池",而在另一个VBO中,我存储构成面的索引。我目前在我的CAD应用程序中成功地使用了这个线框渲染,但我想添加一个平面阴影模式-为此我需要面法线。
如果我需要顶点法线,我只需将数据附加到顶点位置数据,但我不能在这里这样做,因为一个顶点会有不同的面法线,这取决于它属于哪个面被渲染。理想情况下,我想创建另一个VBO对持有我的脸法线和指数,但是我不能绑定两个VBO到同一个目标没有VAO -即使它们在不同的属性中使用。
我欣赏正常的路线是使用VAO,它允许您将多个vbo分配给相同的目标,但我不能使用它们,因为我的几何上下文是共享的,而VAO不是。这个问题有没有其他的解决办法?
如果我需要顶点法线,我只需将数据附加到顶点位置数据,但我不能在这里这样做,因为一个顶点会有不同的面法线,这取决于它属于哪个面被渲染。理想情况下,我想创建另一个VBO对持有我的脸法线和指数,但是我不能绑定两个VBO到同一个目标没有VAO -即使它们在不同的属性中使用。
您的问题与vao或缓冲区对象无关。vao不允许您拥有多个索引列表。他们不允许你有"正常面孔"。
顶点数组对象只不过是一个存储顶点属性绑定的容器。它们不能让你做任何没有它们你做不到的事情;有一种简单方便的方法可以更改所有属性绑定。
你需要把你的顶点位置分成不同的面。所以你需要重复位置值,这样每个唯一的位置/法线对都是唯一的。vao不能绕过这个限制。
仅供参考:VAOs不被共享的原因是因为它们太简单而不需要共享。您可以很容易地在两个不同的上下文中设置相同的VAO。只需在您想要使用它的上下文中创建一个VAO,并按照您通常会做的操作来设置它。它只是一个简单的状态对象;它实际上不包含任何内容
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 每个着色器属性的VBO没有VAO,或不同的方法