Shockwave Shader

Posted By: tagimbul

Shockwave Shader - 09/11/16 14:30

hey =)
i try to make a shockwave shader on a sprite.
like this
http://forum.unity3d.com/attachments/shockwave-png.151238/

i have use this shader for basic.
http://opserver.de/swik10/index.php?title=Raindrops

i use it on a entity but now is my problem the thats the pixels behind of the enity no have this effect.
how i can make tath all the pixels behind the entity become this effect? like on the picture
greets tom


edit:
final shader:
https://www.dropbox.com/sh/aad9ob2xixmkplb/AAALpOfHKKP90CWLMwe9eb-Ha?dl=0
Posted By: Ch40zzC0d3r

Re: Shockwave Shader - 09/11/16 16:13

The raindrops shader is a post effect on the camera.
IF you want to use it you have to do some calculations and convert the 3D position into 2D pos onto the screen.
Posted By: 3run

Re: Shockwave Shader - 09/11/16 18:05

Maybe it's better to archive this effect with post shader effect. You better ask some shader gurus around the forum, it would be nice to have such an effect lying around the forum (HDD as well).

Youtube example

Greets!
Posted By: tagimbul

Re: Shockwave Shader - 09/11/16 18:50

i dont need it as a PP shader

https://www.dropbox.com/sh/dhc2f6yxxr14rxy/AADRfDkIliRmlWOYDNIYlTuIa?dl=0

i wrote it in a object shader... but i have absolutly no idea how to make it invesible so that it deforms the background in the level and not the own texture or like a PP shader on the camera view....

hey gurus in the forum grin pls help me grin
Posted By: tagimbul

Re: Shockwave Shader - 09/12/16 09:53

i project the render view now on the object with TargetMap =)
then i use alphamap as mask and the normalmap.
the only one probleme that i now have is convert the targetmap on the object but with the screen coordinates and nor the object coordinates =)
if i have this my shader is finish =)
Posted By: Kartoffel

Re: Shockwave Shader - 09/12/16 11:03

you can use VPOS to get your screen coordinates:

Code:
float4 PShader(in float4 vScreenPos : VPOS, ...) : COLOR0
{
   float2 TexcoordScreen = (vScreenPos.xy + 0.5) / vecViewPort.xy;

   ...
}

x and y of the VPOS-register represent the coordinate of the pixel (1 unit = 1 pixel!)
the '+ 0.5' is needed to sample from the center of the pixel because the top-left pixel's coordinates are (0, 0) not (0.5, 0.5)
finally, dividing by vecViewPort.xy transforms the coordinates to the [0 - 1] range which is needed (edit: you can also use '* vecViewPort.zw')
Posted By: tagimbul

Re: Shockwave Shader - 09/12/16 12:00

ahh ^^ ich hab vermutet das ich mit VPOS und vecViewPort was machen muss^^
danke vielmal grin
ich habs gleich mal getestet. aber jetzt hab ich ein nues problem
damit es funktioniert muss man noch die shader version erhöhen oder?
also
Code:
PixelShader = compile ps_3_0 PS_RainDrops();


wenn ich den von 2 (meine eigentliche version für den raindrop shader) auf 3 erhöhe bekomme ich zwar die pixel vom render target in screengrösse auf das objekt geschriben aber die anderen bilder (mtlskin1 und entskin1) werden nichtmehr durchgelassen...

hmm..

wenn ich im code, wie er bisher funktioniert hat ohne denn VPOS zusatz, den compile ps_2_0 PS_RainDrops(); auf ps_3_0 erhöhe geht es nicht mehr. woran liegt das? also das model wird unsichtbar
Code:
float4 PS_RainDrops(float2 tex0 : TEXCOORD0 ) : COLOR
{
	float2 temp;
	temp.x = tex0.x+vecTime.w/100;
	temp.y = tex0.y+vecTime.w/100;
	
	 
	
	float2 pixel = tex2D(bumpTex,temp).rg*5;
	
	temp.x = (tex0.x + pixel.x * 0.01f);
	temp.y = (tex0.y + pixel.y * 0.01f);

	float4 pixel2 = tex2D(targetmap,temp)  ;
	
	

	
	//rgba
	return float4(tex2D(postTex, temp*(1-pixel.x*0.01f)).rgb, tex2D(postTex, temp*(1-pixel.x*0.01f)).a-pixel2.a)+pixel2;
	
}

// Technik 1
technique tech_00
{
	pass pass_00
	{
		PixelShader = compile ps_2_0 PS_RainDrops();
	}
}

technique fallback { pass one { } }



Posted By: Kartoffel

Re: Shockwave Shader - 09/12/16 13:00

ich glaub', dass das modell unsichtbar wird, hat was damit zu tun dass du keinen vertexshader verwendest, PS3.0 aber einen vorraussetzt? kann mich aber auch irren...
Posted By: tagimbul

Re: Shockwave Shader - 09/12/16 13:35

ja das war es grin grin cool es funktioniert grin ahh bin so happy grin danke danke grin
wein mein shockwave fertig ist poste ich ihn hier grin
kann man dann auch als haze flame shader nutzen auf einzelnen sprites^^
Posted By: tagimbul

Re: Shockwave Shader - 09/12/16 21:35

https://www.dropbox.com/sh/aad9ob2xixmkplb/AAALpOfHKKP90CWLMwe9eb-Ha?dl=0

er ist beinahe fertig... aber irgendwo mach ich noch was falsch
wenn ich die (* 0.01f) entferne in zeile 92 löst es mir gleich 2 probleme
einmal die diagonale ferzerung und die scalierung.
aber der effect sieht dann nicht mehr gut aus..
aber es ist schon sehr nahe an am endresultat grin

edit:
ich hab ein neues bild geupdatet in dropbox. das entfernen des (* 0.01f) bringt nichts.
*grübel grübel*
Posted By: tagimbul

Re: Shockwave Shader - 09/13/16 06:24

ohjaaa grin ich habs fast grin grin
https://www.dropbox.com/sh/aad9ob2xixmkplb/AAALpOfHKKP90CWLMwe9eb-Ha?dl=0

ich habe nurnoch diese diagonale verzerung. nurnoch die mus weg dann ist der shader fertig grin
Posted By: Kartoffel

Re: Shockwave Shader - 09/13/16 10:25

kannst du einen screenshot davon posten?
Posted By: tagimbul

Re: Shockwave Shader - 09/13/16 10:53

ähmm ich hab den fehler gefunden... ich verstehe nurnicht wieso das passiert

ich hab 2 bilder auf dropbox. beispiel main1 und main2
https://www.dropbox.com/sh/aad9ob2xixmkplb/AAALpOfHKKP90CWLMwe9eb-Ha?dl=0

es ist so:
der shader funktioniert eigentlich tadellos =)
aber.. ich produziere mit ent_create sprites. und sprites richten sich immer zum bildschirm aus.
wenn man das sprite nicht festsetzt (siehe main2) sieht es aus wie auf dem bild (main2.jpg). es entsteht eine diagonale verzerung

wenn man nun aber pan tilt und roll einfriert (main1) auf ..= 1; dann funktioniert der shader einwandfrei (siehe main1.jpg)

und bei main3.c hab ich ein wenig rumprobiert am shadercode.
und stretche übermässig so das diese diagonale verschwindet
so gehts dann auch mit sprites ohne festgesetzten pan tilt roll

aber woran liegt das, das das passiert mit der diagonalen verzerung?
(ich hab 3 hintereinander das gesagt und muste kichern ^^)
lg tom
Posted By: Kartoffel

Re: Shockwave Shader - 09/13/16 11:20

hab' ehrlich gesagt keine ahnung warum das so ist confused
Posted By: tagimbul

Re: Shockwave Shader - 09/13/16 12:10

ähmm habs nochmal durchgetestet das war es doch nicht. ist einfach auf eine andere ecke verlagert worden...
ich glaub aber jetzt das es wieder im shader das problem lösbar ist.
diese diagonale verzerung ist ein fehler im übergang. irgendwo flipt es mega hart in den 3 codezeilen

