まるでサンシャイン2002



ぼくの夏体み


~Perspective Shadow Maps~




■7月19日 今日から夏体み

今日から夏体みです。
せいせきもあがったので、マリオサンシャインをかってもらいました。
成績があがってよかったね。休みでもあそんでばかりじゃいけませんよ。(先生)

■7月20日 マリオをしました

マリオがおもしろいです。
うみにスミがうかんでいるところからさきにすすめません。
先生も海に行きました。水着の女の子がかわいかったです。(先生)

■7月21日 マリオさいこ~です

今日はメカクッパにやられました。
やっぱりマリオの敵はクッパなんですか?ルイージは今回は、いますか?(先生)

■7月22日 よっすぃ~

ヨッシーのタマゴがおちています。
エサをあげただけでなつくなんてキャッシュなやつです。
とりに水をかけて虐待するのがマイブームです。
鳥に水をかけて遊んではいけません。(先生)

■7月23日 シャインシャインシャイン

30シャインあつめました。
すんごいポンプもひろいました。
ひろいものは警察にとどけましょう。(先生)

■7月24日 マリオおあずけ

7月24日 マリオおあずけ
マリオばっかりしていたら、パパにキューブをとりあげられました。
勉強もしましょう。(先生)

■8月1日 自由けんきゅう

しゅくだいわすれてた。
自由けんきゅうもでてたけど。ネタがないよぉ。
どうしよう・・・
先生も子供のころは自由研究で悩みました。(先生)

■ 8月2日 ネタ

そういえば、カクカクシカジカな、にいさかくんが、
「シャドウマップなどのテクスチャの解像度の問題を解決する方法として、Perspective Shadow Mapsという手法があります。 ちょっと論文の比較画像は誇張しすぎですが(Perspectiveでない方のシャドウマップが駄目過ぎ)、これは中々良いと思います。 通常のシャドウマップでは光源とカメラが向かい合ってしまうとカメラに近くなるほど影が粗くなるという欠点がありますけど、この方法ならその問題もありませんね。 いつか実装してみようと思っていまだにやってませんが、誰か代わりに試してください(笑」っていってたっけ。
これやってみようかな。
INRIA Sophia Antipolis の Marc Stamminger くんと George Drettakis くんで SIGGHRAPH 2002 ってイベントでやったんだって。
パパもママもこむからやだって SIGGHRAPH につれてってくれないんだよなぁ~
自由研究の内容が決まっておめでとう。遊びにつれてってくれないからって、プレッシャーをかけちゃいけないよ(先生)

■8月5日 シャドウマップ

シャドウマップって、ライトを当てる方向から深さの絵をつくって、

その絵と本当にかきたい絵の深さのくらべて、影をつくるみたいです。
上の絵は、クルマのなかみをひっくりかえしてるみたいです。

さいしょに、シロクロのえをかいたあとに、テレビにもう1かい絵をかくみたいです。

draw.c
0442:     lpD3DDev->GetDepthStencilSurface( &lpZbuffer );
0443:     lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer);
0444:     lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0);
0445: 
0446:     // シャドウマップの作成
0447:     lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
0448:     lpD3DDev->SetVertexShader(hVertexShader);
0449:     lpD3DDev->SetPixelShader(hPixelShader);
0450:     DrawModel(lpD3DDev, 1, 0);
0451: 
0452:     // 描画をバックバッファに戻す
0453:     lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0454:     lpD3DDev->Clear(0,NULL,D3DCLEAR_ZBUFFER, 0,1.0f,0);
0455:     
0456:     // 比較しながらの描画
0457:     lpD3DDev->SetVertexShader(hShadowVertexShader); 
0458:     lpD3DDev->SetPixelShader(hShadowPixelShader);
0459:     lpD3DDev->SetTexture( 1, pTexture );
0460:     DrawModel(lpD3DDev, 0, 1);

おくゆきのシロクロのえをかくのは、

vs.vsh
0003: ; c4-7   -- world + ライトビュー + 透視変換行列
0004: ; c15    -- 深度調整
0006: ; v0    頂点の座標値
0009: vs.1.0
0014: ;座標変換
0015: m4x4 oPos, v0, c4
0017: ; 深度を色のw成分に入れる
0018: dp4 r0,     v0,   c6
0019: mad oD0,    r0,   c15.x, c15.y
ps.psh
0004: ps.1.0
0010: mov r0, v0.a

で、もういっかいは、

Shadow.vsh
0002: ; c0-3   -- world + ビュー + 透視変換行列
0003: ; c4-7   -- world + ライトビュー + 透視変換行列
0004: ; c13    -- ライトのベクトル (w成分は環境光の強さ)
0005: ; c14    -- ライトの色(メッシュの色)
0006: ; c15    -- 深度調整
0008: ; v0    頂点の座標値
0010: ; v7    テクスチャ座標
0012: vs.1.0
0014: ; デカールテクスチャー
0015: mov oT0,    v7
0017: ;座標変換
0018: m4x4 oPos, v0, c0
0020: ; ((l,n) + l.w)*c14 (平行光源のライティング)
0021: dp4 r0.w,   v3,   c13
0022: mul oD0.xyz,r0.w, c14
0024: ; 深度を色のw成分に入れる
0025: dp4 r0,     v0,   c6
0026: mad oD0.w,  r0,   c15.x, c15.y
0028: ; シャドウバッファ
0029: dp4 r0.x,   v0,   c4
0030: dp4 r0.y,  -v0,   c5
0031: dp4 r0.w,   v0,   c7
0032: rcp r0.w, r0.w
0033: mul r0.xy, r0, r0.w
0034: mad oT1.xy, r0, c12.y, c12.y
shadow.psh
0004: ps.1.0
0006: def c0, 0.0f, 0.0f, 0.0f, 0.000000000001f   ; z-オフセット
0007: def c1, 0.3f, 0.3f, 0.3f, 0.0f      ; 影の濃さ
0009: ; テクスチャーの色を引っ張ってくる
0010: tex t0                              ; デカールテクスチャー
0011: tex t1                              ; 深度テクスチャー
0012: 
0013: add r1, t0, v0                      ; 色=頂点色+デカール
0014: 
0015: ; r0 = (t1.a < v0.a-0.1f) ? r1 : r1-c1
0016: add r0, v0,  -c0
0017: add r0, r0,  -t1_bias
0018: cnd r0, r0.a, c1, c0
0019: add r0, r1, -r0

