Distortion

Questions à propos du scripting Shader.
Avatar de l’utilisateur
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Distortion

Message par yannoch » 21 Sep 2012 18:59

Bonjour.

Je cherche désespérément une solution pour réaliser un shader pour créer un effet de Distortion.
Pour ce faire j'aurais besoin d'utiliser une texture de type "Normal" qui influence directement la Distortion.
Ainsi qu'une texture de type RGBA, en utilisant la couche Alpha pour gérer l'opacité du shader.
De plus, j'aimerais avoir plusieurs paramètres réglables tel-que l'opacité, et la force de la Distortion.

Pour réaliser ceci c'est relativement simple sur UDK, mais avec Unity ça m'a l'air complètement infaisable...

yann76922
Messages : 137
Inscription : 08 Jan 2012 15:04

Re: Distortion

Message par yann76922 » 21 Sep 2012 19:14

Bonjour yannoch !
Tu cherche une sorte de shader trou noir si j'ai bien compris ?

Avatar de l’utilisateur
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Re: Distortion

Message par yannoch » 21 Sep 2012 19:18

C'est un peu l'idée oui. quelque chose qui déforme l'image. Comme un trou noir ou onde de choque.

yann76922
Messages : 137
Inscription : 08 Jan 2012 15:04

Re: Distortion

Message par yann76922 » 21 Sep 2012 19:23

Ok. Il me semble qu'il n'est pas possible de faire bouger un shader. Il te faudrait une animation ou autre chose.
Exemple tout bête :
Script mouvement + image déformation
(Image)
Après je suis pas un pro de unity, peux être d'autre pourront te le dire

- Yann

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Distortion

Message par ZJP » 21 Sep 2012 21:02

Un "truc" comme cela?
Après je suis pas un pro de unity, peux être d'autre pourront te le dire
Image

yann76922
Messages : 137
Inscription : 08 Jan 2012 15:04

Re: Distortion

Message par yann76922 » 21 Sep 2012 21:04

ZJP a écrit :Un "truc" comme cela?
Après je suis pas un pro de unity, peux être d'autre pourront te le dire
Image
:lol:

Avatar de l’utilisateur
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Re: Distortion

Message par yannoch » 22 Sep 2012 11:26

J'ai trouvé ma solution. En fait il existe bien un script pour réaliser un shader capable de déformer l'image en utilisant une NormalMap. (tout comme on pourrait le faire sur UDK)
Une fois réalisé, le shader fonctionne à merveille, et le rendu est pas mal du tout.
Petite précision, ce shader nécessite une version PRO d'Unity.

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Distortion

Message par cayou66 » 22 Sep 2012 16:12

yannoch a écrit :J'ai trouvé ma solution. En fait il existe bien un script pour réaliser un shader capable de déformer l'image en utilisant une NormalMap. (tout comme on pourrait le faire sur UDK)
Une fois réalisé, le shader fonctionne à merveille, et le rendu est pas mal du tout.
Petite précision, ce shader nécessite une version PRO d'Unity.
Ça doit être sans doute du post rendering, d'où la nécessité d'avoir la version pro, je suppose.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Distortion

Message par ZJP » 22 Sep 2012 18:08

yannoch a écrit :J'ai trouvé ma solution. En fait il existe bien un script pour réaliser un shader capable de déformer l'image en utilisant une NormalMap. (tout comme on pourrait le faire sur UDK)
Une fois réalisé, le shader fonctionne à merveille, et le rendu est pas mal du tout.
Petite précision, ce shader nécessite une version PRO d'Unity.
Il faudrait poster ta solution. Cela aidera les autres.

Avatar de l’utilisateur
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Re: Distortion

Message par yannoch » 23 Sep 2012 10:47

Voici le code a utiliser pour le shader:
(possible que le shader ne fonctionne pas avec les version FREE d'Unity)
L'utilisation de ce shader nécessite une NormalMaps!

Code : Tout sélectionner

// Per pixel bumped refraction.
// Uses a normal map to distort the image behind, and
// an additional texture to tint the color.

Shader "HeatDistort" {
Properties {
	_BumpAmt  ("Distortion", range (0,128)) = 10
	_MainTex ("Tint Color (RGB)", 2D) = "white" {}
	_BumpMap ("Normalmap", 2D) = "bump" {}
}

CGINCLUDE
#pragma fragmentoption ARB_precision_hint_fastest
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"

sampler2D _GrabTexture : register(s0);
float4 _GrabTexture_TexelSize;
sampler2D _BumpMap : register(s1);
sampler2D _MainTex : register(s2);

struct v2f {
	float4 vertex : POSITION;
	float4 uvgrab : TEXCOORD0;
	float2 uvbump : TEXCOORD1;
	float2 uvmain : TEXCOORD2;
};

uniform float _BumpAmt;


half4 frag( v2f i ) : COLOR
{
	// calculate perturbed coordinates
	half2 bump = UnpackNormal(tex2D( _BumpMap, i.uvbump )).rg; // we could optimize this by just reading the x & y without reconstructing the Z
	float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
	i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;
	
	half4 col = tex2Dproj( _GrabTexture, i.uvgrab.xyw );
	half4 tint = tex2D( _MainTex, i.uvmain );
	return col * tint;
}
ENDCG

Category {

	// We must be transparent, so other objects are drawn before this one.
	Tags { "Queue"="Transparent+100" "RenderType"="Opaque" }


	SubShader {

		// This pass grabs the screen behind the object into a texture.
		// We can access the result in the next pass as _GrabTexture
		GrabPass {							
			Name "BASE"
			Tags { "LightMode" = "Always" }
 		}
 		
 		// Main pass: Take the texture grabbed above and use the bumpmap to perturb it
 		// on to the screen
		Pass {
			Name "BASE"
			Tags { "LightMode" = "Always" }
			
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

struct appdata_t {
	float4 vertex : POSITION;
	float2 texcoord: TEXCOORD0;
};

v2f vert (appdata_t v)
{
	v2f o;
	o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
	#if UNITY_UV_STARTS_AT_TOP
	float scale = -1.0;
	#else
	float scale = 1.0;
	#endif
	o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
	o.uvgrab.zw = o.vertex.zw;
	o.uvbump = MultiplyUV( UNITY_MATRIX_TEXTURE1, v.texcoord );
	o.uvmain = MultiplyUV( UNITY_MATRIX_TEXTURE2, v.texcoord );
	return o;
}
ENDCG
		}
	}

	// ------------------------------------------------------------------
	// Fallback for older cards and Unity non-Pro
	
	SubShader {
		Blend DstColor Zero
		Pass {
			Name "BASE"
			SetTexture [_MainTex] {	combine texture }
		}
	}
}

}


Répondre

Revenir vers « les Shaders »