Bgfx : shader lighting
Bruno83200_6929 Messages postés 628 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je vous joint le shader vertex et fragment en version BGFX .
Vertex:
$input a_position, a_texcoord0 //$output v_texcoord0 $output v_position $output v_normal #include "common.sh" //SAMPLER2D(s_texColor, 0); uniform mat4 matview; uniform vec4 eBias; //out vec2 OutTexCoord0; //out vec4 vertexColor; // Remplace l'ancien gl_BackColor void main() { // v_texcoord0 = a_texcoord0; gl_Position = mul(matview, vec4(a_position, 1.0) ); v_position=a_position; v_normal = vec3(0,0,1); // normale arbitraire gl_Position=gl_Position+eBias; }
Fragment :
// fs_spot_lightonly.sc $input v_normal, v_position #include "common.sh" // uniforms uniform vec4 u_lightPos; // xyz = position du spot, w = cos(cutoffAngle) uniform vec4 u_lightDir; // xyz = direction du spot normalisée uniform vec4 u_lightColor; // rgb = couleur du spot void main() { vec3 N = normalize(v_normal); // vecteur du fragment vers la lumière vec3 fragToLight = normalize(u_lightPos.xyz - v_position); // cos de l’angle entre direction du spot et fragment float cosTheta = dot(normalize(u_lightDir.xyz), fragToLight); // si on veut autoriser demi-angle > 90° (jusqu'à 180°) float cutoff = clamp(u_lightPos.w, -1.0, 1.0); // cos(demi-angle) peut être négatif float spot = smoothstep(cutoff, 1.0, cosTheta); // Lambert float ndotl = max(dot(N, fragToLight), 0.0); vec3 contrib = u_lightColor.rgb * ndotl * spot; gl_FragColor = vec4(contrib, 1.0); }
Les shaders sont t'ils bon ?
Pour information : La valeur eBias est à 0,bref.
Ces shaders qui servent à intégrer la lumiére dans la scéne 3d.
La lumiére fonctionne que sur certain angle , c'est à dire quand la lumière est sur un angle de 0 à 120° , cela fonctionne mais partir de 120° la lumiére s'estompe et plus rien à 180°.
Comment faire pour que cela fonctionne sur toutes les angles ????
Merci
1 réponse
Bonjour,
Vos shaders semblent corrects et fonctionnels pour implémenter un éclairage de type "spot light", en supposant que les uniformes sont correctement renseignés et que l'espace de coordonnées (par exemple, object space pour les positions) est cohérent dans votre setup BGFX.
Pour transformer ce spot light en point light omnidirectionnel (lumière qui émet dans toutes les directions, sans cône restrictif), supprimez simplement le facteur spot : la lumière illuminera alors toute surface visible depuis la position de la lumière, quel que soit l'angle de u_lightDir. Voici les modifications minimales au fragment shader (le vertex shader reste inchangé) :
// fs_point_lightonly.sc (renommez-le pour clarté) $input v_normal, v_position #include "common.sh" // uniforms (supprimez u_lightDir car plus nécessaire ; u_lightPos.w aussi si inutilisé) uniform vec4 u_lightPos; // xyz = position de la lumière (w peut être ignoré) uniform vec4 u_lightColor; // rgb = couleur de la lumière void main() { vec3 N = normalize(v_normal); // vecteur du fragment vers la lumière vec3 fragToLight = normalize(u_lightPos.xyz - v_position); // Lambert (sans spot) float ndotl = max(dot(N, fragToLight), 0.0); vec3 contrib = u_lightColor.rgb * ndotl; gl_FragColor = vec4(contrib, 1.0); }
Si cela ne résout pas (par exemple, si le problème vient d'ailleurs comme les coordonnées spatiales incohérentes ou la normale fixe), fournissez plus de détails sur votre setup BGFX (matrices, positions de lumière, géométrie) ou des erreurs de compilation/runtime.