Page 2 sur 2

Re: Explication Script Shader

Publié : 20 Nov 2016 11:41
par Alesk
Salut,

Si tu veux gérer l'éclairage + les ombres 2D directement et uniquement dans un shader, je pense qu'il va falloir passer par un shader en screen space, donc ça sera du postprocessing. => google + "unity post processing shader"

Ensuite, ce qui est le plus compliqué avec les shaders dans unity, c'est pas tant les maths, mais bien la syntaxe qui est très aléatoire et très très mal documentée.

Je recommande le site shadertoy.com à tous ceux qui cherchent à apprendre comment programmer des shaders complexes.
La structure et la syntaxe diffèrent un peu de celle d'unity, mais au niveau des algorithmes c'est transposable sans trop de problèmes.

Re: Explication Script Shader

Publié : 26 Nov 2016 12:17
par Eanix
EDIT : les recherche que tu m'as indiqué, vont certainement m'aider même si ce niveau d'anglais dépasse mes compétence :-D
Du coups je pense que j'aurai certainement beaucoup mal à comprendre, mais on n'obtient rien sans casser des œufs comme on dit :lol:

En tout cas merci à vous, et une dernière chose avant de fermé le sujet j'aimerais savoir si on à bien tous cette exemple en tête (https://www.youtube.com/watch?v=nSf1MpsWKig).

Tous les exemples qui me semble le mieux pour ce que je veux faire, utilise OpenGL et sont fait grâce à des shaders qui ne sont pas compatible avec unity, donc je sais pas comment le traduire. Voici celui dont je vous parle :

Code : Tout sélectionner

uniform vec2 lightLocation;
uniform vec3 lightColor;
uniform float screenHeight;


void main() 
{

	float distance = length(lightLocation - gl_FragCoord.xy);

	float attenuation = 1.0 / distance;

	vec4 color = vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4(lightColor, 1);


	gl_FragColor = color;

}
EDIT 2 : sinon j'ai trouvé ça mais je sais pas comment le mettre en place car ça créer les lumières à partir du shaders :/ :

Code : Tout sélectionner

#define STEPS 16
//#define LIGHT_SPEED 1.5
#define LIGHT_SPEED 0.5
#define HARDNESS 2.0

struct ray {
	vec2 t;
	vec2 p;
	vec2 d;
};

float scene(in vec2 p) {
	p -= vec2(400, 250);

	float sn = sin(iGlobalTime / 2.0);
	float cs = cos(iGlobalTime / 2.0);

	float f1 = dot(vec2(sn, -cs), p);
	float f2 = dot(vec2(cs, sn), p);
	float f = max(f1*f1, f2*f2);

	//p += vec2 (sn + 0.5, cs) * 200.0;
	p -= iMouse.xy / iResolution.yy * vec2(500, 500) - vec2(400, 250);
	f = min(f, dot(p, p) * 2.0);

	return 1000.0 / (f + 1000.0);
}

ray newRay(in vec2 origin, in vec2 target) {
	ray r;

	r.t = target;
	r.p = origin;
	r.d = (target - origin) / float(STEPS);

	return r;
}

void rayMarch(inout ray r) {
	r.p += r.d * clamp(HARDNESS - scene(r.p) * HARDNESS * 2.0, 0.0, LIGHT_SPEED);
}

vec3 light(in ray r, in vec3 color) {
	return color / (dot(r.p, r.p) + color);
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
	vec2 uv = fragCoord.xy / iResolution.yy * vec2(500, 500);

	ray r0 = newRay(uv, vec2(600, 250));
	ray r1 = newRay(uv, vec2(200, 250));

	for (int i = 0; i < STEPS; i++) {
		rayMarch(r0);
		rayMarch(r1);
	}

	r0.p -= r0.t;
	r1.p -= r1.t;

	vec3 light1 = light(r0, vec3(0.3, 0.2, 0.1) * 20000.0);
	vec3 light2 = light(r1, vec3(0.1, 0.2, 0.3) * 10000.0);

	float f = clamp(scene(uv) * 200.0 - 100.0, 0.0, 3.0);

	fragColor = vec4((light1 + light2) * (1.0 + f), 1.0);
	//fragColor = vec4 (scene (uv));
}




https://www.shadertoy.com/view/XdjGDm