|
三维场景中,特别是自然景观,我们经常会用到Perlin随机数。但在dx9 HLSL中,并没有提供随机数生成函数。怎么办?一种简单的思路,把纹理图片看成数据库,uv坐标就是索引,任何需要的数据都可以通过这种方式引入到 shader中。我们可以利用引入的数据实时生成地形起伏,表面凹凸等等。下面是我最近在Shader中使用Perlin Noise的一个实例。

- sampler texbase; //基础贴图
- sampler texnoise=sampler_state { //随机数纹理
- Texture = <tTX1>;
- };
- float4 mainps(VS_OUTPUT i) : COLOR0
- {
- float4 base=tex2D(texbase,i.uv);
- float3 color=base.xyz;
- float2 uv=i.pos.xy*0.0001; //i.pos为顶点在world space中的位置,变换一下作为uv坐标到noise纹理中取出随机数
- float factor=tex2D(texnoise,uv).r;
- factor+=tex2D(texnoise,uv*20).r/4; //利用多次随机数迭加,可以产生更好的效果
- color.rb *= 0.7+factor/3; //根据生成的随机数改变颜色
- color=color*i.Diffuse.xyz*2+i.Specular.xyz;
- //color=factor; //查看随机数生成结果
- return float4(color,base.a);
- }
复制代码
详细请看这儿 |
|