3

ピクセルごとの法線を使用して 2D テクスチャ クワッドをレンダリングするための最も簡単で簡単かつ最速の手法を探しています。私が意味するのは、カメラが固定され、すべてのテクスチャクワッドが同じ方向 (カメラ) を向いている 3D 世界であり、それらの間に光点があり、テクスチャにピクセルごとの法線値を持たせたいので、それらは 3D モデルであるかのように点灯します。

私がネットで見つけたほとんどのテクニックは、実際の 3D モデルを参照しているため、あまりにも複雑で重いものですが、必要なのは単純な 2D クワッドだけです。

誰かが適切なテクニックを知っているか、役に立つチュートリアルを投稿できますか? あ、DXのみお願いします。

ありがとう。

4

2 に答える 2

3

私は directX よりも XNA の経験が豊富ですが、原則は同じです。

法線マップが必要です。これにより、特定のポイントでのサーフェス法線が正確にシェーダーに伝えられます。次に、クワッドをテクスチャ マップする必要があります (おそらく既にマップされているので、これは実際には余分な作業ではありません)。次に、ピクセル シェーダーでクワッドを描画し、シェーダー内で次のようにします。

//This shader only handles one directional light, there are various tecnhiques for handling multiple lights.
float3 LightDirection;

//Normal map, set this before rendering the quad
Texture NormalMap;
//sampler
sampler normalSampler = sampler_state
{
  texture = <NormalMap>;
}

//Diffusemap, set this before rendering the quad. This is just your normal texture you want applied to the quad
Texture DiffuseMap;
//sampler
sampler diffuseSampler = sampler_state
{
  texture = <DiffuseMap>;
}

/* you probably need a vertex shader to run all your translations etc, that's pretty bog standard stuff so I won't include one here */

float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0
{
  //standard directional lighting equation with normals
  float3 Normal = tex2D(normalSampler, texCoord);
  float dot = dot(LightDirection, Normal);
  return tex2D(normalSampler, texCoord) * dot;
}
于 2009-12-15T21:52:38.037 に答える
0

その場合、接線ベースを形成する必要さえないので、非常に簡単です。指向性照明を仮定すると、ライトをビュー空間に変換すると、法線マップからの法線 (N) に対してライト (L) を直接 NL できます。ライト ベクトルをビュー空間に変換するには、単純にビュー マトリックスを掛けます。

点照明が必要な場合は、もう少し複雑です。まず、ライトの位置をビュー スペースに変換する必要があります。次に、ピクセル位置からライト位置を減算し、結果のベクトルを正規化し、それを NL 計算で L ベクトルとして使用する必要があります:)

いずれにせよ...仕事は終わりました!:D

于 2009-12-17T09:10:44.487 に答える