我正在努力学习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;
}
发布于 2016-11-19 21:48:00
很可能是因为着色太慢了。
与CPU不同,GPU没有可抢占的多任务处理(至少还没有)。这意味着当你给一个GPU做一些事情,它必须完成它。不能像用CPU那样打断它。
因此,例如,如果您要求GPU绘制1000000全屏多边形,即使是一个快速GPU将需要几秒钟,在此期间,它不能做其他任何事情。类似地,如果你给它一个非常昂贵的每像素片段着色器,并与它画很多像素,这将需要很长的时间,在此期间,GPU不能被打断。如果你给它的东西花了30分钟,用户就不能使用他们的机器30分钟。
解决方案是操作系统乘以每个GPU操作所需的时间。如果花费的时间太长(比如2-3秒),操作系统就会重置GPU。在这一点上,操作系统不知道GPU在当前操作中取得了多大进展。一个好的OS/驱动程序只会扼杀发出错误调用的上下文。旧操作系统杀死所有程序的所有上下文。
当然要注意,太长的时间取决于GPU。一个快速的GPU可以在瞬间完成一些事情,而一个缓慢的GPU可能需要几秒钟。另外,不同的GPU有不同类型的优化。
您的着色器可能会崩溃,因为它运行太慢,操作系统重置GPU。
https://stackoverflow.com/questions/40695178
复制