影とアルファ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
moukamouka
記事: 5
登録日時: 12年前

影とアルファ

#1

投稿記事 by moukamouka » 12年前

お世話になっています。

DXライブラリを使用しています。
シェーダーの勉強をはじめようと、まずサンプルから入ったのですが、わからないことが二つあるので、質問させてください。

9.3Dアクション基本+深度値を利用した影表現基本 ( 要プログラマブルシェーダー2.0 )
http://homepage2.nifty.com/natupaji/DxL ... hadow.html
この影の部分はどんなふうに使えるだろうかと、透明度のあるテクスチャを利用すると、やはりアルファが抜けませんでした。
そこで調べていると
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=2882
このような質問をみつけ、さっそく試してみたのですが・・
画像
このように、影の形こそアルファが反映されているものの、プレイヤーの影は木のテクスチャをはったもとの板の影で消されていました。
サンプルのDirLight_DepthShadow_Step2PSで、rgbにテクスチャアルファを掛け合わせればいいのかなど何度も試しましたがなかなか思ったような結果は得られず。
※現在は影のサンプルにURLでのアドバイスをそのまま反映しただけの状態です。

また、木の後ろに回り込む(木よりカメラ側にいく)と影が正しく表示されることから、深度値での比較で失敗しているのではないかとも考えました。
そこで、サンプルソースにそのままDrawExtendGraph(0,0,640,480,DepthBufferGraphHandle,TRUE);を
   // 影用の深度記録画像の準備を行う
SetupDepthImage() ;
   // 影用の深度記録画像を使った影を落とす処理も含めたモデルの描画
DrawModelWithDepthShadow() ;
の後の追加し深度画像を確認しようとしたところ、結果は真っ白のままでした。

そこでお聞きしたいのですが、プレイヤーの影を邪魔している原因はどこである可能性が高く、どのような方法で解決できるでしょうか。
また、おそらく私の方法が違うからだと思うのですが・・深度画像を見るにはなにか違った方法をとる必要があるのでしょうか。
確認がうまくできず少々不便です・・

宜しくお願いします
添付ファイル
mouka.png

moukamouka
記事: 5
登録日時: 12年前

Re: 影とアルファ

#2

投稿記事 by moukamouka » 12年前

影のほうは依然うまくいっていませんが、深度の表示は

コード:

// ピクセルシェーダーの入力
struct PS_INPUT
{
	float4 PPosition       : TEXCOORD0 ;        // 座標( ビュー空間 )
	float2 TexCoords     : TEXCOORD1 ;        // テクスチャ座標
} ;

// ピクセルシェーダーの出力
struct PS_OUTPUT
{
	float4 Color0          : COLOR0 ;
} ;

sampler DiffuseMap : register(s0); 

// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
	PS_OUTPUT PSOutput ;
	float4 TextureDiffuseColor ;

	// Z値を色として出力
	PSOutput.Color0 = PSInput.PPosition.z;

PSOutput.Color0.r = 1.0f*(PSInput.PPosition.z / 13050.0f);

	// テクスチャのα値を適用する
	PSOutput.Color0.a = tex2D(DiffuseMap,PSInput.TexCoords.xy).a;

	if( PSOutput.Color0.a < 0.9f ) PSOutput.Color0.a = 0.0f;

	// 出力パラメータを返す
	return PSOutput ;
}
つぎのように、13050「奥クリップ距離」で割ることで意図した深度画像を得ることができましたので、影と深度表示のうち、深度表示については自己解決とします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 影とアルファ

#3

投稿記事 by softya(ソフト屋) » 12年前

すいません余力がなくて見る時間が取れません。
ご本家の掲示板で質問されてみては如何でしょうか?
※ その場合は相互リンクをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

Re: 影とアルファ

#4

投稿記事 by ISLe() » 12年前

DepthShadow_Step1PS.fxを以下のようにしてみてください。
discardでピクセルの書き込みそのものをキャンセルしているのがミソです。

#半透明ピクセルが入る場合は追加の処理が必要かもしれません(未確認)。

コード:

// ピクセルシェーダーの入力
struct PS_INPUT
{
	float4 PPosition       : TEXCOORD0 ;        // 座標( ビュー空間 )
	float2 TexCoords       : TEXCOORD1 ;        // テクスチャ座標
} ;

// ピクセルシェーダーの出力
struct PS_OUTPUT
{
	float4 Color0          : COLOR0 ;
} ;

sampler DiffuseMap : register(s0); 

// main関数
PS_OUTPUT main( PS_INPUT PSInput )
{
	PS_OUTPUT PSOutput;

	// テクスチャの透明部分だったらキャンセル
	if (tex2D(DiffuseMap, PSInput.TexCoords).a < 1.0f) discard;

	// Z値を色として出力
	PSOutput.Color0 = PSInput.PPosition.z;

	// 透明にならないようにアルファは必ず1
	PSOutput.Color0.a = 1.0f;

	// 出力パラメータを返す
	return PSOutput;
}

moukamouka
記事: 5
登録日時: 12年前

Re: 影とアルファ

#5

投稿記事 by moukamouka » 12年前

>ソフト屋 さん
ご返信有難うございます。
今回は解決となりますが、今後サンプルから手を付けたもので分からないことが出た時は、本家のほうでも質問してみることにします。


>ISLe さん
おお、こんな書き方もできたのですね・・
いままでどう透明部分を処理すればと考えていましたが、結果自体を出力しないのは完全に盲点でした。
変更してみたところ、理想通りの影を作ることができました。有難うございます!

閉鎖

“C言語何でも質問掲示板” へ戻る