DirectX11 多重纹理

多重纹理

1. 什么是多重纹理?

多重纹理效果是在一个物体表面显示 2 张纹理图像。 我们可以通过对两者的纹理图像采样,使用 color1×color2 作为最终的像素颜色值。
多重纹理是一个十分有用的技术。有时我们需要表现诸如光照贴图,阴影贴图,细节贴图等,就可以一次使用多张纹理图像来获得最终效果。

2. 多重纹理如何实现?

在多重纹理 Demo 中,我们载入两张纹理图像,并且都传递给我们的着色器,就像之前处理一张纹理那样。在 MultiTextureDemo 类中添加了用于处理第二张纹理的资源视图:

    ID3D11ShaderResourceView* colorMap_;
    ID3D11ShaderResourceView* secondMap_;

Demo 中,我们只需简单的拷贝用于第 1 张纹理的代码,处理第 2 张纹理。 在着色器中,我们简单的对两张纹理图像采样,并且返回颜色乘积作为最终渲染效果:

float4 PS_Main( PS_Input frag ) : SV_TARGET
{
    float4 col = colorMap.Sample( colorSampler, frag.tex0 );
    float4 col2 = secondMap.Sample( colorSampler, frag.tex0 );
    return col * col2;
}

注意一点: 在 HLSL 文件中,第一张使用 t0 变量绑定, 第二张纹理使用 t1 变量绑定:

Texture2D colorMap : register( t0 );
Texture2D secondMap : register( t1 );
3. HLSL代码
/*
    Beginning DirectX 11 Game Programming
    By Allen Sherrod and Wendy Jones

    Multi-Texturing Shader
*/


Texture2D colorMap : register( t0 );
Texture2D secondMap : register( t1 );
SamplerState colorSampler : register( s0 );


cbuffer cbChangesEveryFrame : register( b0 )
{
    matrix worldMatrix;
};

cbuffer cbNeverChanges : register( b1 )
{
    matrix viewMatrix;
};

cbuffer cbChangeOnResize : register( b2 )
{
    matrix projMatrix;
};


struct VS_Input
{
    float4 pos  : POSITION;
    float2 tex0 : TEXCOORD0;
};

struct PS_Input
{
    float4 pos  : SV_POSITION;
    float2 tex0 : TEXCOORD0;
};


PS_Input VS_Main( VS_Input vertex )
{
    PS_Input vsOut = ( PS_Input )0;
    vsOut.pos = mul( vertex.pos, worldMatrix );
    vsOut.pos = mul( vsOut.pos, viewMatrix );
    vsOut.pos = mul( vsOut.pos, projMatrix );
    vsOut.tex0 = vertex.tex0;

    return vsOut;
}


float4 PS_Main( PS_Input frag ) : SV_TARGET
{
    float4 col = colorMap.Sample( colorSampler, frag.tex0 );
    float4 col2 = secondMap.Sample( colorSampler, frag.tex0 );

    return col * col2;
}


technique11 MultiTexture
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_5_0, VS_Main() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_5_0, PS_Main() ) );
    }
}

贴图1:
1

贴图2:
2

贴图1+贴图2,实现多重纹理:
3

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值