片段着色器noob需要知道为什么这崩溃驱动程序
问题描述:
我想学习WebGL,我有以下片段着色器。到目前为止,我实际上设法让我的电脑自动重置,并且还通过Windows来通知我的图形驱动程序崩溃并重新启动。全部通过JS在浏览器中!片段着色器noob需要知道为什么这崩溃驱动程序
现在我已经进展到没有任何事情发生的地步,只是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;
}
答
很可能是因为着色器太慢。
与CPU不同,GPU不具备可抢占多任务功能(至少现在还没有)。这意味着当你给GPU一件事情时,它必须完成。没有像使用CPU那样中断它。因此,例如,如果您要求GPU绘制1000000个全屏多边形,即使是快速GPU也需要几秒钟的时间,但在此期间,它无能为力。同样,如果你给它一个非常昂贵的每像素片段着色器,并且绘制很多像素,它将需要很长时间才能使GPU不能被中断。如果你给它的东西花了30分钟,用户无法使用他们的机器30分钟
解决方案是操作系统时间每个GPU操作需要多长时间。如果它需要太长时间(比如2-3秒)才会重置GPU。在这一点上,操作系统不知道GPU在当前操作中有多远。一个好的操作系统/驱动程序然后只是杀死一个发出不好的调用请求的上下文。较旧的操作系统会杀死所有程序中的所有上下文。
当然要注意太长了取决于GPU。一个快速的GPU可以在瞬间完成任务,而一个缓慢的GPU可能需要几秒钟的时间。不同的GPU也有不同类型的优化。
TL; DR:您的着色器可能因为运行速度太慢而崩溃,操作系统重置GPU。
因为你每个片段做1024个样本,这取决于你渲染的片段数量是一个巨大的数量。 –
好....一个片段 – Sentinel
没有人试过脚本? – Sentinel