Показать сообщение отдельно
Старый 04.06.2009, 20:16   #2
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Мультитекстурирование в 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();
}
}
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием