0

我有一些用于渲染视频的代码,因此它的 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 只是这样做并且结果将完全相同?

4

1 回答 1

2

如果您担心破坏 UI SDK 状态,您也应该使用 glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT) ... glPopAttrib() 包装代码。

您可以通过使用顶点数组对象稍微简化状态管理代码。

至于使用着色器,对于这个简单的程序,我不会打扰。这将是您必须保存和恢复的一种状态,而且您是对的,OpenGL 内部可能只是为了相同的结果而这样做。

关于加快速度:性能将由发送 10 的成本主导?数百?千字节的视频帧数据到 GPU,添加或删除 OpenGL 调用不太可能产生影响。我会首先查看 UI 和视频流之间帧速率的可能差异:例如,如果帧速率更快,则安排将视频数据复制一次并重新使用,而不是每次 UI 时都复制它重绘。

希望这可以帮助。

于 2012-05-21T07:11:32.373 回答