I have been picking apart vents Terrain Multitexturing Shader (you are the best!) and have tried adapting it for use with PS 1.4 so that I could use more textures.
-Uses 4 entSkins with one being the alphamap.
-Each channel of the alphamap (arbg) is used for blending.
-uses 2 mtlSkins. Those 2 skins are assigned mipmapping in the Starter block.
Just thought I would post some code in case anyone else is working on this for PS 1.4.
Note that there really is no fallback and pixel shader 1.4 is needed.
Heres what I got so far:
// The following is derived *heavily* from Ventilators Terrain Multitexturing Shader.
// Many thanks go to Ventilator for forging the way.
// Steempipe's Terrain Shader rev 2.3.03.1 is my attempt to utilize more textures.
// To use this shader you must have PS1.4 support and VS1.1
////////////////////////////////////////////////////////////////////////////////////
// Load some textures in addition to the entSkins
bmap grass=<grass.bmp>;
bmap grassfine=<grassfine.bmp>;
material mat_terrain_multitexture
{
Skin1 = grass;
Skin2 = grassfine;
effect=
"
texture entSkin1;
texture entSkin2;
texture entSkin3;
texture entSkin4; //Alpha TGA
texture mtlSkin1;
texture mtlSkin2;
matrix matWorldViewProj;
matrix matWorld;
matrix matWorldView;
vector vecSunDir;
vector vecDiffuse;
vector vecAmbient;
vector vecLight;
vector vecFog;
vector vecSkill41;
technique multitexture
{
pass p0
{
texture[0]=<entSkin1>;
texture[1]=<entSkin2>;
texture[2]=<entSkin3>;
texture[3]=<entSkin4>;
texture[4]=<mtlSkin1>;
texture[5]=<mtlSkin2>;
MaxMipLevel[0]= 0;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
MaxMipLevel[1]= 0;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
MaxMipLevel[2]= 0;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
MaxMipLevel[4]= 0;
MagFilter[4]=linear;
MinFilter[4]=linear;
MipFilter[4]=linear;
MaxMipLevel[5]= 0;
MagFilter[5]=linear;
MinFilter[5]=linear;
MipFilter[5]=linear;
zWriteEnable=true;
vertexShaderConstant[0]=<matWorldViewProj>;
vertexShaderConstant[4]=<matWorld>;
vertexShaderConstant[8]=<matWorldView>;
vertexShaderConstant[16]=<vecSunDir>;
vertexShaderConstant[17]=<vecDiffuse>;
vertexShaderConstant[18]=<vecAmbient>;
vertexShaderConstant[19]=<vecLight>;
vertexShaderConstant[20]=<vecFog>;
vertexShaderConstant[64]=<vecSkill41>; //(u_scale1, v_scale1, u_scale2, v_scale2)
vertexShaderConstant[65]=(20.0f,15.0f,0.0f,0.0f);
vertexShaderConstant[66]=(15.0f,20.0f,0.0f,0.0f);
vertexShaderConstant[67]=(25.0f,20.0f,0.0f,0.0f);
vertexShaderConstant[95]=(0.0f,0.0f,0.0f,0.0f);
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.1
m4x4 oPos,v0,c0 // transform position to clip space
mul oT0.xy,v7.xy,c64.xy // output scaled uvs - stage 0
mul oT1.xy,v7.xy,c64.zw // output scaled uvs - stage 1
mul oT2.xy,v7.xy,c65.xy
mov oT3.xy,v7.xy
mul oT4.xy,v7.xy,c66.xy
mul oT5.xy,v7.xy,c67.xy
m3x3 r0,v3,c4 // transform normal to world space
dp3 r0.w,r0,r0 // renormalize it
rsq r0.w,r0.w
mul r0,r0,r0.w
dp3 r0,r0,-c16 // normal.light -> lighting constant
mul r0.xyz,r0,c17 // modulate against material diffuse color
add oD0.xyz,r0,c19 // add environment light
mov r1.w,c20.w // r1.w=1
dp4 r0,v0,c10 // distance to camera position
add r0,r0,-c20.x // distance-fog_start
mad r0.x,-r0.x,c20.z,r1.w // 1-(distance-fog_start)*(1/(fog_end-fog_start))
max oFog.x,r0.x,c95.w // clamp with custom max value
};
pixelShader=
asm
{
ps.1.4
def c0,1,1,1,1
texld r0,t0 // sample t0
texld r1,t1 // sample t1
texld r2,t2 // sample t2
texld r3,t3 // sample t3
texld r4,t4 // sample t4
texld r5,t5 // sample t5
lrp r0.rgb,r3.a,r1,r0 // blend t1 with t0 using the alpha channel of t3
lrp r0.rgb,r3.b,r2,r0 // blend t2 with the result depending on t3 blue
lrp r0.rgb,r3.g,r4,r0 // blend t4 with the result depending on t3 green
lrp r0.rgb,r3.r,r5,r0 // blend t5 with the result depending on t3 red
mul r0.rgb,r0,v0
};
}
}
technique fallback { pass p0 { } }
";
}
starter mat_terrain_multitexture_init
{
// Need to create MipMaps for the mtlSkins
bmap_to_mipmap(mat_terrain_multitexture.skin1);
bmap_to_mipmap(mat_terrain_multitexture.skin2);
}
action terrain_multi_tex
{
my.skill41=float(20);
my.skill42=float(25);
my.skill43=float(10);
my.skill44=float(15);
my.flare = off;
my.transparent = off;
my.albedo = 0;
my.material = mat_terrain_multitexture;
}