C++ 如何更快地绘制多个纹理四边形,并保留glScissor(或类似的东西)?
我正在使用OpenGL4和C++11 目前,我使用带有独立VBO和IBO的独立VAO对C++ 如何更快地绘制多个纹理四边形,并保留glScissor(或类似的东西)?,c++,performance,opengl,C++,Performance,Opengl,我正在使用OpenGL4和C++11 目前,我使用带有独立VBO和IBO的独立VAO对GLDrawerElements进行了大量单独调用 我这样做是因为纹理坐标会随着每个坐标的变化而变化,而我的顶点数据以纹理坐标为特征。我知道在这个顶点数据中有一些冗余的位置信息;但是,它总是-1,-1,1,1,因为我在顶点着色器中使用平移和缩放矩阵来定位和缩放顶点数据 VAO、VBO、IBO、位置和比例矩阵以及纹理ID存储在对象中。它是每个四边形一个对象 当前,某些图形将如下所示: 通过(glpaurement
GLDrawerElements
进行了大量单独调用
我这样做是因为纹理坐标会随着每个坐标的变化而变化,而我的顶点数据以纹理坐标为特征。我知道在这个顶点数据中有一些冗余的位置信息;但是,它总是-1,-1,1,1,因为我在顶点着色器中使用平移和缩放矩阵来定位和缩放顶点数据
VAO、VBO、IBO、位置和比例矩阵以及纹理ID存储在对象中。它是每个四边形一个对象
当前,某些图形将如下所示:
glpaurements(GL\u三角形,6,GL\u UNSIGNED\u INT,0)
)绘制四元对象。绑定的VBO仅为-1,-1,1,1,IBO为我绘制了一个四边形。绑定的VBO包含公共纹理的纹理坐标(用于对所有绘制的四边形进行纹理处理的相同纹理)。着色器上的矩阵变换将其定位glEnable(GL\u-SCISSOR\u测试)
被调用,预览四元组的位置信息用于调用glScissor
glBufferSubData
并在绘制每个四边形之前更新纹理坐标?这是性能更好还是更差(为每个对象调用glbinvertexarray
,还是调用glBufferSubData
)
如果我仍然将位置和比例作为矩阵传递给着色器,我会利用这个机会更新顶点的位置信息以及纹理坐标吗?哪个更快glDraw
呼叫;听起来很快。这是真的吗?单个glBindVertexArray
调用对多个调用有什么样的性能影响
我不认为有任何方法可以使用这种方法来实现像我现在正在进行的glScissor
调用这样的东西glScissor
测试的事情,这个布尔数组定义了当前四元组是否应该只在前一个四元组的边界内绘制。然而,我认为这意味着,对于每个gl_InstanceID
,我必须遍历所有以前的实例,寻找真值和假值,而且速度似乎很慢- 使用单个vbo,在其中存储四元id(int)+纹理数据
- 准备x、y、w、h纹理,定义从四边形id到该纹理texcoord的映射,即:u=四边形id&0xFF,v=(四边形id>>8)(对于纹理256x256最大65536四边形)
- 使用顶点着色器从该纹理采样置换和大小(对于存储在属性中的给定四边形id(或使用顶点id/4或顶点id/6))
- 填充vbo和纹理
- 使用绘图元素的单个绘图数组绘制所有内容
gl\u InstanceID
作为我的QuadID?这会使它更快吗?因为这样就不需要通过任何东西;我可以使用两种纹理,一种带有位置,另一种带有我实际可见纹理的UV坐标?是的,实际上你不需要传递任何东西。但是许多GL实现者不喜欢我
glBindBuffer(GL_ARRAY_BUFFER,buf1);
glVertexAttribPointer(0, ...);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,buf2);
glVertexAttribPointer(1, ...);
glEnableVertexAttribArray(1);