スポンサーサイト

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

DXライブラリで地形ブレンド

こんにちニャン!
捻った言い回しをしようとして若干すべった感のあるペチコです

若干ではないという意見は封殺します


今回は地形ブレンド
例えば草と土の境目等を違和感が少ないようにブレンドするアレです
言葉での説明がうまくできませんニポンゴムズカシイネ

まずテクスチャ
草テクスチャ土テクスチャ

草と土をシームレスにした256x256のテクスチャです

これを普通に
アルファ
こういうアルファでブレンドすると
草土ブレンド
こうなります

うん意外と悪くなかった。いつも見切り発車なペチコです
取り敢えずこれに高さを考慮したブレンドをやってみようということなのです

上のテクスチャとは別にハイトマップを用意します。作り方は検索してみてください
草ノーマル・ハイトマップ
左がノーマルマップで右がハイトマップです
今回ノーマルマップは使いませんが、DDS形式でノーマルマップのアルファにハイトマップを埋め込んでいる前提で書いてきます

これに上のアルファを用いてブレンド用シェーダでブレンドすると
シェーダ使用ブレンド
こうなりました

正直どこが違うの?って感じですが、それぞれ別タブで開いて見比べるとわかると思います
通常のアルファブレンドだとただ色がフェードしているだけですが、シェーダを使った方は背の高い草は土の上に出てきた感じで描画されます

でもペチコの作りが甘くイマイチなので色々改良するともっと良くなると思います
ということでHLSL

//TerrainBlendPS.fx
// 1:ディフューズマップテクスチャ
sampler DiffuseMapTexture1 : register( s0 ) ;
// 1:ノーマルマップ・アルファにハイトマップ
sampler NormalMapTexture1 : register( s1 ) ;
// 2:ディフューズマップテクスチャ
sampler DiffuseMapTexture2 : register( s2 ) ;
// 2:ノーマルマップ・アルファにハイトマップ
sampler NormalMapTexture2 : register( s3 ) ;
// ブレンド用テクスチャ
sampler AlphaTexture : register( s4 ) ;

float4 main(float2 Tex : TEXCOORD0) : COLOR0
{
// テクスチャ取得
float4 Col1 = tex2D( DiffuseMapTexture1, Tex );
float Heigt1 = tex2D( NormalMapTexture1, Tex ).a;
float4 Col2 = tex2D( DiffuseMapTexture2, Tex );
float Heigt2 = tex2D( NormalMapTexture2, Tex ).a;
float Alpha1 = tex2D( AlphaTexture, Tex ).r;
float Alpha2 = 1.0 - Alpha1;

float H1 = Col1.a + Heigt1 * Alpha1 ;
float H2 = Col2.a + Heigt2 * Alpha2 ;

// アルファとハイトよりブレンド率取得
float minus = max( H1, H2) - 0.2;

float out1 = max(H1 - minus, 0);
float out2 = max(H2 - minus, 0);

return float4( (Col1.rgb * out1 + Col2.rgb * out2) / (out1 + out2) , 1.0 );
}

いっぱいレジスタを使ってますが、ソースと素材は下の方に置いときますので見比べてください

簡単に説明するとアルファではなくハイトでフェードを行っているだけです
アルファ用テクスチャのつもりでAlphaって変数名にしたからすごく紛らわしいですが

float H1部分のAlpha1を消して
草土ブレンド
草多めにしてみたり

テクスチャとアルファを変えて
土道ブレンド
道テクスチャを作ってみたり(これはイマイチでした)

float minus = max( H1, H2) - 0.2;をfloat minus = min( H1, H2);に変えて
草道ブレンド
高さのみフェードでやってみたり(高さの違いが少ないテクスチャ同士だと変になります)

2x2で並べてみました
2x2並べてみる
よく見ると境界線が若干目立ちますが、これは元テクスチャのシームレス化が下手だったせいかも
割と違和感なく繋がってる方じゃないかと思います


こんな感じで色々と遊べます
マップチップ用のテクスチャ作成に便利かも
バンプマップ等に使う場合はレンダーターゲットでノーマルマップやハイトマップも別個に出力する必要がありますね

↓一応ソースと素材置いときます
terrain_test素材


コメントの投稿

非公開コメント

プロフィール

ペチコートさん

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

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

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