我有一些用于渲染视频的代码,因此它的 OpenGL 端(一旦渲染帧在目标纹理中可用)非常简单:只需将其渲染到目标矩形。
让事情变得有点复杂的是,我使用第三方 SDK 来渲染 UI,所以我不知道它会改变什么状态,因此每次渲染帧时,我都必须确保我需要的所有状态都是正确设置。
我正在使用一个顶点和一个纹理坐标缓冲区来绘制我的矩形,如下所示:
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texHandle);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glVertexPointer(4, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, 4);
glPopClientAttrib();
(有什么我可以跳过的——即使不知道 UI 库中发生了什么?)
现在我想知道——这更具理论性,因为我认为只绘制一个 Quad 时不会有太大区别——如果理论上像上面那样渲染更快,或者改为编写一个简单的默认顶点和片段着色器无非是返回 ftransform() 的位置,并使用片段颜色的默认方式吗?
我想知道通过使用着色器是否可以跳过某些状态更改,或者通常加快速度。或者如果通过在内部使用上面的代码 OpenGL 只是这样做并且结果将完全相同?