XNA Shader编程教程3.3-多纹理

3D图形的一个表面可以贴上多个图片,一般称为多层纹理或多重纹理。例如一个正方形有两个纹理,纹理1是墙壁图案:

墙壁纹理

纹理2是光影图案:

光影纹理

两个纹理混合后的效果如图所示:

混合效果

主要的shader代码如下:

float4x4 WorldViewProj : WORLDVIEWPROJECTION;
Texture Texture1; 
Texture Texture2; 
sampler TextureSampler1 = sampler_state
{
    texture = <Texture1>;
    MipFilter = LINEAR;
    MinFilter = LINEAR; 
    MagFilter = LINEAR; 
};

sampler TextureSampler2 = sampler_state
{
    texture = <Texture2>;
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
};

void TransformV1_1(in float4 inputPosition:POSITION,in float2 inputTexCoord:TEXCOORD0, out float4 
			outputPosition:POSITION,out float2 outputTexCoord:TEXCOORD0, out float2 
			outputSecondTexCoord:TEXCOORD1) 
{
    outputPosition = mul(inputPosition,WorldViewProj); 
    outputTexCoord = inputTexCoord; 
    outputSecondTexCoord = inputTexCoord; 
}

void TextureColorV1_1(in float4 P:POSITION,in float2 textureCoords : TEXCOORD0, in float2 textureCoords2 : 
			TEXCOORD1,out float4 diffuseColor : COLOR0)
{
     float4 diffuseColor1 = tex2D(TextureSampler1, textureCoords); 
     float4 diffuseColor2 = tex2D(TextureSampler2, textureCoords2); 
     diffuseColor=lerp(diffuseColor1,diffuseColor2,0.6f); 
}

technique RenderScene
{
    pass P0
    {
         VertexShader = compile vs_1_1 TransformV1_1(); 
         PixelShader = compile ps_1_1 TextureColorV1_1();
     }
}

基本思路就是先用对应的采样器获取两纹理的颜色,接着使用lerp函数在两个颜色之间(前两个参数)进行线性插值,而第3个参数决定前2个参数在插值时的比例,你可以在源代码中试着调整这个参数看看效果。


发布时间:2009/4/10 下午2:19:28  阅读次数:10443

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号