プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:Softimage Mod Tool
透明度処理03
透過シェーダの描画テスト
XNA用アニメシェーダに透過処理を実装した。よく見ると境界線が…?



◎アルファデータの受け渡し

今回はテクスチャの透過処理に再チャレンジします。

まず、XNA向けシェーダ置換処理をコメント化して、BasicEffectで表示してみました。

シェーダを置換せずにBasicEffectで描画

おや?透過処理されましたね?
ちなみに、BasicEffectはボーンアニメ処理をしないので、このままでは動きません。

透過処理に必要なアルファデータはXNAに渡されていることが確認できたので、ボーンアニメシェーダに透過処理を実装しましょう。



◎透過度の検証

ところで、どのように改修すれば透明になるんでしたっけ?確か、ピクセルシェーダ出力(rgba)のaを設定するだけで透明になったような…?

試しにシェーダを改修すると予想外の結果になったので、わざわざテスト環境を作ってピクセルシェーダの中身を下記のようにしました。

float4 color = float4(1.0, 1.0, 0.0, 0.5);
return color;


最初は透過度(4番目の引数)に何を入れても変化せず、かなり悩んだのですが、

spriteBatch.Begin();
spriteBatch.End();


Drawの先頭に上記を追加したら、透過度が有効になりました。どうやら、レンダーステートの初期化が問題だったようですね。


その後、透過度を変えて試すと、0.002以上で黄色が描画され、0.0019以下で何も描画されませんでした。0で透明、0以外で不透明のようです。(0.002は多分誤差)0.5で半透明になると予想していたのですが、半透明にはなりませんでした。



◎実装

BasicEffectのソースを参考に、ピクセルシェーダの末尾を数行だけ改修しました。

// 透過処理のためにコメント化
// float4 result;
// result.xyz = AmbientColor + lightcolor ;
// result.w = 1;

// 透過処理のために追加
float4 result = tex2D(AlbedoSampler, IN.texcoord0);
result.xyz = AmbientColor + lightcolor ;

return result;

透明度処理03

透過クロスアニメがXNAで動きました。
(クロスアニメをボーンアニメとしてXNAに渡しています)

あれ?近くでよく見ると境界線が見えますね?
うーん、どうしよう…。

境界線を消すのは大変そうだし、離れて見ると目立たないので、とりあえず無視します。



◎次回予告

これでいいのかなぁ?と不安を感じつつ、次回は旗手モデルを作成します。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

ちょっと待った!

先にGraphicsDevice.RenderStateプロパティの各プロパティをきちんと理解しておいた方がいいですよ。XNA(DirectX)かSoftimageのどちらでもいいですが、きちんと軸足を固めておかないとうまく行かない時にどちらがまずいのか切り分けられないです。

RenderStateは一度設定すると変更しない限りずっとそのままなので、一度も初期化していないまま放ったらかしでうまく行っていたのが他の処理を入れたら急に動作が変わってしまうことがあります。

特にSpriteBatchと他の一般的な表示方法を併用する場合は、SpriteBatchが色々とステートを上書きしてしまうようなので注意する必要があります(私も何度か引っ掛かりました)。例えば今回の場合、AlphaTestEnableやAlphaFunction、ReferencAlphaなどのプロパティが結果に影響している可能性があります。面倒でも毎フレーム、シェーダに参照される全てのステートを自力で設定するのが確実です。

勉強します


さすがyohさん、スルドイところを突いてきますね!w

実を言うと、最初はAlphaBlendEnableやSourceBlend等のレンダーステートを自力で設定しようとしたのですが、いろいろ試しても変化せず、spriteBatch.Begin();で初期化したら透過度が有効になったので「目的が達成できたからまぁいいや」と思ってました。

しかしyohさんのご指摘はまことにごもっともです。私もspriteBatchを併用して苦戦した経験があるのでよく分かります。

レンダーステートはこれまで避け気味でしたが、これを機に勉強します。アドバイスありがとうございました!

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。