でかきます。
めんどくさいから、影の部分は手で黒く塗ろうよ。(先生)

■8月10日 サンシャインにのぼったよ

今日は、いけぶくろにいきました。
かえりにお酒をのんでくだをまいているおとなをみました。
「マ○○サンシャイン」ってさけんでいました。
おじさんたちもマリオをするのかな?
あんなおとなにはなりたくないとおもいました。
大人の世界もいろいろと大変なんだよ。(先生)

■8月20日 ぱーすぺくてぃぶしゃどうまっぷっぷ

Perspective Shadow Maps (以下、透視影マップ)は、影マップのぎょうれつをちがうものにします。
とおしへんかんしてから、ひしゃげたくうかんのままで、ライトのほうこうからせかいをみます。

ただ、とおくのものが小さくなったので、つかわないぶぶんがでてきます。

だから、いいかんじに画面の中心をずらします。

ざひょうをへんかんするぎょうれつは、むずかしいものになります。

しゃえいへんかんをしたあとに、すけーりんぐします。
これは、とうしへんかんのあとのくうかんがひしゃげてるので、 いい大きさになるようにちょうせいしています。
そのあとに、とうしへんかんしたざひょうを、もとのせかいの真ん中がちゅうしんになるようにうごかします。
そのときに、ビューぎょうれつをつかいます。ただし、してんがワールドのちゅうしん、みているむきはZほうこう、うえむきはうえむきです。
ただ、そのベクトルは、とうしへんかんでへんかんしたものです(そのあとに、きかくかもします)。
とうしへんかんでうつったせかいでのベクトルをつかうと、とうしへんかんしたせかいでのもとのワールドのちゅうしんがわかります。
ただ、つくったビューぎょうれつをつかったら、xじくとyじくがひっくりかえっていたので、もとにもどすぎょうれつをつかいました(べつにいらないけどね)。
あと、ライトのほうこうにまわしたあとは(ライトのほうこうも、とうしへんかんしたあとのむきだよ)、とうしへんかんしてテクスチャーにかきます。 そのとき、さいごのしんどがいいカンジになるように、しゃえいぎょうれつはせんようでつくりました。
あと、真ん中をうごかして、いいかんじの大きさにちょうせいします。

できたテクスチャーは、てまえのくるまが大きくかけました。

すこし、このほうほうにぎもんをかんじます。パースをかけるぶん、さいごにひかくするときのZちとテクスチャーのむきがかたむいているので、 かげにならないきょうかいぶぶんのギザギザがおおきくなるきがします。
見ているだけで、クラクラしそうな絵ですね。。(先生)

■8月27日 しげんはたいせつにね

透視影マップのいいところは、てまえのかげがこまかくなるようです。
ということは、テクスチャーが小さくてもきれいということです。
透視影マップとふつうのほうほうをくらべよう。

テクスチャーのサイズを512x512にしたとき、それぞれのえは、つぎのようになります
(このあと、左が透視影マップ、右がふつうのほうほうです)。


透視影マップの手前のクルマのりんかくが、おそろしくきれいです。
あと、このがめんできがついたのですが、透視影マップはひだりしたが(影マップが)かけているので、影がきえてます。

テクスチャーのサイズを256x256にしたとき、つぎのようになります。


透視影マップは、おくのほうが大きなギザギザがあるのがみえます。

テクスチャーのサイズを128x128にしたとき、つぎのようになります。


透視影マップのてまえのぶぶんが、かくじつにきれいです。

テクスチャーのサイズを64x64にしたとき、つぎのようになります。


どっちもギザギザ。
でも、透視影マップのほうは、てまえの影がきれいですね。

テクスチャーのサイズを32x32にしたとき、つぎのようになります。


やっぱり、透視影マップがの手前はあまりくずれません。

こんかいのひかくは、いままでのほうほうとのさがすくないですね。
結局、SHIGGRAPHの結果は自分の結果が有利になるように調整されていたのですか?(先生)

■9月1日 あしたも体みにならないかな

やっとしゅくだいがそろいました。

なかみは、つぎのファイルです。

shadow.pshちょうてんシェーダー。
shadow.pshピクセルシェーダー。
vs.vshちょうてんシェーダー。かげマップをつくるよ。
ps.pshピクセルシェーダー。かげマップをつくるよ。
draw.cppテレビをかくんだ。
draw.hテレビをかくんだ。
bg.cppじめんとかかくよ。
main.hはじめのいっぽ。
main.cppはじめのいっぽ。
load.cppえをよむんだ。
load.hえをよむんだ。
font.cppじをかくよ。
font.hじをかくよ。
tile.bmp (床デカール)
sky.bmp (空デカール)

あと、モデルと、あそべるエグゼや、プロジェクトファイルがはいってます。

きょうで、夏体みもおしまいです。あぁ~あ、あしたからも夏体みがいいな。

お疲れ様でした。新学期もがんばってね。(先生)




もどる

imagire@gmail.com