片段着色器菜鸟需要知道为什么这会使驱动程序崩溃
Fragment Shader noob needs to know why this crashes driver
我正在尝试学习 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;
}
很可能是因为着色器太慢了。
与 CPUs 不同,GPU 没有可抢占式多任务处理(至少现在没有)。这意味着当您给 GPU 一些任务时,它必须完成它。不会像使用 CPU.
那样中断它
因此,例如,如果您要求 GPU 绘制 1000000 个全屏多边形,即使是快速的 GPU 也会花费几秒钟,在此期间它无法做任何其他事情。类似地,如果你给它一个非常昂贵的每像素片段着色器并用它绘制很多像素,它将花费很长时间,在此期间 GPU 不能被中断。如果你给它一些需要 30 分钟的东西,用户在 30 分钟内无法使用他们的机器
解决方案是每个 GPU 操作所需时间的 OS 倍。如果比 OS 花费的时间太长(例如 2-3 秒),则只会重置 GPU。那时 OS 不知道 GPU 在当前操作中走了多远。一个好的 OS/Driver 然后只会杀死发出错误绘制调用的上下文。较旧的 OS 会杀死所有程序中的所有上下文。
当然要注意 太长 取决于 GPU。快速的 GPU 可以瞬间完成任务,而慢速的 GPU 可能需要几秒钟。不同的 GPU 也有不同类型的优化。
TL;DR:您的着色器可能崩溃了,因为它运行得太慢并且 OS 重置了 GPU。
我正在尝试学习 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;
}
很可能是因为着色器太慢了。
与 CPUs 不同,GPU 没有可抢占式多任务处理(至少现在没有)。这意味着当您给 GPU 一些任务时,它必须完成它。不会像使用 CPU.
那样中断它因此,例如,如果您要求 GPU 绘制 1000000 个全屏多边形,即使是快速的 GPU 也会花费几秒钟,在此期间它无法做任何其他事情。类似地,如果你给它一个非常昂贵的每像素片段着色器并用它绘制很多像素,它将花费很长时间,在此期间 GPU 不能被中断。如果你给它一些需要 30 分钟的东西,用户在 30 分钟内无法使用他们的机器
解决方案是每个 GPU 操作所需时间的 OS 倍。如果比 OS 花费的时间太长(例如 2-3 秒),则只会重置 GPU。那时 OS 不知道 GPU 在当前操作中走了多远。一个好的 OS/Driver 然后只会杀死发出错误绘制调用的上下文。较旧的 OS 会杀死所有程序中的所有上下文。
当然要注意 太长 取决于 GPU。快速的 GPU 可以瞬间完成任务,而慢速的 GPU 可能需要几秒钟。不同的 GPU 也有不同类型的优化。
TL;DR:您的着色器可能崩溃了,因为它运行得太慢并且 OS 重置了 GPU。