2016-11-19 86 views
1

我想學習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; 

     } 
+0

因爲你每個片段做1024個樣本,這取決於你渲染的片段數量是一個巨大的數量。 –

+0

好....一個片段 – Sentinel

+0

沒有人試過腳本? – Sentinel

回答

4

很可能是因爲着色器太慢。

與CPU不同,GPU不具備可搶佔多任務功能(至少現在還沒有)。這意味着當你給GPU一件事情時,它必須完成。沒有像使用CPU那樣中斷它。因此,例如,如果您要求GPU繪製1000000個全屏多邊形,即使是快速GPU也需要幾秒鐘的時間,但在此期間,它無能爲力。同樣,如果你給它一個非常昂貴的每像素片段着色器,並且繪製很多像素,它將需要很長時間才能使GPU不能被中斷。如果你給它的東西花了30分鐘,用戶無法使用他們的機器30分鐘

解決方案是操作系統時間每個GPU操作需要多長時間。如果它需要太長時間(比如2-3秒)纔會重置GPU。在這一點上,操作系統不知道GPU在當前操作中有多遠。一個好的操作系統/驅動程序然後只是殺死一個發出不好的調用請求的上下文。較舊的操作系統會殺死所有程序中的所有上下文。

當然要注意太長了取決於GPU。一個快速的GPU可以在瞬間完成任務,而一個緩慢的GPU可能需要幾秒鐘的時間。不同的GPU也有不同類型的優化。

TL; DR:您的着色器可能因爲運行速度太慢而崩潰,操作系統重置GPU。

+0

好的謝謝,但有點驚訝上面的腳本是我的GPU太多。即使它只是一個intelhd我認爲他們更有能力。一個全屏幕片段。 – Sentinel

+0

一個片段?您的畫布尺寸是1x1像素嗎? – 2pha

+0

不,但也許是誤會,但我所渲染的只是一件事,畫布和afaik,這是一個片段是正確的?一個多邊形及其所有管線信息準備好通過拖動着色器進行着色 – Sentinel