Explication Script Shader

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Explication Script Shader

Message par Alesk » 20 Nov 2016 11:41

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.

Avatar de l’utilisateur
Eanix
Messages : 62
Inscription : 08 Mai 2015 19:06

Re: Explication Script Shader

Message par Eanix » 26 Nov 2016 12:17

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
Un petit pas dans la technologie, un grand fouillis dans ma tête :hehe:

Répondre

Revenir vers « les Shaders »