本文共 1981 字,大约阅读时间需要 6 分钟。
多重纹理效果是在一个物体表面显示 2 张纹理图像。 我们可以通过对两者的纹理图像采样,使用 color1×color2 作为最终的像素颜色值。
多重纹理是一个十分有用的技术。有时我们需要表现诸如光照贴图,阴影贴图,细节贴图等,就可以一次使用多张纹理图像来获得最终效果。
在多重纹理 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 );
/* 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:
贴图2:
贴图1+贴图2,实现多重纹理: