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.
Explication Script Shader
Re: Explication Script Shader
EDIT : les recherche que tu m'as indiqué, vont certainement m'aider même si ce niveau d'anglais dépasse mes compétence
Du coups je pense que j'aurai certainement beaucoup mal à comprendre, mais on n'obtient rien sans casser des œufs comme on dit
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 :
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 :
https://www.shadertoy.com/view/XdjGDm
Du coups je pense que j'aurai certainement beaucoup mal à comprendre, mais on n'obtient rien sans casser des œufs comme on dit
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;
}
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));
}
Un petit pas dans la technologie, un grand fouillis dans ma tête