为什么简单的着色器比标准管道慢?

时间:2015-02-02 21:32:21

标签: opengl glsl fragment-shader vertex-shader

我想编写一个非常简单的着色器,它相当于(或更快)标准管道。但是,即使是最简单的着色器也是如此:

顶点着色器

void main(void)
{
  gl_TexCoord[0] = gl_MultiTexCoord0;
  gl_Position = ftransform();
}

片段着色器

uniform sampler2D Texture0;

void main(void)
{
  gl_FragColor = texture2D(Texture0, gl_TexCoord[0].xy);
}

与标准着色器相比,我的帧速率减半,如果显示一些透明图像,则表现可怕。我不明白这一点,因为标准着色器(glUseProgram(0))执行光照和alpha混合,而此着色器仅绘制平面纹理。是什么让它如此缓慢?

3 个答案:

答案 0 :(得分:1)

看起来自定义着色器的大幅减速是旧的英特尔图形芯片的一个问题,它似乎模仿CPU上的着色器。

我在最近的硬件上测试了相同的程序,并且启动了自定义着色器的帧丢失只有大约2-3%。

编辑:错误的理论。请参阅下面的新答案

答案 1 :(得分:0)

我认为你可能会过度透支。

我不知道你使用着色器的引擎是什么,但如果你有alpha混合,那么你最终可能会过度分配。

以这种方式思考:

如果您有一个800x600的屏幕,并且整个屏幕上有一个2D四边形,那么2D四边形将有480000个片段着色器调用,尽管它只有4个顶点。

现在,进一步说,让我们假设你有10个这样的四边形,在另一个上面。如果您没有从前到后对几何体进行排序,或者如果您使用没有深度测试的alpha混合,那么最终将得到10x800x600 = 4800000个片段调用。

由于过度绘制,2D通常在OpenGL上非常昂贵。 3D拒绝许多碎片。事件着色器更复杂,与2D对象相比,3D对象的调用次数大大减少。

答案 2 :(得分:0)

经过长时间的调查,简单着色器的减速是由着色器太简单引起的。

在我的情况下,减速是由文本渲染引擎引起的,它大量使用了" glBitmap",在启用纹理的情况下会很慢(无论出于何种原因我都无法理解;这些字母是小)。

然而,这并没有影响标准管道,因为它会确认功能 glDisable(GL_LIGHTING) glDisable(GL_TEXTURE_2D),这可以避免减速,而简单的着色器未能这样做,因此甚至可以做更多的工作作为标准管道。在将这两个功能引入自定义着色器之后,它与标准管道一样快,并且能够添加随机效果而不会对性能产生任何影响!

相关问题