Sky rutscht mit ins Wasser

Posted By: xxxxxxx

Sky rutscht mit ins Wasser - 05/09/11 14:48

Hallo,
Ich experimentiere grade etwas mit einem Wasser shader aus einem Tutorial(Danke, Slin! wink ) herum, nach dem ich vertex wellen eingefügt habe sah ich einen Effekt(vorher auch scho nur nicht ganz so stark), der sky rutscht in mein Wassr hinein:

(links Wasser rechts kein Wasser und beim anderen siehts mann) das ganze passiert weil von einem Refractions-View das äüssere Terran geklippt wird(da es über der wasser höhe nix rendert und dann natürlich der sky kommt) und dann etwas verzerrt (und angehoben) wird,
jetzt weiß ich das problem beheben soll, einen Filter im Wasser shader, der alles sky color farbende transperent machen sollte, habe ich schon versucht aber er brachte auch nichts(lag aller höchst wahrscheinlich an mir), und was mir auch noch einfallen würde wäre ein filter der beim redern des views jeweis alles mit dem sky color zu dem ersten nicht sky color farbenden pixel in richtung mittel punkt macht oder so, nur ich kann sowas ohne zich-tausend ifs nicht schreiben frown
Code:
float4x4 matWorld;
float4x4 matWorldViewProj;
float4 vecViewPos;
float4 vecTime;

texture entSkin1;
texture entSkin2;
texture b_reflection_bmap;
texture b_refraction_bmap;
texture b_hight_bmap;

sampler2D smpNormal = sampler_state
{
	Texture = <entSkin1>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Wrap;
	AddressV		= Wrap;
};

sampler2D smpRefl = sampler_state
{
	Texture = <b_reflection_bmap>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Clamp;
	AddressV		= Clamp;
};

sampler2D smpRefr = sampler_state
{
	Texture = <b_refraction_bmap>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Clamp;
	AddressV		= Clamp;
};

sampler2D smpHight = sampler_state
{
	Texture = <b_hight_bmap>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Clamp;
	AddressV		= Clamp;
};

sampler2D smpHightMesh = sampler_state
{
	Texture = <entSkin2>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Wrap;
	AddressV		= Wrap;
};

struct VS_OUT
{
	float4 Pos : POSITION;
	float2 Tex : TEXCOORD0;
	float3 ProjTex : TEXCOORD1;
	float3 ViewDir : TEXCOORD2;
};

VS_OUT Shader_VS(float4 inPos : POSITION, float2 inTex : TEXCOORD0)
{
	VS_OUT Out = (VS_OUT)0;
	
	Out.Tex = float2(vecTime.w*125, 0)*0.01+inTex*1000;
	float4 Pos = inPos + float4(0,sin(inPos.x/2+(vecTime.w/5))+sin(inPos.z/4-(vecTime.w/5)),0,0);//float4(0,0,tex2D(smpRefl, Out.Tex).r*5,0);
	
	Out.Pos = mul(Pos, matWorldViewProj);
	Out.ProjTex = Out.Pos.xyw;
	Out.ViewDir = vecViewPos.xyz-mul(inPos,matWorld).xyz;
	
	return Out;
}

float fastFresnel(float3 I, float3 N, float R0, float power)
{
	return R0+(1.0-R0)*pow(1.0-dot(I,N),power);
}

float4 Shader_PS(float2 inTex : TEXCOORD0, float3 ProjTex : TEXCOORD1, float3 ViewDir : TEXCOORD2, float deph : TEXCOORD3) : COLOR
{
	ProjTex.xy = ProjTex.xy/ProjTex.z;
	ProjTex.xy = ProjTex.xy*0.5+0.5;
	
	float4 Bump = tex2D(smpNormal, inTex/500)*2.0-1.0;
	float4 Reflect = tex2D(smpRefl, ProjTex.xy+Bump.rg*0.2);
	float4 Refract = lerp(tex2D(smpRefr, ProjTex.xy+Bump.rg*0.2),float4(0,0.1,0.2,0),tex2D(smpHight, ProjTex.xy+Bump.rg*0.2));
	
	float fresnel = fastFresnel(normalize(ViewDir), Bump.rbg, 0.0204,7);
	
	float4 Color = lerp(Refract,Reflect,fresnel);
	Color.a = 1.0;
	
	return Color;
}

technique tech_00
{
	pass pass_00
	{
		CullMode = None;
		
		VertexShader = compile vs_2_0 Shader_VS();
		PixelShader = compile ps_2_0 Shader_PS();
	}
}



Nochwas: kann man texturen in nem Vertex shader benutzen für wellen habe ich bis jetzt sinus vom x * ein paar faktoren genommen, würde es aber gerne über eine Textur regeln
xxxxxxx
Posted By: xxxxxxx

Re: Sky rutscht mit ins Wasser - 05/11/11 18:16

hat denn keiner eine Idee?
Posted By: xxxxxxx

Re: Sky rutscht mit ins Wasser - 05/19/11 16:59

