タイル状のテクスチャをさまざまなタイルでスプラットするHLSLで記述された.fxファイルの例はありますか?次のようになります:http://messy-mind.net/blog/wp-content/uploads/2007/10/transitions.jpg各正方形に異なるタイルタイプがあり、スムーズな遷移を行うためにそれらの間に少しぼやけていることがわかりますが、今はテクスチャにタイルを描画する方法を見つける必要があります.2D整数配列があります、各整数は対応するタイルタイプに等しい(0 =草、1 =石、2 =砂)いくつかのHLSLの例を開いたところ、それらは本当に混乱していました。C++側ではすべてが正常に実行されていますが、HLSLは困難であることが証明されています。 。
2 に答える
「テクスチャ スプラッティング」と呼ばれる手法を使用できます。各カラー マップのアルファ値を含む別のテクスチャを使用して、いくつかのテクスチャ (カラー マップ) を混合します。アルファ値を持つテクスチャは、2D 配列に相当します。3 チャンネルの RGB テクスチャを作成し、各チャンネルを異なるカラー マップに使用できます (この場合、R - 草、G - 石、B - 砂)。このテクスチャのすべてのピクセルは、カラー マップをどのように混合するかを示します (たとえば、R=0 は「草がない」、G=1 は「完全な石」を意味し、B=0.5 は「砂、半分の強度」を意味します)。
4 つの RGB テクスチャがあるとします: tex1
- 草、tex2
- 石、tex3
- 砂、alpha
- 混合テクスチャ。.fx ファイルで、位置を計算してテクスチャ座標を渡すだけの単純な頂点シェーダを作成します。すべてがピクセル シェーダーで行われ、次のようになります。
float tiling_factor = 10; // number of texture's repetitions, you can also
// specify a seperate factor for each texture
float4 PS_TexSplatting(float2 tex_coord : TEXCOORD0)
{
float3 color = float3(0, 0, 0);
float3 mix = tex2D(alpha_sampler, tex_coord).rgb;
color += tex2D(tex1_sampler, tex_coord * tiling_factor).rgb * mix.r;
color += tex2D(tex2_sampler, tex_coord * tiling_factor).rgb * mix.g;
color += tex2D(tex3_sampler, tex_coord * tiling_factor).rgb * mix.b;
return float4(color, 1);
}
アプリケーションがマルチパス レンダリングをサポートしている場合は、それを使用する必要があります。
マルチパス シェーダー アプローチを使用する必要があります。このアプローチでは、最初のパスでタイル化された石のテクスチャを使用してベース オブジェクトをレンダリングし、その上に別の透明アルファ マップを使用して、さまざまなシェーダーとさまざまなディテール テクスチャを使用してデカール パスをレンダリングします。
(透過マップは詳細テクスチャに格納することもできますが、別々にしておくと、さまざまなタイル レベルが可能になり、再利用の柔軟性が高まります。)
さらに、タイル レベルをハードコードする必要がないように、デカール パス 1 ごとに異なるテクスチャ座標チャネルを使用できます。
そのため、少なくとも 2 つのシェーダーが必要ですが、シェーダー 2 は必要なデカールと同じ頻度で使用されます。
- タイル状のベース テクスチャをレンダリングするシェーダー
- 個別の透明度マップを使用して 1 つのタイル化されたディテール テクスチャをレンダリングするシェーダー。
複数のデカールがある場合、Z ファイティングが発生する可能性があるため、ポリゴンを少しオフセットする必要があります。(基本的な単純なファー レンダリングと非常によく似ています。)
それ以外の場合は、複数のテクスチャを取得してベースのタイル テクスチャの上に配置する単一のシェーダが必要です。このソリューションは柔軟性に欠けますが、テクスチャ間の混合に 1 つのテクスチャを使用できます (2D 配列に等しい)。