【GLSL】バーテックスシェーダーに触れる


これまで GLSL(とほんの少しのHLSL)を書いてましたが、フラグメントシェーダーしか書いていないことに気づいた。

もう一つの頂点シェーダー(バーテックスシェーダー)にも触れてみたい。

サンプルは全然見つからないし情報自体が少ないので gl-react のソースを見ながらバーテックスシェーダーの動作を確認します。

 

今回は基本的な確認までです。

gl-reactvert定義

gl-react というライブラリを使って GLSL を実行しています。

バーテックスシェーダー(vert)はオプション引数で必須ではないです。

だからこそ今まで気にしなかったわけですが。

 

ソースコードから定義とデフォルトのシェーダーを見てみます。

gl-react/src/Shaders.js

 

uv の計算を見ると gl_Position.xy の値域は [-1<1, -1<1] でいいんだろうか。

動作確認

単純な画像を表示させるシェーダーで確かめてみます。

 

p をずらして gl_Position を定義してみます。

gl_Position=vec4(a+vec2(1),0.,1.);
gl_Position=vec4(a-vec2(1),0.,1.);

1枚目は想定通り、2枚目はなぜか謎の欠け方をしています。

もう少し基本から深堀りしていきます。

attribute vec2 p; ってなに?

.js.vert.frag 間での値のやり取りはストレージ修飾子を付けています。

const : 定数を定義します。
attribute : 頂点ごとに異なる値が渡されます。
uniform : 名前通りどの点でも同じ値を持ちます。
verying : シェーダー間の受け渡しに使います。

 

これらの性質と各シェーダーのビルトイン入出力を大まかに図にするとこんな感じ。

なので js 側での設定を確認します。

 

gl-react/src/createSurface.js

 

これを元に考えると先ほどの右上が書けた画像も納得できます。

 

1枚のポリゴンで表示領域を確保している感じなんでしょうか。

となると、もしや gl-react であまり複雑な処理は出来ないのでは。

 

何かできないかもう少しいじってみます。


コメントを残す

メールアドレスが公開されることはありません。