【重要】AGALで環境マッピングに成功 | Photoshop CC Tutorials
今回ついにAGALで環境マッピングのプログラムを作成することに成功しました。

アセンブラのエラーと高度な数学に悩まされ何度もあきらめようとしましたが、
ただひたすらデバッグを繰り返し、数学知識を高めやり遂げることができました。(T∇T)

今回もまたFlash先駆者の方々や応援してくださった方々、いろいろな方々に助けていただきました。
自分一人ではここまではできませんでした。本当にありがとうございました。m(_ _)m

■ 操作方法
十字キー : 立方体回転

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

そして今回作成したものはStage3D対応自作3Dエンジン「KAMIKAZE 3D」を使用して作りました。
本当に神風がふいてくれました。(ノ_<。)うっうっうっ

$ピック社長のブログ


尚、今回作成した環境マッピングはさらに改良を加えたのち「KAMIKAZE 3D」に組み込まれますので
今後とも「KAMIKAZE 3D」をよろしくお願いいたします。m(_ _)m


今回作成したフラグメントシェーダのプログラムです。
何かの参考にしていただければと思います。(;^_^ 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, fc5.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, fc2.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" +

//----------------------------
// bottom
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc11.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc10.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc9\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc10.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, fc11.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, fs3 <2d,norepeat,linear,nomip>\n" +

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

//----------------------------
// top
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc8.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc7.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc6\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc7.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, fc8.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, fs4 <2d,norepeat,linear,nomip>\n" +

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

//----------------------------
// back
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc14.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc13.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc12\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc13.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, fc14.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, fs5 <2d,norepeat,linear,nomip>\n" +

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

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