hi,
hier der shader. (habe den shader aus dem forum hier umgepopellt)
aber fragt nicht was ich alles gemacht habe, fast alles nach dem prinzip testen schauen.
man braucht 4 texturen mit jeweils der passenden detailtextur im alphakanal.
habe tga genommen.
nun braucht man auch noch die passende hmp mit 4 texturen mit alpha. die alle sind blendmaps.
skin1=matrialmap für grundtexturen wie grass sand stein
skin2=watermap für flussbett da hab ich kieselsteine genommen
skin3=roadmap für straßen hab texturen mit pixelshader gemixt um anderen effekt zu bekommen
skin4=shadowmap für statische schatten oder irgend was anderes
schön wär wenn man die pass reduzieren könnte oder noch besser alles verbessern oder egal macht mal was draus

.
bumpmaping könnte auch klasse sein, bekomm ich aber nicht hin.
ich hau euch das mal hier ins forum villeicht hat jemand einen tip.
bilder sind auf meiner hp zu sehen wie es bei mir aussieht.
Code:
bmap stein = <stein.tga>;//im alpha liegt die passende detailtextur
bmap grass = <grass.tga>;//im alpha liegt die passende detailtextur
bmap sand = <sand.tga>;//im alpha liegt die passende detailtextur
bmap kiesel = <kiesel.tga>;//im alpha liegt die passende detailtextur
material mat_terrain_multitexture
{
skin1=kiesel;
Skin2=sand;
skin3=stein;
skin4=grass;
effect=
"
texture entSkin1;
texture entSkin2;
texture entSkin3;
texture entSkin4;
texture mtlSkin1;
texture mtlSkin2;
texture mtlSkin3;
texture mtlSkin4;
matrix matWorldViewProj;
//----------
matrix matWorld;
matrix matWorldView;
vector vecSunDir;
vector vecDiffuse;
vector vecAmbient;
vector vecLight;
vector vecFog;
//----------
vector vecSkill41;
vector vecSkill43;
technique multitextureps11
{
// pass textur auflegen
pass p0
{
texture[0]=<mtlSkin3>;
texture[1]=<mtlSkin2>;
texture[2]=<mtlSkin4>;
texture[3]=<entSkin1>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
magFilter[3]=linear;
minFilter[3]=linear;
mipFilter[3]=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]=(10.00,10.00);//texturgröße
vertexShaderConstant[67]=<vecSkill41>;//detail größe
//-----------------
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.0
m4x4 oPos,v0,c0 // transform position to clip space
mul oT0.xy,v7.xy,c64.xy //sand textur vertexShaderConstant[64] output scaled uvs - stage 0
mul oT1.xy,v7.xy,c64.xy //stein mit detail textur
mul oT2.xy,v7.xy,c64.xy //grass textur
mov oT3.xy,v7.xy // blend map
//-----------------
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.1
def c0,1,1,1,1
tex t0
tex t1
tex t2
tex t3
mov r1,t0
lrp r0.rgb,t3.a,r1,t1 // blend t0 with t1 depending on t3 alpha
+mov r0.a,c0
mov r1.a,t3.b
lrp r0.rgb,r1.a,r0,t2 // blend the result with t2 depending on t3 blue
+mov r0.a,c0
mul r0.rgb,r0,v0 // modulate with diffuse vertex lighting
};
}
//neuer pass wege
pass p1
{
texture[0]=<entSkin3>;
texture[1]=<mtlSkin2>;
texture[2]=<mtlSkin2>;
texture[3]=<mtlSkin2>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
magFilter[3]=linear;
minFilter[3]=linear;
mipFilter[3]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0
mov oT0.xy,v7.xy
mul oT1.xy,v7.xy,c64.xy
mul oT2.xy,v7.xy,c64.xy
mul oT3.xy,v7.xy,c64.xy
};
pixelShader=
asm
{
ps.1.1
def c0,1,1,1,1
def c1,0,0,0,0.8 // kontrast vom weg
def c2,0,0,0,1 // kontrast vom weg1
def c3,0,0,0,0.4 // kontrast vom wegdetail
tex t0
tex t1
tex t2
tex t3
mul r0,t0,c1
lrp r0.rgb,r0,r0,t1
mul t2,r0,c2
lrp r0.rgb,r0,r0,t2
};
}
//pass ende
//neuer pass textur detail
pass p2
{
texture[0]=<mtlSkin3>;
texture[1]=<mtlSkin2>;
texture[2]=<mtlSkin4>;
texture[3]=<entSkin1>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
magFilter[3]=linear;
minFilter[3]=linear;
mipFilter[3]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0 // transform position to clip space
mul oT0.xy,v7.xy,c67.xy
mul oT1.xy,v7.xy,c67.xy
mul oT2.xy,v7.xy,c67.xy
mov oT3.xy,v7.xy
};
pixelShader=
asm
{
ps.1.1
def c0,0,0,0,0.3
tex t0 //sand mit mud textur
tex t1 //stein mit detail textur
tex t2 //grass mit dreck textur
tex t3 //blendmap
mov r1,t0.a
lrp r0.rgb,t3.a,r1,t1.a // blend t0 with t1 depending on t3 alpha
+mov r0.a,c0
mov r1.a,t3.b
lrp r0.rgb,r1.a,r0,t2.a // blend the result with t2 depending on t3 blue
+mov r0.a,c0
};
}
//pass ende
//neuer pass wasser wege
pass p3
{
texture[0]=<entSkin2>;
texture[1]=<mtlSkin1>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0 // transform position to clip space
mov oT0.xy,v7.xy
mul oT1.xy,v7.xy,c67.xy
};
pixelShader=
asm
{
ps.1.1
def c0,1,1,1,1
tex t0
tex t1
mul r0,t0,c0
lrp r0.rgb,t1,r0,t1
};
}
//pass ende
//neuer pass textur detail wege
pass p4
{
texture[0]=<entSkin3>;
texture[1]=<mtlSkin2>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0 // transform position to clip space
mov oT0.xy,v7.xy
mul oT1.xy,v7.xy,c67.xy
};
pixelShader=
asm
{
ps.1.1
def c0,0.3,0.3,0.3,0.3
tex t0
tex t1
mul r0,t0,c0
lrp r0.rgb,t1,r0,t1
};
}
//pass ende
}
";
}
starter mat_terrain_multitexture_init
{
bmap_to_mipmap(mat_terrain_multitexture.skin1);
bmap_to_mipmap(mat_terrain_multitexture.skin2);
bmap_to_mipmap(mat_terrain_multitexture.skin3);
bmap_to_mipmap(mat_terrain_multitexture.skin4);
}
/*
function terrain()
{
my.skill41=float(50); //detail scale x
my.skill42=float(50); //detail scale y
my.transparent = off;
my.ambient = 100;
my.material = mat_terrain_multitexture;
}
*/
code geändert habe fehler gefunden hatte nebel vergessen.
Code:
bmap weg = <weg.tga>;
bmap stein = <stein.tga>;
bmap grass = <grass.tga>;
bmap sand = <sand.tga>;
bmap kiesel = <kiesel.tga>;
bmap detail = <detail.tga>;
material mat_terrain_multitexture
{
skin1=kiesel;
Skin2=sand;
skin3=stein;
skin4=grass;
effect=
"
texture entSkin1;
texture entSkin2;
texture entSkin3;
texture entSkin4;
texture mtlSkin1;
texture mtlSkin2;
texture mtlSkin3;
texture mtlSkin4;
matrix matWorldViewProj;
//----------
matrix matWorld;
matrix matWorldView;
vector vecSunDir;
vector vecDiffuse;
vector vecAmbient;
vector vecLight;
vector vecFog;
//----------
vector vecSkill41;
vector vecSkill43;
technique multitextureps11
{
// pass textur auflegen
pass p0
{
texture[0]=<mtlSkin3>;
texture[1]=<mtlSkin2>;
texture[2]=<mtlSkin4>;
texture[3]=<entSkin1>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
magFilter[3]=linear;
minFilter[3]=linear;
mipFilter[3]=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]=(50.00,50.00);//grass texturgröße
vertexShaderConstant[65]=<vecSkill43>;//stein mit detail texturgröße
vertexShaderConstant[66]=(1,1);//sand texturgröße -nop
vertexShaderConstant[67]=<vecSkill41>;
//-----------------
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.0
m4x4 oPos,v0,c0 // transform position to clip space
mul oT0.xy,v7.xy,c64.xy //sand textur vertexShaderConstant[64] output scaled uvs - stage 0
mul oT1.xy,v7.xy,c64.xy //stein mit detail textur
mul oT2.xy,v7.xy,c64.xy //grass textur
mov oT3.xy,v7.xy // blend map
//-----------------
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.1
def c0,1,1,1,1
tex t0 //sand mit mud textur
tex t1 //stein mit detail textur
tex t2 //grass mit dreck textur
tex t3 //blendmap
mov r1,t0
lrp r0.rgb,t3.a,r1,t1 // blend t0 with t1 depending on t3 alpha
+mov r0.a,c0
mov r1.a,t3.b
lrp r0.rgb,r1.a,r0,t2 // blend the result with t2 depending on t3 blue
+mov r0.a,c0
mul r0.rgb,r0,v0 // modulate with diffuse vertex lighting
};
}
//neuer pass wege
pass p1
{
texture[0]=<entSkin3>;
texture[1]=<mtlSkin2>;
texture[2]=<mtlSkin2>;
texture[3]=<mtlSkin2>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
magFilter[3]=linear;
minFilter[3]=linear;
mipFilter[3]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0
mov oT0.xy,v7.xy
mul oT1.xy,v7.xy,c65.xy //1zu1
mul oT2.xy,v7.xy,c65.xy //1zu1
mul oT3.xy,v7.xy,c65.xy //kleiner
//-----------------
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.1
def c0,1,1,1,1
def c1,0,0,0,0.8 // kontrast vom weg
def c2,0,0,0,1 // kontrast vom weg1
def c3,0,0,0,0.4 // kontrast vom wegdetail
tex t0 //materialmap
tex t1 //sand
tex t2 //grass
tex t3 //detail
mul r0,t0,c1
lrp r0.rgb,r0,r0,t1
mul t2,r0,c2
lrp r0.rgb,r0,r0,t2
mul r0.rgb,r0,v0 // modulate with diffuse vertex lighting
};
}
//pass ende
//neuer pass textur detail
pass p2
{
texture[0]=<mtlSkin3>;
texture[1]=<mtlSkin2>;
texture[2]=<mtlSkin4>;
texture[3]=<entSkin1>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
magFilter[2]=linear;
minFilter[2]=linear;
mipFilter[2]=linear;
magFilter[3]=linear;
minFilter[3]=linear;
mipFilter[3]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0 // transform position to clip space
mul oT0.xy,v7.xy,c67.xy
mul oT1.xy,v7.xy,c67.xy
mul oT2.xy,v7.xy,c67.xy
mov oT3.xy,v7.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.1
def c0,0,0,0,0.3
tex t0 //sand mit mud textur
tex t1 //stein mit detail textur
tex t2 //grass mit dreck textur
tex t3 //blendmap
mov r1,t0.a
lrp r0.rgb,t3.a,r1,t1.a // blend t0 with t1 depending on t3 alpha
+mov r0.a,c0
mov r1.a,t3.b
lrp r0.rgb,r1.a,r0,t2.a // blend the result with t2 depending on t3 blue
+mov r0.a,c0
mul r0.rgb,r0,v0 // modulate with diffuse vertex lighting
};
}
//pass ende
//neuer pass wasser wege
pass p3
{
texture[0]=<entSkin2>;
texture[1]=<mtlSkin1>;
magFilter[0]=linear;
minFilter[0]=linear;
mipFilter[0]=linear;
magFilter[1]=linear;
minFilter[1]=linear;
mipFilter[1]=linear;
vertexShader=
decl
{
stream 0;
float v0[3]; //position
float v3[3]; //normal
float v7[2]; //uv
}
asm
{
vs.1.0
m4x4 oPos,v0,c0 // transform position to clip space
mov oT0.xy,v7.xy
mul oT1.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.1
def c0,1,1,1,1
tex t0
tex t1
mul r0,t0,c0
lrp r0.rgb,t1,r0,t1
// mov r1,t0
// lrp r0.rgb,t0,r1,t1 // blend t0 with t1 depending on t3 alpha
// +mov r0.a,c0
// mov r1.a,t3.b
// lrp r0.rgb,r1.a,r0,t2.a // blend the result with t2 depending on t3 blue
// +mov r0.a,c0
mul r0.rgb,r0,v0 // modulate with diffuse vertex lighting
};
}
//pass ende
}
";
}
starter mat_terrain_multitexture_init
{
bmap_to_mipmap(mat_terrain_multitexture.skin1);
bmap_to_mipmap(mat_terrain_multitexture.skin2);
bmap_to_mipmap(mat_terrain_multitexture.skin3);
bmap_to_mipmap(mat_terrain_multitexture.skin4);
}
ok, danke