Code:
float4 ps_main( VS_OUTPUT In,in float4 vScreenPos : VPOS) : COLOR
{
	float2 TexcoordScreen = ( vScreenPos.xy + 0.5) / (vecViewPort.xy);
	float2 pixel = ((tex2D(bumpTex, In.tex0).rg) -0.5)*( 0.2* vecSkill41 ) ;
	float4 pixel2 = tex2D(targetmap,(TexcoordScreen.xy + pixel.xy* 0.01f))   ;
	
	return pixel2;
}



was für werte/grössenverhältnise haben In.tex0, VPOS und vScreenPos? ist das was zwischen 0 und 1 oder andere grössen? und vecSkill41 kommt so rein wie man sie als zahl bei lite c reingibt? also wenn man my.skill41 = 5 dann ist auch in hlsl vecskill41 == 5 ?
ich will mal das verhalten einzelner pixel an verschiedenen stellen durchrechnen
Posted By: tagimbul

Re: Shockwave Shader - 09/13/16 12:34

ahh ich glaub ich habs^^ das ist ja ein flippen und liegt daran dass es, wenn ein pixel.r z.B auf 5 ist die gleiche farbe hat wie -5.
wenn pixel über 0 geht wird geflipt
und bei der target map dieses grossflächige lila ist rg 126 -127
das wird dann aber umgerechnet in eine 0 bis 1 pixel grösse
simit ist dieses lila etwa auf 0.5
und wenn ich da aber -0,5 rechne geht ein pixel, wenn es under 0 geht in den minus bereich und wird somit geflipt 0 ist der wendepunkt
also ist ein rotes pixel auf -1 gleichviel wie +1
und ich hab jetzt eine if anweisung gemacht wo es mir zurück flipt
Code:
if(pixel.x < 0)
pixel.x = -pixel.x;
if(pixel.y < 0)
pixel.y = -pixel.y;


und jetzt sieht es sauber aus =)
aber kann ich das auch ohne ein if lösen?


edit:
denkfehler. das flipen ist garnicht so schlim
aber durch meine kleine flip anweisung passiert dann hier etwas anderes.
Code:
float4 pixel2 = tex2D(targetmap,((TexcoordScreen.xy) + (pixel.xy )* 0.01f))   ;


und zwar das TexcoordScreen.xy nichtmehr + -pixel sonder nurnoch + +pixel gerechnet wird.
und das killt den flip effect
Posted By: tagimbul

Re: Shockwave Shader - 09/13/16 17:04

ich dreh bald durch. da denkt ich ich hab es gefixt und dann kommt es wieder ...

https://www.dropbox.com/sh/aad9ob2xixmkplb/AAALpOfHKKP90CWLMwe9eb-Ha?dl=0
ich hab den code mal etwas aufgeräumt
ich komme echt nicht weiter >.<
Posted By: tagimbul

Re: Shockwave Shader - 09/14/16 10:09

ich habe es glaubs rausgefunden was für die diagonale verzerung sorgt.
wenn ich die targetmap reingebe im sampler habe ich;
Code:
AddressU = Wrap;
AddressV = Wrap;



und bei
Code:
float4 pixel2 = tex2D(targetmap, ( TexcoordScreen.xy+pixeltest.xy));



will es über den rand der targetmap
sagen wir er holt sich ein pixel von rechts über der targetmap
dann landet er wegen warp wieder links und holt sich dort ein pixel und das sieht dann wie eine diagonale verzerung aus
also je weiter er raus will um ein pixel zu holen für den effect desto näher kommt er an den rand der targetmap und desen warp effect

mal schauen wie ich das umgehen kann ^^

edit:
nein das ist es doch nicht.
Posted By: tagimbul

Re: Shockwave Shader - 09/15/16 07:06

final shockwave shader
have fun with it

https://www.dropbox.com/sh/aad9ob2xixmkplb/AAALpOfHKKP90CWLMwe9eb-Ha?dl=0
© 2024 lite-C Forums