スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DXライブラリでアルファブレンディング

こんにちは、ペッツィーです。
ナウなヤングでウブなネンネはニックなネームをユーズするものなのです。

なんかルー入ってる気がします。



今回はアルファブレンディング。
デカールとかで使われてるテクスチャの上に模様テクスチャ貼ったりブレンドしたりするものです。



ベーステクスチャ


ペイントテクスチャ
を重ねて

結果
こうなればハッピー!アーイエー!


実際にシェーダでやってみましょう。
視差マッピングベースでブレンドです。




ブレンド失敗

ウーーーープスッ?!

ダムイット!

単純に重ねたら半透明で描画されます。
オーケィ、模様と重なる部分を画像のマスクのように抜いてやればよいのですね。

考える前に調べたらあっさり計算式が見つかりました。

模様テクスチャ色 * 模様テクスチャアルファ + 元テクスチャ色 * (1 - 模様テクスチャアルファ)

うんソーイージーですね。いい加減ルーがウーザーですね。



ブレンド成功

オッケーです。

元絵が悪いのと妙なバンプのせいで見にくいのですが元テクスチャに模様テクスチャが貼れました。
これで帆の紋章や船体のデカールもできそうです。

ただ通常はこういう単純なブレンド以外に複数のテクスチャを色々と合成して使うのでこれだけだと用途に乏しいかもですね。
例えば銃痕ですとUVをずらして合成しないといけませんし、もっと工夫が必要なようです。

今回は簡単なコードなので要点だけ貼っておきます。


//DXライブラリ側でデカールに使うテクスチャを読み込んで
int Decal_TexHandle = LoadGraph( "decal.tga" ) ;
//tgaを使っているのはアルファを同ファイルに入れたかっただけで、別にDDS等でも構いません

//サンプラに渡します。2を使ってるのは1をノーマルマップに使っているためです
SetUseTextureToShader( 2, Decal_TexHandle ) ;


//ピクセルシェーダでそのサンプラを定義して
sampler DecalTexture : register( s2 ) ;

//デフューズと合成
float4 TextureDiffuseColor = tex2D( DiffuseMapTexture, Tex ) ;
float4 TextureDecalColor = tex2D( DecalTexture, Tex ) ;
float4 BlendColor = TextureDecalColor * TextureDecalColor .a + TextureDiffuseColor * (1 - TextureDecalColor .a);




これだけです。
基本的にDXライブラリ様のサンプルを踏襲してますが、レジスタ定数が異なりますので視差マッピングあたりを参照してください。


コメントの投稿

非公開コメント

プロフィール

ペチコートさん

Author:ペチコートさん
大航海時代オンライン
Zephyros、Eurosサーバーに潜伏中

偽ペチコ1号・2号
ペチコの手下達
Zephyrosサーバーに潜伏中

最新記事
月別アーカイブ
カテゴリ
リンク
最新コメント
検索フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。