2016-11-19 8 views
1

WebGLを学習しようとしていて、次のフラグメントシェーダーがあります。これまで私は実際に自分のPCを自発的にリセットするように管理していましたが、Windowsはグラフィックスドライバがクラッシュして再起動したことを知らせてくれました。すべてのJSをブラウザで!フラグメントShader 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の操作に要するOS時間です。時間がかかりすぎると(2〜3秒程度)OSがGPUをリセットするだけです。その時点で、OSは現在の操作でGPUがどのくらい離れているかは分かりません。良いOS /ドライバは、悪いドローコールを発行した1つのコンテキストを殺します。古いOSはすべてのプログラムですべてのコンテキストを強制終了します。

が長すぎるはもちろんGPUによって異なります。高速GPUは瞬時に処理を実行でき、低速GPUは数秒かかることがあります。また、異なるGPUには異なるタイプの最適化があります。

TL; DR:シェーダが遅すぎるとOSがGPUをリセットするため、シェーダがクラッシュした可能性があります。

+0

ありがとう、しかし、上記のスクリプトは私のGPUにはあまりにも驚いています。たとえそれがちょっと知っていても、彼らはもっと能力があると思った。 1つのフルスクリーンの断片。 – Sentinel

+0

1断片?キャンバスのサイズは1x1ピクセルですか? – 2pha

+0

誤解はしていませんが、私がレンダリングしているのは、断片、キャンバス、アフリカーファです。ポリゴンとそのすべてのパイプライン情報は、ドラッグシェイダーによってシェーディングの準備ができています – Sentinel

関連する問題