AGALで環境マッピング その3 | Photoshop CC Tutorials
今回はAGALで環境マッピングのプログラムを作成しました。

このプログラムを作成するにあたり、あまりにものややこしさゆえに
三回ほどあきらめようとしました。(;^_^ A

◆【できあがりはこちらをクリック】(要:FlashPlayer11、ビデオカード等GPU搭載PC)
$ピック社長のブログ

今回作成したシェーダプログラムです。
すべてアセンブラで書いたのでシェーダプログラムは膨大で読解不可能なものとなりました。(;^_^ A

//////////////////
// R = I-2(N・I)N
//////////////////
// ベクトルIを求める
"sub ft0, v0, fc18\n" + // fc18 == eye(0,0,-1)
// (N・I)を求める
"dp3 ft1, v1, ft0\n" +
// (N・I)・Nを求める
"mul ft1, ft1, v1\n" +
// -2(N・I)・Nを求める
"add ft1, ft1, ft1\n" +
"neg ft1, ft1\n" +
// R = I-2(N・I)・Nを求める
"add ft0, ft0, ft1\n" +
"nrm ft0.xyz, ft0.xyz\n" + // ft0 == 反射視線R

//////////////////
// ft5 == RGBA
//////////////////
"mov ft5, fc19\n" + // ft5 == 0 (初期化)

//----------------------------
// forward
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc17.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc16.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc15\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc16.xyz\n" + // ft4 == r
// u = dot(q, e)/s
"dp3 ft1.x, ft1.xyz, ft3.xyz\n" +
"div ft1.x, ft1.x, ft2.x\n" +
// v = dot(r, dir)/s
"dp3 ft1.y, ft4.xyz, ft0.xyz\n" +
"div ft1.y, ft1.y, ft2.x\n" +
// t = dot(r, e2)/s
"dp3 ft1.z, ft4.xyz, fc17.xyz\n" +
"div ft1.z, ft1.z, ft2.x\n" +
//////////////////
// ft1.xyz == uvt
//////////////////

////////////////////////////////////////////
// if(u >= 0 && v >= 0 && w >= 0 && t >= 0)
////////////////////////////////////////////
// w = 2 - u - vを求める
"sub ft1.w, fc21.x, ft1.x\n" + // fc21 == 2
"sub ft1.w, ft1.w, ft1.y\n" +

"mov ft2.x, fc22.x\n" + // (初期化)fc22.x == 1.0 : ft2は1か0になる。ft2はカラーに掛ける。

////////////////////////////////////////////
// if(u >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.x, fc19.x\n" + // ft1.x >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.y, fc19.x\n" + // ft1.y >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.z, fc19.x\n" + // ft1.z >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(w >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.w, fc19.x\n" + // ft1.w >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +

////////////////////////////////////////////
// if(t < 1)
////////////////////////////////////////////
/*"slt ft6.x, ft1.z, fc22.x\n" + // ft1z < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" + */
////////////////////////////////////////////
// if(u < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.x, fc22.x\n" + // ft1.x < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.y, fc22.x\n" + // ft1.y < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +

"tex ft3, ft1.xy, fs0 <2d,norepeat,linear,nomip>\n" +

"mul ft3, ft3, ft2.xxxx\n" + // ft5 == RGBA
"add ft5, ft3, ft5\n" +

//----------------------------
// right
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc5.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc4.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc3\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc4.xyz\n" + // ft4 == r
// u = dot(q, e)/s
"dp3 ft1.x, ft1.xyz, ft3.xyz\n" +
"div ft1.x, ft1.x, ft2.x\n" +
// v = dot(r, dir)/s
"dp3 ft1.y, ft4.xyz, ft0.xyz\n" +
"div ft1.y, ft1.y, ft2.x\n" +
// t = dot(r, e2)/s
"dp3 ft1.z, ft4.xyz, fc17.xyz\n" +
"div ft1.z, ft1.z, ft2.x\n" +
//////////////////
// ft1.xyz == uvt
//////////////////

////////////////////////////////////////////
// if(u >= 0 && v >= 0 && w >= 0 && t >= 0)
////////////////////////////////////////////
// w = 2 - u - vを求める
"sub ft1.w, fc21.x, ft1.x\n" + // fc21 == 2
"sub ft1.w, ft1.w, ft1.y\n" +

"mov ft2.x, fc22.x\n" + // (初期化)fc22.x == 1.0 : ft2は1か0になる。ft2はカラーに掛ける。

////////////////////////////////////////////
// if(u >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.x, fc19.x\n" + // ft1.x >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.y, fc19.x\n" + // ft1.y >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.z, fc19.x\n" + // ft1.z >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(w >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.w, fc19.x\n" + // ft1.w >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +

////////////////////////////////////////////
// if(t < 1)
////////////////////////////////////////////
/*"slt ft6.x, ft1.z, fc22.x\n" + // ft1z < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" + */
////////////////////////////////////////////
// if(u < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.x, fc22.x\n" + // ft1.x < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.y, fc22.x\n" + // ft1.y < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +

"tex ft3, ft1.xy, fs1 <2d,norepeat,linear,nomip>\n" +

"mul ft3, ft3, ft2.xxxx\n" + // ft5 == RGBA
"add ft5, ft3, ft5\n" +

//----------------------------
// left
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc2.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc1.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc0\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc1.xyz\n" + // ft4 == r
// u = dot(q, e)/s
"dp3 ft1.x, ft1.xyz, ft3.xyz\n" +
"div ft1.x, ft1.x, ft2.x\n" +
// v = dot(r, dir)/s
"dp3 ft1.y, ft4.xyz, ft0.xyz\n" +
"div ft1.y, ft1.y, ft2.x\n" +
// t = dot(r, e2)/s
"dp3 ft1.z, ft4.xyz, fc17.xyz\n" +
"div ft1.z, ft1.z, ft2.x\n" +
//////////////////
// ft1.xyz == uvt
//////////////////

////////////////////////////////////////////
// if(u >= 0 && v >= 0 && w >= 0 && t >= 0)
////////////////////////////////////////////
// w = 2 - u - vを求める
"sub ft1.w, fc21.x, ft1.x\n" + // fc21 == 2
"sub ft1.w, ft1.w, ft1.y\n" +

"mov ft2.x, fc22.x\n" + // (初期化)fc22.x == 1.0 : ft2は1か0になる。ft2はカラーに掛ける。

////////////////////////////////////////////
// if(u >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.x, fc19.x\n" + // ft1.x >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.y, fc19.x\n" + // ft1.y >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.z, fc19.x\n" + // ft1.z >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(w >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.w, fc19.x\n" + // ft1.w >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +

////////////////////////////////////////////
// if(t < 1)
////////////////////////////////////////////
/*"slt ft6.x, ft1.z, fc22.x\n" + // ft1z < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" + */
////////////////////////////////////////////
// if(u < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.x, fc22.x\n" + // ft1.x < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.y, fc22.x\n" + // ft1.y < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +

"tex ft3, ft1.xy, fs2 <2d,norepeat,linear,nomip>\n" +

"mul ft3, ft3, ft2.xxxx\n" + // ft5 == RGBA
"add ft5, ft3, ft5\n" +

//////////////////
// final
//////////////////
"mov oc, ft5"


尚、このプログラムを作成するにあたり床井さんのレイキャスティングのサイトを
参考にさせていただきました。

■ 床井さんのサイト
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20100113