Fragment Shader noob需要知道为什么这会导致驱动程序崩溃

时间:2016-11-19 16:23:45

标签: webgl shader fragment-shader

我正在尝试学习WebGL,我有以下片段着色器。到目前为止,我实际上设法让我的PC自动重置,并且Windows也通知我的图形驱动程序崩溃并重新启动。全部通过浏览器中的JS!

现在我已经进步到没有任何反应的地步,只是WebGL渲染器进入休眠状态。下面的代码并不打算做任何事情,我只是在学习语法,所以不要担心它不会在屏幕上放任何东西,但问题是为什么这样做杀了我的GPU?

 precision mediump float;

        uniform sampler2D  tex;



        void main(void) 
        {
            const int gsl=1024;
            vec4 texel=vec4(0.5, 0.5, 0.5, 1.0);
            for(int i = 0; i < gsl; i++)
            {
                float xpos=mod(float(i),256.0);
                float ypos=float(i)/256.0;
                vec2 vTextureCoord=vec2(xpos,ypos);
                texel=  texture2D(text, vTextureCoord); 

            }

            gl_FragColor = texel;

        }

1 个答案:

答案 0 :(得分:4)

很可能是因为着色器太慢了。

与CPU不同,GPU没有可抢占的多任务处理(至少目前还没有)。这意味着当你给GPU做一些事情时,它必须完成它。没有像CPU那样打断它。

因此,例如,如果您要求GPU绘制1000000全屏多边形,即使快速GPU将需要几秒钟,在此期间它不会做任何其他事情。类似地,如果你给它一个非常昂贵的每像素片段着色器并用它绘制很多像素,那么GPU将不会被中断很长时间。如果你给了它30分钟的东西,用户就不能使用他们的机器30分钟

解决方案是OS时间每个GPU操作需要多长时间。如果它需要太长时间(比如2-3秒),那么操作系统就会重置GPU。此时操作系统不知道GPU在当前操作中有多远。一个好的操作系统/驱动程序然后只会杀死发出错误绘制调用的一个上下文。较旧的操作系统会杀死所有程序中的所有上下文。

当然注意太长取决于GPU。快速GPU可以在瞬间完成任务,而慢速GPU可能需要几秒钟。不同的GPU也有不同类型的优化。

TL; DR:您的着色器可能已崩溃,因为它运行速度太慢且操作系统重置了GPU。