Ответ: Мультитекстурирование в Xors3D.
почему бы и нет)
набросал:
не ручаюсь что без ошибок)
const float4x4 MatWorldViewProj;
texture Diffuse1; //тайл первый, использует 1й текстурный канал
texture Diffuse2; //тайл второй, использует 1й текстурный канал
texture Mask; //маска, где черное - тайл1, белое - тайл2, использует второй канал
sampler2D DiffTex1 = sampler_state {
Texture = <Diffuse1>;
MagFilter = Linear;
MinFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler2D DiffTex2 = sampler_state {
Texture = <Diffuse2>;
MagFilter = Linear;
MinFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler2D MaskTex = sampler_state {
Texture = <Mask>;
MagFilter = Linear;
MinFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
struct vi {
float4 Position : POSITION0;
float2 TexCoords : TEXCOORD0;
float2 TexCoords1 : TEXCOORD1;
};
struct pi {
float4 Position : POSITION0;
float2 TexCoords : TEXCOORD2;
float2 TexCoords1 : TEXCOORD3;
};
void vs( in vi IN, out pi OUT ) {
OUT.Position= mul(IN.Position,MatWorldViewProj);
OUT.TexCoords = IN.TexCoords;
OUT.TexCoords1 = IN.TexCoords1;
}
float4 maskedps( in pi IN ) : COLOR0
{
float3 diff1=tex2D(DiffTex1,IN.TexCoords);
float3 diff2=tex2D(DiffTex2,IN.TexCoords);
float mask=tex2D(MaskTex,IN.TexCoords1).r;
return float4( lerp(diff1,diff2,mask), 1.0f);
}
technique masked
{
pass p0
{
AlphaBlendEnable = False;
vertexshader = compile vs_2_0 vs();
PixelShader = compile ps_2_0 maskedps();
}
}
|