一般社団法人 全国個人事業主支援協会

COLUMN コラム

皆さま。

初めまして、沖田といいます。

 

GLSLでのシェーダーのプログラミングついて複数回に渡って書いてみようと思います。

 

プログラミング環境は

↓ここです!

http://glslsandbox.com/

 

このサイトを見ると、誰かが作った最近の作品が並んでいます。

自分のを作るには、左上の「Create new effect! 」ボタンをクリックです。

 

サンプルのコードが入っていて、そのコードで描かれた映像が表示されています。

そこに、自分のコードを上書きしてみましょう。

 

void main(void)  {

    gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);

}

この3行で、画面が青1色になります。

void main( void ) { … } の中にコードを書きます。

gl_FragColor には塗りつぶす色を設定しています。

R(赤) G(緑) B(青) A(アルファ:透明度) を vec4 という4つの浮動小数点の型(構造体と考えてよいでしょう)に入れています。

B  が1なので、青になります。

それぞれ、1.0 が最大値で、0は最小値です。

B を 0.0 にする画面は黒く、1.0 だと完全な青になります。

A は、使われていないので何を入れても変化はしないようです。

 

次に以下のコードに変更してみます。

 

void main(void) {

     if (gl_FragCoord.y < 50.0)

          gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);

     else

          gl_FragColor = vec4(0.0, 0.0, 1.0, 0.0);

}

 

画面の下の方が、緑色になったと思います。

 

以下のコードだと…

 

void main(void) {

     if (gl_FragCoord.x < 50.0 && gl_FragCoord.y < 50.0)

          gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);

     else

          gl_FragColor = vec4(0.0, 0.0, 1.0, 0.0);

}

 

画面の左下だけ緑になります。

 

gl_FragCoord.x, gl_FragCoord.xy には、画面の座標が入ってきていて

左下の座標は、 (0.0, 0.0) になっています。

右上の座業は、x と y の描画領域の最大値になりますが、この値はブラウザとモニタとOSによって

色々な値になります。

 

ここまで書いた、void main(void) { … } の関数部分は

フラングメントシェーダーといい、ピクセル1つ1つに対しての処理をしています。

(0, 0) で来た場合は、vec4(0.0, 1.0, 0.0, 0.0); を返し

(100,100) で来た場合は、vec4(0.0, 0.0, 1.0, 0.0); を返しています。

もし x, y の最大値が 1024 だとすると

以下のように main() が呼び出されているイメージになります。

 

for (gl_FragCoord.x = 0.;  gl_FragCoord.x < 1024.0, gl_FragCoord.x += 1.0)

{

      for (gl_FragCoord.y = 0.0;  gl_FragCoord. y < 1024.0, gl_FragCoord.y += 1.0)

      {

           main();

      }

}

 

main() が 1024 x 1024 ピクセルの回数分呼ばれています。

(実際には、フラグメントシェーターは、数個から数千個ほど並列に処理されていてるのですが

 ↑のイメージで考えていて問題は無いです。)

 

今回は、ここまでです!

続きます。

The following two tabs change content below.

沖田 泰志

プログラマー歴36年。 趣味は草野球、スケボー、ドライブ、料理、洋服など。

最新記事 by 沖田 泰志 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア