Sur l'une des diapositives de PowerPoint "Rendu DirectX 11 dans Battlefield 3", j'ai remarqué le code suivant:
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
Je ne comprends pas pourquoi stockeraient-ils le rayon carré et même l'inverse du carré (qui, je crois, est simplement un rayon de 1 carré) au lieu de simplement stocker le rayon? Comment utilisent-ils ces données dans leurs calculs? De plus, qu'en est-il des lampes à cône et à ligne? Cette structure ne doit être que pour les lumières ponctuelles, je ne la vois pas fonctionner pour d'autres types - il n'y a pas assez de données. J'aimerais quand même savoir comment ils utilisent ce carré et invSquare.
MISE À JOUR: Ok, je l'ai enfin compris.
Voici l'équation classique d'atténuation de la lumière, facilement trouvée sur le net:
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
C'est relativement coûteux, comme length(lightVector)
c'est le cas en réalité:
length(lightVector) = sqrt(dot(lightVector, lightVector);
en outre, l'opération de division (/lightRadius)
est également très coûteuse.
Au lieu de calculer l'atténuation de la lumière de cette façon, vous pouvez la calculer de la manière suivante, ce qui serait beaucoup plus rapide:
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
où invRadiusSqr peut être précalculé au niveau du processeur et passé en tant que constante de shader.
De plus, vous obtenez une atténuation de la lumière quadratique en conséquence (au lieu de linéaire dans le premier cas), ce qui est encore mieux, car la lumière IRL a montré une atténuation quadratique.
Merci à tous pour votre aide!