|
|
Terrain Shader
#271417
06/13/09 01:51
06/13/09 01:51
|
Joined: Oct 2008
Posts: 679 Germany
Ayumi
OP
User
|
OP
User
Joined: Oct 2008
Posts: 679
Germany
|
Huhu, Eine kleine Frage: Meinem Terrain konnte ich nun, dank slin, per Farbmaske einen Shader zu weisen um verschiedene Detailmaps zumsammenzufuegen. Das funktioniert auch super mit einer Shadowmap, so das ich genau 3 Skins habe+ 3 detailmaps. Nun meine Frage: Wie kann ich es bewerkstelligen, dass das terrain nun eine Art Caustics darstellen kann. (sozusagen der schatten der Wolken...welche sich von einem ende zum anderen ziehen)
// multirgb.wdl
// entSkin1 Texture Base
// entSkin2 Texture Layer Red
bmap tex1 = <gras.bmp>; // RGB Mask
bmap tex4 = <road.bmp>; // Texture Layer Green
bmap tex5 = <sand.bmp>; // Texture Layer Blue
bmap tex6 = <detailmap.tga>; // DetailMap
function multirgb_roughness()
{
bmap_to_mipmap(mtl.Skin1);
bmap_to_mipmap(mtl.Skin2);
bmap_to_mipmap(mtl.Skin3);
bmap_to_mipmap(mtl.Skin4);
}
material multirgb
{
flags = tangent;
skin1 = tex1;
skin2 = tex4;
skin3 = tex5;
skin4 = tex6;
event = multirgb_roughness;
effect
"
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Define your needed values
float4x4 matWorldViewProj; //
float4x4 matWorld;
float4x4 matWorldInv;
float4x4 matWorldView;
float4 vecSunDir;
float4 vecFog;
// Define your textures
texture mtlSkin1;
texture mtlSkin2;
texture mtlSkin3;
texture mtlSkin4;
texture entSkin1;
texture entSkin2;
texture entSkin3;
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Texture settings
sampler sTex1 = sampler_state
{
Texture = <entSkin2>; // RGB Mask
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex2 = sampler_state
{
Texture = <entSkin1>; // Texture Base
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex3 = sampler_state
{
Texture = <mtlSkin1>; // Texture Layer Red
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex4 = sampler_state
{
Texture = <mtlSkin2>; // Texture Layer Green
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex5 = sampler_state
{
Texture = <mtlSkin3>; // Texture Layer Blue
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex6 = sampler_state
{
Texture = <mtlSkin4>; // Detailmap for Base Texture
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex7 = sampler_state
{
Texture = <entSkin3>; // RGB Mask
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
struct TMULTI_VS_OUT // Output to the pixelshader fragment
{
float4 Pos : POSITION;
float Fog : FOG;
float4 sun : COLOR0;
float2 Tex1 : TEXCOORD0;
float2 Tex2 : TEXCOORD1;
float2 Tex3 : TEXCOORD2;
float2 Tex4 : TEXCOORD3;
float2 Tex5 : TEXCOORD5;
float2 Tex6 : TEXCOORD6;
};
float DoFog(float4 Pos) {
float3 P = mul(Pos,matWorldView);// apply the linear fog formula
return saturate((vecFog.y-P.z) * vecFog.z);
}
TMULTI_VS_OUT TMulti_VS(
float4 inPos : POSITION,
float3 inNormal : NORMAL,
float2 inTexCoord0 : TEXCOORD0)
{
TMULTI_VS_OUT Out;
// transform the vector position to screen coordinates
Out.Pos = mul(inPos,matWorldViewProj);
// rotate and normalize the normal
float3 N = normalize(mul(inNormal,matWorldInv));
Out.sun = dot(N,-vecSunDir);
Out.Fog = DoFog(inPos);
// scale the texture coordinates for the masked textures
Out.Tex1 = inTexCoord0.xy; // Tile Mask
Out.Tex2 = inTexCoord0.xy; // Tile Base Texture
Out.Tex3 = inTexCoord0.xy*50; // Tile Texture Layer Red
Out.Tex4 = inTexCoord0.xy*50; // Tile Texture Layer Green
Out.Tex5 = inTexCoord0.xy*30; // Tile Texture Layer Blue
Out.Tex6 = inTexCoord0.xy*20; // Tile Texture Layer Detailmap
return Out;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// pixelshader
float4 ps( TMULTI_VS_OUT In ) : COLOR
{
float4 MaskColor = tex2D(sTex1,In.Tex1);
float4 BaseColor = tex2D(sTex2,In.Tex2);
float4 RedColor = tex2D(sTex3,In.Tex3);
float4 GreenColor = tex2D(sTex4,In.Tex4);
float4 BlueColor = tex2D(sTex5,In.Tex5);
float4 DetailColor = tex2D(sTex6,In.Tex5);
BaseColor = BaseColor + DetailColor - 0.5;
float4 BaseRed = lerp(BaseColor,RedColor,MaskColor.r);
float4 BaseGreen = lerp(BaseRed,GreenColor,MaskColor.g);
float4 FinalColor = lerp(BaseGreen,BlueColor,MaskColor.b);
FinalColor = (FinalColor+FinalColor*In.sun)/2;
FinalColor *= tex2D(sTex7, In.Tex1);
FinalColor.a = 1.0f; // prevent transparency
return FinalColor;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
technique mytechnique
{
// Define your passes
pass p0
{
VertexShader = compile vs_2_0 TMulti_VS();
PixelShader = compile ps_2_0 ps();
}
}
";
}
action multi_terrain
{
my.material = multirgb;
}
|
|
|
Re: Terrain Shader
[Re: Ayumi]
#271488
06/13/09 12:51
06/13/09 12:51
|
Joined: Mar 2006
Posts: 2,252
Hummel
Expert
|
Expert
Joined: Mar 2006
Posts: 2,252
|
einfache Kiste: erstmal bastelste dir ne entsprechende Bitmap - im Gimp einfach per "Plasmatisches Rauschen"(kachelbar) erzeugen lassen. Im Shader deklarierst du die Skin (wie auch die anderen) und die float4 vecTime; Variable. Dann multiplizierst du den Ausgabefarbwert mit jenem: float cloud_shadows=tex2D(CloudMapSampler,In.Tex1*vecTime.w); also FinalColor*cloud_shadows; ...wenn das dir zu dunkel wird dann mach einfach Folgendes noch vorher: cloud_shadows=saturate(cloud_shadows+0.4f); oder sowas... Die Idee ist nicht neu aber gut und einfach  -zählt aber nicht als Kaustiken -> http://de.wikipedia.org/wiki/Kaustik_(Optik)
|
|
|
Re: Terrain Shader
[Re: Hummel]
#271501
06/13/09 14:45
06/13/09 14:45
|
Joined: Oct 2008
Posts: 679 Germany
Ayumi
OP
User
|
OP
User
Joined: Oct 2008
Posts: 679
Germany
|
Danke dir:) Ja ich wusste nicht wie ich das beschreiben sollte. Und das war das naheliegenste^^ Und wo bzw wie soll die map wandern? Dadurch:?"In.Tex1*vecTime" Hier mal mein versuch:
texture entSkin4;
sampler sTex8 = sampler_state
{
Texture = <entSkin3>; // cloud mask
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
float cloud_shadows=tex2D(sTex8,In.Tex1*vecTime.w);
Nur das mit der Matrix versteh ich nicht ganz. Koenntet du mir bitte noch ein wenig helfen? Danke
Last edited by Ayumi; 06/13/09 14:51.
|
|
|
Re: Terrain Shader
[Re: Ayumi]
#271524
06/13/09 17:50
06/13/09 17:50
|
Joined: Mar 2006
Posts: 2,252
Hummel
Expert
|
Expert
Joined: Mar 2006
Posts: 2,252
|
erstmal: ups-die vecTime muss dazu addiert werden: float cloud_shadows=tex2D(sTex8,In.Tex1+vecTime.w*0.001f); -> durch das Hinzuaddieren von Werten zu den Texturkoordinaten werden die verschoben und da vecTime.w pro Frame größer wird (ob zyklisch oder nicht weis ich nicht) wandert die entsprechende Textur. So wie eben beschrieben wird vecTime.w gleichermaßen zu den x & y Elementen der Texcoordinaten hinzu addiert, folglicherweiße wird die Textur schräg verschoben. Was also auch geht: float speed=0.001f; float T=vecTime.w*speed; [...] In.Tex+float2(1,0)*T //-> nur entlang der x-Koordinate In.Tex+float2(0,1)*T //-> nur entlang der y-Koordinate oder auch: In.Tex+float2(1,-2)*T //->entlang x und mit doppelter Geschwindigkeit rückwärts entlang y (irgendwas schräges also) ...wenn du die Richtung per Winkelangabe bestimmen willst geht das irgendwie so: float ang=34;//34 Grad ang=radians(ang); In.Tex+float2(cos(ang),sin(ang))*T //-> 34 Grad -> das verschiebt aber nur die Textur um die angegebenen Grad, rotiert sie aber nicht - dazu brauchst du dann noch eine kleine Rotationsmatrix  und was wolltest du jetzt noch wegen was für einer Matrix? und vergiss nicht im Lite-C Code die neue Bitmap zu deklarieren und die vecTime im Shader(am besten gleich oben bei vecFog und dem ganzen Rest).
Last edited by Hummel; 06/13/09 17:51.
|
|
|
Re: Terrain Shader
[Re: Hummel]
#271539
06/13/09 18:59
06/13/09 18:59
|
Joined: Oct 2008
Posts: 679 Germany
Ayumi
OP
User
|
OP
User
Joined: Oct 2008
Posts: 679
Germany
|
So ich habs soweit. Btw:Das ist C-script, nicht lite-c(Lite-c lern ich gerade^^) Mhm aber da tut sich nichts. Was koennte noch fehlen?!? sTex7 ist die Shadowmap. sTex8 in dem Fall die clouds.
// multirgb.wdl
// entSkin1 Texture Base
// entSkin2 Texture Layer Red
bmap tex1 = <gras.bmp>; // RGB Mask
bmap tex4 = <road.bmp>; // Texture Layer Green
bmap tex5 = <sand.bmp>; // Texture Layer Blue
bmap tex6 = <detailmap.tga>; // DetailMap
function multirgb_roughness()
{
bmap_to_mipmap(mtl.Skin1);
bmap_to_mipmap(mtl.Skin2);
bmap_to_mipmap(mtl.Skin3);
bmap_to_mipmap(mtl.Skin4);
}
material multirgb
{
flags = tangent;
skin1 = tex1;
skin2 = tex4;
skin3 = tex5;
skin4 = tex6;
event = multirgb_roughness;
effect
"
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Define your needed values
float4x4 matWorldViewProj; //
float4x4 matWorld;
float4x4 matWorldInv;
float4x4 matWorldView;
float4 vecSunDir;
float4 vecFog;
float4 vecTime;
// Define your textures
texture mtlSkin1;
texture mtlSkin2;
texture mtlSkin3;
texture mtlSkin4;
texture entSkin1;
texture entSkin2;
texture entSkin3;
texture entSkin4;
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Texture settings
sampler sTex1 = sampler_state
{
Texture = <entSkin2>; // RGB Mask
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex2 = sampler_state
{
Texture = <entSkin1>; // Texture Base
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex3 = sampler_state
{
Texture = <mtlSkin1>; // Texture Layer Red
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex4 = sampler_state
{
Texture = <mtlSkin2>; // Texture Layer Green
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex5 = sampler_state
{
Texture = <mtlSkin3>; // Texture Layer Blue
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex6 = sampler_state
{
Texture = <mtlSkin4>; // Detailmap for Base Texture
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex7 = sampler_state
{
Texture = <entSkin3>; // RGB Mask
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
sampler sTex8 = sampler_state
{
Texture = <entSkin4>; // cloud mask
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
struct TMULTI_VS_OUT // Output to the pixelshader fragment
{
float4 Pos : POSITION;
float Fog : FOG;
float4 sun : COLOR0;
float2 Tex1 : TEXCOORD0;
float2 Tex2 : TEXCOORD1;
float2 Tex3 : TEXCOORD2;
float2 Tex4 : TEXCOORD3;
float2 Tex5 : TEXCOORD5;
float2 Tex6 : TEXCOORD6;
};
float DoFog(float4 Pos) {
float3 P = mul(Pos,matWorldView);// apply the linear fog formula
return saturate((vecFog.y-P.z) * vecFog.z);
}
TMULTI_VS_OUT TMulti_VS(
float4 inPos : POSITION,
float3 inNormal : NORMAL,
float2 inTexCoord0 : TEXCOORD0)
{
TMULTI_VS_OUT Out;
// transform the vector position to screen coordinates
Out.Pos = mul(inPos,matWorldViewProj);
// rotate and normalize the normal
float3 N = normalize(mul(inNormal,matWorldInv));
Out.sun = dot(N,-vecSunDir);
Out.Fog = DoFog(inPos);
// scale the texture coordinates for the masked textures
Out.Tex1 = inTexCoord0.xy; // Tile Mask
Out.Tex2 = inTexCoord0.xy; // Tile Base Texture
Out.Tex3 = inTexCoord0.xy*50; // Tile Texture Layer Red
Out.Tex4 = inTexCoord0.xy*50; // Tile Texture Layer Green
Out.Tex5 = inTexCoord0.xy*30; // Tile Texture Layer Blue
Out.Tex6 = inTexCoord0.xy*20; // Tile Texture Layer Detailmap
return Out;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
// pixelshader
float4 ps( TMULTI_VS_OUT In ) : COLOR
{
float4 MaskColor = tex2D(sTex1,In.Tex1);
float4 BaseColor = tex2D(sTex2,In.Tex2);
float4 RedColor = tex2D(sTex3,In.Tex3);
float4 GreenColor = tex2D(sTex4,In.Tex4);
float4 BlueColor = tex2D(sTex5,In.Tex5);
float4 DetailColor = tex2D(sTex6,In.Tex5);
BaseColor = BaseColor + DetailColor - 0.5;
float4 BaseRed = lerp(BaseColor,RedColor,MaskColor.r);
float4 BaseGreen = lerp(BaseRed,GreenColor,MaskColor.g);
float4 FinalColor = lerp(BaseGreen,BlueColor,MaskColor.b);
FinalColor = (FinalColor+FinalColor*In.sun)/2;
FinalColor *= tex2D(sTex7, In.Tex1);
float sTex8=tex2D(sTex8,In.Tex1*vecTime.w);
FinalColor.a = 1.0f; // prevent transparency
return FinalColor;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
technique mytechnique
{
// Define your passes
pass p0
{
VertexShader = compile vs_2_0 TMulti_VS();
PixelShader = compile ps_2_0 ps();
}
}
";
}
action multi_terrain
{
my.material = multirgb;
}
Last edited by Ayumi; 06/13/09 19:00.
|
|
|
Re: Terrain Shader
[Re: Hummel]
#271565
06/13/09 23:02
06/13/09 23:02
|
Joined: Oct 2008
Posts: 679 Germany
Ayumi
OP
User
|
OP
User
Joined: Oct 2008
Posts: 679
Germany
|
Oh man, du bist n schatz:)
Es funktioniert und sieht absolut geil aus^^
vielen ddank.
PS: bloed nur, das ich zwischen der map ein schwarzen streifen habe..-.-
Weisst du zufaellig wie der zustande kommt?
Last edited by Ayumi; 06/13/09 23:15.
|
|
|
Re: Terrain Shader
[Re: Ayumi]
#271713
06/14/09 16:42
06/14/09 16:42
|
Joined: Mar 2006
Posts: 2,252
Hummel
Expert
|
Expert
Joined: Mar 2006
Posts: 2,252
|
|
|
|
Re: Terrain Shader
[Re: Hummel]
#332624
07/11/10 09:36
07/11/10 09:36
|
Joined: Oct 2008
Posts: 679 Germany
Ayumi
OP
User
|
OP
User
Joined: Oct 2008
Posts: 679
Germany
|
Heyho, ich habe jetzt eine lange Pause gemacht, und nun such ich mir gerade meine alten Scripte zusammen.Darunter dieser Shader.Nur oberer Code funktioniert nicht mehr und der Fehler liegt irgendwo in diesem Codeblock:
// pixelshader
float4 ps( TMULTI_VS_OUT In ) : COLOR
{
float4 MaskColor = tex2D(sTex1,In.Tex1);
float4 BaseColor = tex2D(sTex2,In.Tex2);
float4 RedColor = tex2D(sTex3,In.Tex3);
float4 GreenColor = tex2D(sTex4,In.Tex4);
float4 BlueColor = tex2D(sTex5,In.Tex5);
float4 DetailColor = tex2D(sTex6,In.Tex5);
BaseColor = BaseColor + DetailColor - 0.5;
float4 BaseRed = lerp(BaseColor,RedColor,MaskColor.r);
float4 BaseGreen = lerp(BaseRed,GreenColor,MaskColor.g);
float4 FinalColor = lerp(BaseGreen,BlueColor,MaskColor.b);
FinalColor = (FinalColor+FinalColor*In.sun)/2;
FinalColor *= tex2D(sTex7, In.Tex1);
float speed=0.01f;
float sTex8=tex2D(sTex8,In.Tex1+vecTime.w*speed);
FinalColor*=sTex8;
FinalColor.a = 1.0f; // prevent transparency
return FinalColor;
}
Fehlermeldungen sind:  Danke.
Last edited by Ayumi; 07/11/10 09:36.
|
|
|
|