vecLightPos[8]
Positionen der 8 wichtigsten dynamischen Lichter einschließlich eines virtuellen dynamischen Lichts, welches die Sonne repräsentiert. Die Reichweiten (lightrange) der Lichter sind in der Komponente vecLightPos.w gespeichert. Ist ein Licht nicht aktiv, ist die Reichweite Null. light is not active.
vecLightViewPos[8]
Positionen der 8 wichtigsten dynamischen Lichter wie oben, jedoch in View-Koordinaten anstelle von Welt-Koordinaten.
vecLightColor[8]
RGB-Werte der 8 wichtigsten dynamischen Lichter.
vecLightDir[8]
Normalisierte Richtungsvektoren der 8 wichtigsten dynamischen Lichter. Ist ein Licht nicht ausgerichtet, beispielsweise wenn es nicht die Sonne ist und sein Flag SPOTLIGHT ist nicht gesetzt, sind sämtliche Komponenten dieses Vektors 0. Ansonsten eird die w-Komponente auf die Reichweite des Lichts gesetzt.
Typ:
float4
Bemerkungen:
- A7.20 Der Array wird von nahen nach fernen Lichtern sortiert wobei vecLightPos[0] die Position des am nächsten liegenden Lichts bezeichnet. Die Sonne hat den größten Abstand und ist daher das letzte Licht im Array.
- A7.60
In Postprozessing-Shadern werden die Lichtwerte auf die 8 nächstliegenden Lichter gesetzt, die das Frustum des Postprozessing-Views überlappen. Hat der Postprozessing-View einen genius, werden stattdessen die Lichtwerte auf die von der Genius-Entity aus nächstliegenden Lichter gesetzt.
- In einem normalen VS 1.1-Shader reicht die Maximalzahl der Anweisungen
nur für
die Berechnung von ca. 6 Lichtquellen. Höhere Shaderversionen können
theoretisch bis 30 oder mehr Lichtquellen unterstützen.
- Benutzen Sie zur Lichtberechnung nur Lichter mit einer Reichweite von ungleich Null. Die Komponente .w beinhaltet die Reichweite, verwenden Sie daher für Matrix-Multiplikationen nur die Komponenten vecLightPos.xyz.
- Die Reichweite des Sonnenlichts läßt sich durch die dritte Komponente (roll) des Vektors sun_angle (default: 100,000) einstellen. Ist sun_light Null, wird die Sonne nicht in den Array aufgenommen. Dies läßt sich für Innenlevel benutzen, wenn Sie nicht wollen, dass sich das Sonnenlicht auf Shaders auswirkt.
- Der Typus des Lichts läßt sich in Shadern auf folgende Weise festlegen: vecLightDir[i].w > 10000 => sun; vecLightDir[i].w > 0 => Spotlight oder ausgerichtetes Licht; ansonsten Punktlicht.
Beispiel:
/// Use dynamic lights in a vertex shader
float4 vecLightPos[8];
float4 vecLightColor[8];
...
// return the dynamic light on the surface
float4 DoPointLight(float3 P, float3 N, int i)
{
// calculate the light ray pointing from the light to the surface
float3 D = (float3)vecLightPos[i]-P;
// calculate the angle between surface and light ray
float NdotL = dot(N,normalize(D));
// modulate the light by the surface angle
float4 Color = vecLightColor[i] * NdotL;
// calculate the light attenuation factor
float fac = 0.f;
if (NdotL >= 0.f && vecLightPos[i].w > 0.f)
{
// get the distance factor
float LD = length(D)/vecLightPos[i].w;
if (LD < 1.f)
fac = 1.f - LD;
}
return Color * fac;
}
VS_OUT TerrainLight_VS (
float4 inPos : POSITION,
float3 inNormal : NORMAL)
{
VS_OUT Out;
// transform the vector position to screen coordinates
Out.Pos = mul(inPos,matWorldViewProj);
// Terrains don't need to rotate the normal, but it must be normalized
float3 N = normalize(inNormal);
float3 P = mul(inPos,matWorld);
// Add 6 dynamic lights (maximum for vs 1.1)
Out.Color = float4(0.f,0.f,0.f,0.f);
for (int i=0; i<6; i++)
Out.Color += DoPointLight(P,N,i);
...
return Out;
}
Siehe auch:
Material, Shader,
vordefinierte Shadervariablen
► Aktuelle Version Online