繁体   English   中英

为什么片段着色器比仅渲染纹理要快?

[英]Why fragment shader is faster than just rendering texture?

我检查了一下,得到了关于C ++&OpenGL&GLSL性能的奇怪结果。

在第一个程序中,我使用片段着色器将像素绘制为纹理,然后渲染该纹理。 贴图的mag \\ min为GL_NEAREST

在第二个程序中,我使用了片段着色器并将其直接渲染到屏幕上。

为什么第二个程序更快? 渲染纹理不是重复相同的动作就更快吗?

这就像拍摄AAA游戏的视频,然后将其显示在同一台计算机上,并获得较低的FPS。

片段着色器是:

uniform int mx,my;

void main(void) {
    vec2 p=gl_FragCoord.xy;
    p-=vec2(mx,my);
    if (p.x<0.0)
        p.x=-p.x;
    if (p.y<0.0)
        p.y=-p.y;
    float dis=sqrt(p.x*p.x+p.y*p.y);
    dis+=(abs(p.x)+abs(p.y))-(abs(p.x)-abs(p.y));
    p.x/=dis;
    p.y/=dis;
    gl_FragColor=vec4(p.x,p.y,0.0,1.0);
}

与性能问题一样,通常要确定的唯一方法是使用探查器。

也就是说,我的猜测是这主要是处理带宽与内存带宽的问题。 为了渲染纹理,处理器必须从内存的一部分读取数据,并将相同的数据写回到内存的另一部分。

要直接从着色器进行渲染,处理器仅需将输出写入内存,而无需从内存中读取数据。

因此,有一个问题是哪个更快:从内存中读取特定数据,还是由处理单元生成? 着色器中的数学运算非常简单(基本上唯一复杂的部分是sqrt )-因此至少对于您的特定硬件而言,似乎计算结果要比从内存中读取结果更快(至少给定其他内存访问同时进行等)

请注意,两者(着色器与纹理)具有完全不同的特征。 读取纹理将几乎保持恒定的速度,而不管创建纹理涉及的计算的复杂程度如何。 不用说很明显,但是如果计算简单,则着色器将快速运行,但是如果计算复杂,则着色器将缓慢运行(可能很多)。 在您提到的AAA游戏中,可以猜测至少有一些着色器使用了足够复杂的计算,几乎可以肯定它们会比纹理读取慢。 在相反的极端情况下,真正琐碎的着色器(例如,仅将片段颜色从输入传递到输出的着色器)可能比从纹理读取要快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM