1

Shaders for Game Programming and Artists を読んでいます。第 13 章「ゼロからマテリアルを構築する」では、パーリン ノイズを使用して大理石や木材などの複雑なマテリアルをシミュレートするレンダリング テクニックをいくつか紹介しました。しかし、私は木のレンダリングに困惑しています。木をシミュレートするには、森の中に輪を作成できるように、特定の平面に沿って円の値を与える関数が必要です。これは、著者が「平面に沿って 2 つの軸のドット積を取り、その平面上に円の値を作成する」と述べたことです。

Circle = dot(noisetxr.xy, noisetxr.xy);

noisetxr は float3 です。ノイズ テクスチャをサンプリングするためのテクスチャ座標です。内積が円形の値になる理由がわかりません
。完全なコードは次のとおりです (hlsl のピクセル シェーダ):

float persistance;
float4 wood_color;  //a predefined value
sampler Texture0;   // noise texture
float4 ps_main(float3 txr: TEXCOORD0) : COLOR 
{
   // Determine two set of coordinates, one for the noise
   // and one for the wood rings
   float3 noisetxr = txr;
   txr = txr/8;

   // Combine 3 octaves of noise together.
   float final_noise = 0;
   for(int i=0;i<2;i++)
      final_noise += ((1.0/pow(persistance,i))*
        ((tex3D(Texture0, txr*pow(2,i))*2)-1));

   // The wood is defined by a set of concentric rings in the XY
   // plane. Those rings are pertubated by the computed noise.
   final_noise = abs(final_noise);
   float grain = cos(dot(noisetxr.xy,noisetxr.xy) + final_noise*4);//what is this ??
   return wood_color - pow(grain,8)/2; //raising the cosine to higher power
}

コサイン関数をより高いべき乗にすると、よりシャープなリングが作成されることはわかっていますが、内積はどういう意味ですか? 円の値を作成できるのはなぜですか?

4

1 に答える 1

0

ベクトルとそれ自体の内積は、単純にベクトルの長さの 2 乗になります。したがって、xy 平面の各点dot(noisetxr.xy,noisetxr.xy)について、点から原点までの距離の 2 乗を返します。ここで、この距離に余弦関数を適用します。つまり、原点までの距離が同じ平面上のすべての点に対して、同じ出力値が作成されます => 原点の周りに等しい値の円が作成されます。

于 2013-09-18T18:54:30.490 に答える