DX・デジタルトランスフォーメーション

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版

ブロックチェーン・暗号技術 | android | iOS | Web | アプリの著作権 | 日本のなりたち | 禅・大乗仏教 | 新しい社会

OpenGL ES2のシェーダとは何か?数学ぎらいの文系用解説

OpenGL ES2のシェーダってとっつきにくいよね。

そこで、シェーダとは何であるのか数学ぎらいの文系の人にも分かりやすく説明する。

\*1 シェーダとは

点、線、三角形をコンピュータのモニタに描画表示するのがOpenGLだが、

その表示する対象である図形の頂点座標と発色(カラー)にフィルタ*3 をかける2つの関数*2 がシェーダである。

プログラマブル・シェーダとも言う。

なんでシェーダ(shader)というのかというと、カーテンのように「光を操作するもの」という意味である。

ここでいう光とは、コンピュータの液晶モニタが発する光のことである。

シェーダには、フラグメント・シェーダと頂点シェーダ(バーテックス・シェーダ)がある。

シェーダは1秒間に60回プログラムが画面表示する際に呼び出される。

フラグメント・シェーダ

コンピュータのモニタ画素(pixcel、ピクセル)ごとの発色に作用する関数である。

フラグメント・シェーダの「フラグメント」とは、画素という意味である。

最低限のフラグメント・シェーダの例)


varying lowp vec4 colorVarying;    // 頂点シェーダから値を受け取るための変数

void main() {
    gl_FragColor = colorVarying;    // フィルタ後の発色値をセット
}

頂点シェーダ(バーテックス・シェーダ)

点、線、三角形をコンピュータのモニタに表示するための頂点座標(x,y,z位置)に作用する関数である。

OpenGL座標は、左下または中央を原点(Y軸は上に伸びる)とする。

最低限の頂点シェーダの例)


attribute vec4 position;    // プログラムでセットされた頂点座標
attribute vec4 color;        // プログラムでセットされた発色

varying lowp vec4 colorVarying;    // フラグメントシェーダへ値を渡すための変数

void main() {
    colorVarying = color;
    gl_Position = position;    // フィルタ後の座標値をセット
}

\*2 関数とは

渡された値を加工する計算式である。

\*3 フィルタとは

プログラム*4 で指定する頂点座標やカラーの値に適用する関数である。

\*4 プログラムとは

OpenGLの生成、更新、画面表示を行うプログラムである。

-

<シェーダの書き方>

c言語+シェーダ独自の変数修飾子で記述する。

attribute修飾子

プログラムから読み書きアクセスできる静的変数である。

例)

シェーダ側

attribute vec4 variable_name;

プログラム側

GLint variable_name = glGetAttribLocation(mProgram, "variable_name");
glEnableVertexAttribArray(variable_name);

varying修飾子

フラグメントシェーダと頂点シェーダ間で共有アクセスできる静的変数である。

例)

頂点シェーダ側

varying lowp vec4 variable_name;

カラーシェーダ(フラグメントシェーダ)側

varying lowp vec4 variable_name;

uniform修飾子

プログラムから読み書きアクセスすることができる静的変数である。

例)

シェーダ側

uniform float variable_name;

プログラム側

GLint variable_name = glGetUniformLocation(mProgram, "variable_name");

mediump修飾子

シェーダ関数内自動変数である。

例)

mediump float i;

gl_Position広域変数

シェーダが頂点座標値を計算結果(加工結果)をセット(保存)する広域(グローバル)変数である。

gl_FragColor広域変数

シェーダがカラー値を計算結果(加工結果)をセット(保存)する広域(グローバル)変数である。

<プログラムとシェーダの値の受け渡し方法>

上で述べた静的変数や広域変数でシェーダ間やシェーダとプログラム間で値を受け渡すのである。

2023年12月
     12
3456789
10111213141516
17181920212223
24252627282930
31      
android
iOS
web
アプリの著作権
ブロックチェーン/暗号技術
新しい社会
禅・大乗仏教
日本のなりたち

AppStoreにて無料公開中! ”システム手帳”で検索! - AppStoreへ iPad版 - iPhone版
デジタルトランスフォーメーションで新しい生活を提案!