我正在阅读Shaders for Game Programming and Artists。在第 13 章“从零开始的建筑材料”中,作者介绍了一些渲染技术,利用 Perlin 噪声模拟大理石或木材等复杂材料。但我对木材渲染感到困惑。为了模拟木材,我们需要一个函数沿特定平面给出一个圆形值,以便我们可以在树林中创建环。这就是作者所说的“沿平面取两个轴的点积,在该平面上创建圆形值”
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
}
我知道将余弦函数提高到更高的幂会产生更尖锐的环,但是点积是什么意思?为什么它可以创造一个圈子的价值?