Neues Problem(vergässt das andere Zeug, Vertex-Wellen will ich nichtmehr und nach einer neuen Normalmap hat sich das andere Problem auch verflüchtigt. laugh ), eine Lichtreflexion kriege ich nicht allzu schön bzw. nur total hässlich hin.

diese weißen teile sind lichtquellen und das Terrain hat einen normalmapping shader laugh
hier der shader-code
Code:
float4x4 matWorld;
float4x4 matWorldViewProj;
float4 vecViewPos;
float4 vecTime;
float4 vecLightColor[8];
float4 vecLightPos[8];
float3x3 matTangent;

texture entSkin1;
texture b_reflection_bmap;
texture b_refraction_bmap;

sampler2D smpNormal = sampler_state
{
	Texture = <entSkin1>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Wrap;
	AddressV		= Wrap;
};

sampler2D smpRefl = sampler_state
{
	Texture = <b_reflection_bmap>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Mirror;
	AddressV		= Mirror;
};

sampler2D smpRefr = sampler_state
{
	Texture = <b_refraction_bmap>;
	
	MinFilter	= linear;
	MagFilter	= linear;
	MipFilter	= linear;
	
	AddressU		= Clamp;
	AddressV		= Clamp;
};

struct VS_OUT
{
	float4 Pos : POSITION;
	float2 Tex : TEXCOORD0;
	float3 ProjTex : TEXCOORD1;
	float3 ViewDir : TEXCOORD2;
	
	float3 WorldPos : TEXCOORD3;
	float3 tangent0 : TEXCOORD4;
	float3 tangent1 : TEXCOORD5;
	float3 tangent2 : TEXCOORD6;
};

VS_OUT Shader_VS(float4 inPos : POSITION, float2 inTex : TEXCOORD0, float3 inTangent : TEXCOORD2, float3 inNormal : NORMAL)
{
	VS_OUT Out = (VS_OUT)0;
	
	Out.Tex = float2(vecTime.w*125, 0)*0.01+inTex*1000;
	float4 Pos = inPos;
	
	Out.Pos = mul(Pos, matWorldViewProj);
	Out.ProjTex = Out.Pos.xyw;
	Out.ViewDir = vecViewPos.xyz-mul(inPos,matWorld).xyz;
	
	inNormal = -inNormal;
	
	Out.tangent0 = mul(inTangent, matWorld);
	Out.tangent1 = mul(cross(inTangent, inNormal), matWorld);
	Out.tangent2 = mul(inNormal, matWorld);
	
	Out.WorldPos = mul(inPos, matWorld);
	
	return Out;
}

float fastFresnel(float3 I, float3 N, float R0, float power)
{
	return R0+(1.0-R0)*pow(1.0-dot(I,N),power);
}

float4 Shader_PS(float2 inTex : TEXCOORD0, float3 ProjTex : TEXCOORD1, float3 ViewDir : TEXCOORD2, float3 inPos : TEXCOORD3, float3 tangent0 : TEXCOORD4, float3 tangent1 : TEXCOORD5, float3 tangent2 : TEXCOORD6) : COLOR
{
	ProjTex.xy = ProjTex.xy/ProjTex.z;
	ProjTex.xy = ProjTex.xy*0.5+0.5;
	
	float4 Bump = tex2D(smpNormal, inTex/500)*2.0-1.0;
	
	matTangent[0] = tangent0;
	matTangent[1] = tangent1;
	matTangent[2] = tangent2;
	float4 SpecNormal = Bump;
	float3 Normal = SpecNormal.rgb*5.0-2.50;
	Normal = mul(Normal, matTangent);
	Normal = normalize(Normal);

	
	float4 Reflect = tex2D(smpRefl, ProjTex.xy+Bump.rg*0.2);
	float4 Refract = tex2D(smpRefr, ProjTex.xy+Bump.rg*0.2);
	Refract = lerp(Refract,float4(0,0.1,0.2,0.5),0.3);
	
	float i;
	for(i=0;i<=7;i++)
	{
		float3 lightdir = normalize(inPos-vecLightPos[i].xyz);
		float3 viewdir2 = normalize(inPos-vecViewPos);
		float3 halfvec = normalize(viewdir2+lightdir);
		float specularity = saturate(dot(halfvec, Normal));
	}
	
	float fresnel = fastFresnel(normalize(ViewDir), Bump.rbg, 0.0204,5);
	float4 Color = lerp(Refract,Reflect,fresnel);
	Color.a = 1.0;
	return Color;
}

technique tech_00
{
	pass pass_00
	{
		CullMode = None;
		
		VertexShader = compile vs_2_0 Shader_VS();
		PixelShader = compile ps_3_0 Shader_PS();
	}
}

Ich habe versucht Spectularty Light dem ganzen hinzuzufügen um einen solchen effect hinzukriegen. nur das es kein skycube sein soll! tongue brachte leider nicht viel.

xxxxxxx
Posted By: Rondidon

