Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance OpenGL渲染性能-默认着色器还是无着色器?_Performance_Opengl_Shader - Fatal编程技术网

Performance OpenGL渲染性能-默认着色器还是无着色器?

Performance OpenGL渲染性能-默认着色器还是无着色器?,performance,opengl,shader,Performance,Opengl,Shader,我有一些用于渲染视频的代码,因此它的OpenGL端(一旦渲染帧在目标纹理中可用)非常简单:只需将其渲染到目标矩形 让事情有点复杂的是,我正在使用第三方SDK来呈现UI,因此我无法知道它会对状态进行哪些更改,因此每次呈现帧时,我都必须确保正确设置了所需的所有状态 我使用顶点和纹理坐标缓冲区绘制矩形,如下所示: glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_RECTANGLE_ARB); glBindTexture(GL_

我有一些用于渲染视频的代码,因此它的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库中发生了什么,我是否可以跳过任何内容?)

现在我想知道——这更符合理论,因为我认为在绘制一个四边形时不会有太大的区别——如果理论上像上面那样渲染会更快,或者编写一个简单的默认顶点和片段着色器,它可能只返回ftTransform()对于位置,是否也使用片段颜色的默认方式


我想知道使用着色器是否可以跳过某些状态更改,或者通常可以加快速度。或者,如果在内部使用上面的代码OpenGL只是这样做,结果将完全相同?

如果您担心会破坏UI SDK状态,则应使用glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT)包装代码。。。glpopatrib()也是如此

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

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

关于加速:性能将由发送十个的成本决定?几百?将千字节的视频帧数据传输到GPU,添加或删除OpenGL调用不太可能有什么不同。我首先看一下UI和视频流之间可能存在的帧速率差异:例如,如果帧速率更快,则安排将视频数据复制一次并重新使用,而不是每次重新绘制UI时复制它


希望这能有所帮助。

谢谢你提供的信息,我知道在我的情况下,我不需要担心这个绘图对象的性能,我只想学习更多,改进更多的整体技术。谢谢你给我的提示,我会用的。如果您对我的渲染设置感兴趣,我在这里发布了另一个关于多线程问题的问题:-如果帧速率高于视频中通常的24 fps,我已经多次尝试重新绘制同一帧