Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有VAO的每个着色器属性的VBO,还是不同的方法?_C++_Opengl_Sharing_Vbo_Openglcontext - Fatal编程技术网

C++ 没有VAO的每个着色器属性的VBO,还是不同的方法?

C++ 没有VAO的每个着色器属性的VBO,还是不同的方法?,c++,opengl,sharing,vbo,openglcontext,C++,Opengl,Sharing,Vbo,Openglcontext,我在我的应用程序中使用各种“嵌套”上下文(用于着色器和几何体共享),因此我不能使用VAO,因为它们不能跨上下文共享 我的网格数据作为唯一顶点的“池”存储在一个VBO中,而在另一个VBO中,我存储组成面的索引。我目前正在我的CAD应用程序中成功地将其用于线框渲染,但我想添加一个平面着色模式-为此,我需要面法线 如果我需要顶点法线,我只需要将数据附加到顶点位置数据,但我不能在这里这样做,因为顶点将具有不同的面法线,这取决于它所属的面被渲染。理想情况下,我希望创建另一个VBO对来保存我的脸法线和索引,

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

我的网格数据作为唯一顶点的“池”存储在一个VBO中,而在另一个VBO中,我存储组成面的索引。我目前正在我的CAD应用程序中成功地将其用于线框渲染,但我想添加一个平面着色模式-为此,我需要面法线

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

我明白,通常的做法是使用VAO,它允许您将多个VBO分配给同一个目标,但我不能使用它们,因为我的几何体上下文是共享的,而VAO不是。这个问题有没有其他解决办法

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

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

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

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

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

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

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

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

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


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

谢谢您的快速回答。我怀疑这可能是真的,但让我吃惊的是OpenGL Superbible 5ed
“当前绑定缓冲区的记录在当前VAO中生成,并用于该属性。也就是说,GLVertexAttributePointer不仅告诉OpenGL可以找到顶点属性的缓冲区偏移量,还告诉OpenGL哪个缓冲区包含数据。因此,可以同时使用多个缓冲区-每个属性一个缓冲区。。。“
。这让我很困惑,因为将缓冲区绑定到绑定的目标会解除旧缓冲区的绑定。@cbamber85:没错。但使用不同的缓冲区对象并不意味着使用不同的索引来访问它们。对多个属性使用相同的缓冲区与对多个属性使用多个缓冲区之间没有功能上的区别。唯一的区别是属性数据来自何处。啊,这是有道理的,与我看到的完全相关。谢谢你的快速回答。我怀疑这可能是真的,但让我吃惊的是OpenGL Superbible 5ed
“当前绑定缓冲区的记录在当前VAO中生成,并用于该属性。也就是说,GLVertexAttributePointer不仅告诉OpenGL可以找到顶点属性的缓冲区偏移量,还告诉OpenGL哪个缓冲区包含数据。因此,可以同时使用多个缓冲区-每个属性一个缓冲区。。。“
。这让我很困惑,因为将缓冲区绑定到绑定的目标会解除旧缓冲区的绑定。@cbamber85:没错。但使用不同的缓冲区对象并不意味着使用不同的索引来访问它们。对多个属性使用相同的缓冲区与对多个属性使用多个缓冲区之间没有功能上的区别。唯一的区别是属性数据来自何处。啊,这是有道理的,并且与我所看到的完全相关。