Re: Sky rutscht mit ins Wasser - 05/22/11 17:09

Frag doch mal Hummel. Bei Shadern ist er wohl Adresse Nr. 1 wink
Posted By: WretchedSid

Re: Sky rutscht mit ins Wasser - 05/22/11 17:11

Originally Posted By: Rondidon
Frag doch mal Hummel. Bei Shadern ist er wohl Adresse Nr. 1 wink

Vor zwei Jahren hätte man noch "Frag doch mal Slin" geschrieben ^^
Posted By: gri

Re: Sky rutscht mit ins Wasser - 05/23/11 07:03


Vor 5 Jahren hätte man noch "Frag doch Ello" geschrieben.
Posted By: Otter

Re: Sky rutscht mit ins Wasser - 05/23/11 23:30

Quote:
Frag doch mal Hummel. Bei Shadern ist er wohl Adresse Nr. 1

Jap, Hummel kann ich wirklich empfehlen,... er ist ne echte granate!

....
Oh! Und seine Shader sind auch fantastisch.
Posted By: Hummel

Re: Sky rutscht mit ins Wasser - 05/24/11 10:04

Quote:
Jap, Hummel kann ich wirklich empfehlen,... er ist ne echte granate!
Wieder eine bei der ich mich nicht dran erinnern kann...verdammter Alkohol-.-

@3.5xx:
Du musst deine Glanzpunkte natürlich noch iwo mit dazu addieren, versuchs mal damit:
Code:
[...]
float i;
float specularity = 0;
for(i=0;i<=7;i++)
{
	float3 lightdir = normalize(vecLightPos[i].xyz-inPos);
	float3 viewdir2 = normalize(vecViewPos-inPos);
	float3 halfvec = normalize(viewdir2+lightdir);
	specularity += pow(saturate(dot(halfvec, Normal)),20.f);
}

Reflect += specularity ;
[...]


Posted By: WretchedSid

Re: Sky rutscht mit ins Wasser - 05/24/11 10:40

Originally Posted By: Hummel
Quote:
Jap, Hummel kann ich wirklich empfehlen,... er ist ne echte granate!
Wieder eine bei der ich mich nicht dran erinnern kann...verdammter Alkohol-.-

Kommt davon wenn man den ganzen Tag nur Met trinkt =/
Posted By: xxxxxxx

Re: Sky rutscht mit ins Wasser - 05/24/11 16:16

Danke Hummel, ich habe es bereits getan, nur hab warum auch immer die eine Zeile nicht geposted^^
Bingt genau das gleiche nur wie das andere nur in wieß(weil spectularity ja ein float ist). so jetzt meine Probleme:
1. Die Licht reflexion findet irgend wie nicht in richtung kamera statt, es sollte so wie in dem Stück sky ausehen was ich gepostet habe.
2. Punkt die "Normalentoleranz"(ich meine dem Bereich in dem Licht reflectiert wird) ist zu groß.
3. Ich weiß nicht ob es durch Punkt 2 schon behoben wird, aber der sichtbare Lichtkegel(also der beleuchtete Teil auf dem Wasser) ist zu breit.

Ich hoffe ihr(oder Hummel) könnt mir helfen!
xxxxxxx
Posted By: Hummel

Re: Sky rutscht mit ins Wasser - 05/24/11 20:52

Nimm mal als Normale testweise float3(0.f,1.f,0.f) und poste nen shot wo man ne einzelne Reflektion deutlich sehen kann.

Abgesehen davon kannst, für den Fall dass du deine wasser plane nicht rotierst, deine tangentspace normalmap direkt als Normale vewenden:

normal = tex2D(NormalMap,UV).rbg*2.f-1.f; //we are not in tangentspace but in objectspace, thats why we use rbg instead of rgb

Unter Umständen musst du jetzt noch die xz Werte austauschen oder invertieren damit die normal in die richtige Richtung zeigen, also z.B.:

normal.xz=normal.zx;
normal.x*=-1;
...

Solltest du die Wasserfläche um den pan winkel rotieren wollen, musst du den Spaß dann noch mit der matWorld multiplizieren.
Posted By: xxxxxxx

Re: Sky rutscht mit ins Wasser - 05/25/11 13:02

Hmm.. jetzt mit der Normale float3(0.f,1.f,0.f) sieht es sehr gut aus.

Ok meine drei Probleme kann man jetzt vergessen aber, wie kriege ich jetzt die richtige normale hin???
xxxxxxx
Posted By: Hummel

Re: Sky rutscht mit ins Wasser - 05/25/11 18:21

Lass den ganzen Tangentspace crap weg, so wie ichs oben beschrieben habe.
Posted By: xxxxxxx

Re: Sky rutscht mit ins Wasser - 05/26/11 16:30

bringt leider nichts frown
hab auch schon ne andere normalmap genommen...
Posted By: xxxxxxx

Re: Sky rutscht mit ins Wasser - 06/10/11 20:35

*push
© 2024 lite-C Forums