Webgl 片段着色器noob需要知道为什么这个驱动程序会崩溃

Webgl 片段着色器noob需要知道为什么这个驱动程序会崩溃,webgl,shader,fragment-shader,Webgl,Shader,Fragment Shader,我正在尝试学习WebGL,我有以下片段着色器。到目前为止,我已经成功地让我的电脑自动复位,并让Windows通知我的图形驱动程序崩溃并重新启动。浏览器中的所有JS 现在,我已经发展到一个什么也不发生的地步,只是WebGL渲染器进入休眠状态。下面的代码不打算做任何事情,我只是在学习语法,所以不要担心它不会在屏幕上显示任何东西,但问题是为什么这会杀死我的GPU precision mediump float; uniform sampler2D tex;

我正在尝试学习WebGL,我有以下片段着色器。到目前为止,我已经成功地让我的电脑自动复位,并让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;

        }
precision mediump float;
均匀采样2d-tex;
真空总管(真空)
{
常数int gsl=1024;
vec4 texel=vec4(0.5,0.5,0.5,1.0);
对于(int i=0;i
很可能是因为着色器太慢

与CPU不同,GPU没有可抢占的多任务处理(至少现在还没有)。这意味着当你给一个GPU一些事情去做的时候,它必须完成它。没有什么能像使用CPU那样中断它

例如,如果你要求一个GPU绘制1000000个全屏多边形,即使是一个快速的GPU也需要几秒钟的时间,在这段时间里,它什么也做不了。类似地,如果你给它一个非常昂贵的每像素片段着色器,并用它绘制大量的像素,它将需要很长的时间,在此期间GPU不能被中断。如果你给它的东西花了30分钟,用户在30分钟内不能使用他们的机器

解决方案是操作系统乘以每个GPU操作所需的时间。如果需要的时间太长(比如2-3秒),操作系统就会重置GPU。在这一点上,操作系统不知道GPU在当前操作中走了多远。一个好的OS/驱动程序只会杀死发出坏的draw调用的一个上下文。较旧的操作系统会杀死所有程序中的所有上下文

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


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

最有可能的原因是着色器太慢

与CPU不同,GPU没有可抢占的多任务处理(至少现在还没有)。这意味着当你给一个GPU一些事情去做的时候,它必须完成它。没有什么能像使用CPU那样中断它

例如,如果你要求一个GPU绘制1000000个全屏多边形,即使是一个快速的GPU也需要几秒钟的时间,在这段时间里,它什么也做不了。类似地,如果你给它一个非常昂贵的每像素片段着色器,并用它绘制大量的像素,它将需要很长的时间,在此期间GPU不能被中断。如果你给它的东西花了30分钟,用户在30分钟内不能使用他们的机器

解决方案是操作系统乘以每个GPU操作所需的时间。如果需要的时间太长(比如2-3秒),操作系统就会重置GPU。在这一点上,操作系统不知道GPU在当前操作中走了多远。一个好的OS/驱动程序只会杀死发出坏的draw调用的一个上下文。较旧的操作系统会杀死所有程序中的所有上下文

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



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

因为你每个片段要进行1024个采样,这取决于你渲染的片段数量。嗯……一个片段有人尝试过这个脚本吗?是的,我尝试过,没有问题,除了你的
texture2D
调用中的键入
text
,它应该是
tex
。因为你每个片段要做1024个样本,这取决于你渲染的片段数量,这是一个巨大的数量。嗯……一个片段有人尝试过脚本吗?是的,我尝试过,工作没有问题,除了
texture2D
调用中的键入
文本
,应该是
tex
。好的,谢谢,但有点奇怪,上面的脚本对我的gpu来说太多了。即使只是一个知识分子,我认为他们更有能力。一个全屏片段,一个片段?你的画布是1x1像素大小吗?没有,但我可能误解了,但我渲染的只是一件事,画布,还有一个片段,这就是片段的正确性?多边形及其所有管道信息已准备好通过拖动着色器进行着色。不,画布不是片段。也许可以这样理解,画布中对象可见的每个像素都是一个片段,因此,如果对象在画布中占据200个像素,那么片段着色器(在该对象的材质中)将执行200次。如果我在这里不正确,请有人纠正我。好的,谢谢,但有点惊讶上面的脚本对我的gpu来说太多了。即使只是一个知识分子,我认为他们更有能力。一个全屏片段,一个片段?你的画布是1x1像素大小吗?没有,但我可能误解了,但我渲染的只是一件事,画布,还有一个片段,这就是片段的正确性?多边形及其所有管道信息已准备好通过拖动着色器进行着色。不,画布不是片段。也许可以这样理解,画布中对象可见的每个像素都是一个片段,因此,如果对象在画布中占据200个像素,那么片段着色器(在该对象的材质中)将执行200次。如果我在这里不正确,请有人纠正我。