iPhoneSDK:OpenGL ES2.0で最初の一枚

3GSからOpenGLES2.0に対応され、処理速度の問題はあるけれどシェーダーで行える事は
ぐっと増えて初代xboxでやっているような処理は大抵実装できるようになりました。

私が最後にレンダリングの仕事をしたのは固定シェーダー全盛の時代だったので
シェーダーに関する知識はあまりありません。
そこで勉強もかねてゼロから始めてみました。
と、いっても本は必要です。
「OpenGL ES 2.0 プログラミングガイド」
を買っておきましょう。基本から実用程度までは網羅してると思います。

本見ながらlambert光源で頂点シェーダー書いてみました。
今時はC言語で書けるのでとても簡単です。
むしろシェーダーとプログラムのリンクする為の情報
(glBindAttribLocation,glUniform,VeretxAttribPointer)の設定が面倒です。

attribute vec4 aPosition;
attribute vec4 aColor;
attribute vec3 aNormal;

varying vec4 colorVarying;

uniform float translate;
uniform mat4 viewProjMatrix;  // 透視変換行列
uniform mat4 modelViewMatrix;  // モデルビュー行列
uniform mat3 viewMatrix;         // ビュー行列
uniform vec3 light;     // 光源。とりあえずひとつ

const float c_one = 1.0;
const float c_zero = 0.0;

void main()
{
 vec4 vPosition;
 vec3 vNormal;
 vec4 vColor;
 float ndotl;

 vPosition = modelViewMatrix * aPosition;   // 頂点を(モデル行列xビュー行列) に変換
 gl_Position = viewProjMatrix * vPosition;   // クリップ空間にする
  
 // 光源計算
 vNormal = viewMatrix * aNormal;             // 法線ベクトルをビュー空間に変換
 ndotl = max( c_zero, dot(vNormal, light) );   // ビュー空間にある正規化されたライトベクトルと内積
 vColor = aColor * vec4(ndotl, ndotl, ndotl, c_one); // 色と合成

    colorVarying = vColor;
}


先は遠い・・・

コメント

このブログの人気の投稿

.NET:FileSystemWatcherで複数フィルタ指定

AI画像生成の力をかりる

君たちはどう生きるか