[DX10] Problem mit Deferred Light
Verfasst: 20.09.2009, 09:11
Hi
Hab wieder mal ein Problem mit meinem Deferred Renderer. Ich habe jetzt mal ein DirectionalLight implementiert welches auch meist richtig funktioniert. Nur bei manchen Kamerawinkel/stellungen habe ich irgendwie ein ziemlich komisches Verhalten des Lichts. Ich habe ein kurzes Video davon gemacht damit ihr sehen könnt was ich genau meine (ca 2,5 mb groß)
http://www.file-upload.net/download-189 ... r.wmv.html
Wie man im Video erkennen kann hat man bei manchen Kamerastellungen einen Specular Anteil vom licht der das Terrain überstrahlt und dann wieder ist dieses Specular Licht plötzlich wieder weg obwohl die Kamera nur minimal bewegt/rotiert wurde. Habe echt keine Idee wodurch dieses Verhalten ausgelöst wird. Ähnliches Problem hab ich bei meinem PointLight (geht noch nicht so 100%ig) Da wird bei manchen Kamerastellungen das Licht gerendert und dann verschwindet es plötzlich wenn die Kamera rotiert wird nur um später wieder aufzutauchen
Hoffe ich konnte einigermaßen erklären was ich meine
Hier mein Shader code vom Directional Light (Nachdem die Geometry gezeichnet wurde wird ein Full Screen Rechteck gezeichnet und an diesen Shader geschickt)
Hab wieder mal ein Problem mit meinem Deferred Renderer. Ich habe jetzt mal ein DirectionalLight implementiert welches auch meist richtig funktioniert. Nur bei manchen Kamerawinkel/stellungen habe ich irgendwie ein ziemlich komisches Verhalten des Lichts. Ich habe ein kurzes Video davon gemacht damit ihr sehen könnt was ich genau meine (ca 2,5 mb groß)
http://www.file-upload.net/download-189 ... r.wmv.html
Wie man im Video erkennen kann hat man bei manchen Kamerastellungen einen Specular Anteil vom licht der das Terrain überstrahlt und dann wieder ist dieses Specular Licht plötzlich wieder weg obwohl die Kamera nur minimal bewegt/rotiert wurde. Habe echt keine Idee wodurch dieses Verhalten ausgelöst wird. Ähnliches Problem hab ich bei meinem PointLight (geht noch nicht so 100%ig) Da wird bei manchen Kamerastellungen das Licht gerendert und dann verschwindet es plötzlich wenn die Kamera rotiert wird nur um später wieder aufzutauchen
Hoffe ich konnte einigermaßen erklären was ich meine
Hier mein Shader code vom Directional Light (Nachdem die Geometry gezeichnet wurde wird ein Full Screen Rechteck gezeichnet und an diesen Shader geschickt)
Code: Alles auswählen
float4 LightColor;
float4 LightDir;
//position of the camera, for specular light
float3 view_position;
//this is used to compute the world-position
matrix InvertViewProjection;
Texture2D colorMap;
Texture2D normalMap;
Texture2D depthMap;
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
SamplerState samLinear2
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
////////////////////////////////////////////////
// Vertex Shader - Main Function
///////////////////////////////////////////////
PS_INPUT VS(float3 Pos : POSITION, float2 Tex :TEXCOORD)
{
PS_INPUT psInput;
psInput.Pos = float4(Pos,1);
psInput.Tex = Tex;
return psInput;
}
///////////////////////////////////////////////
// Pixel Shader
///////////////////////////////////////////////
float4 PS(PS_INPUT psInput) : SV_Target
{
float4 normalData = normalMap.Sample(samLinear2, psInput.Tex);
//tranform normal back into [-1,1] range
float3 normal = 2.0f * normalData.xyz - 1.0f;
//get specular power, and get it into [0,255] range]
float specularPower = normalData.a * 255;
//get specular intensity from the colorMap
float specularIntensity = colorMap.Sample(samLinear2, psInput.Tex).a;
//read depth
float depthVal = depthMap.Sample(samLinear2, psInput.Tex).r;
//compute screen-space position
float4 position;
position.x = psInput.Tex.x * 2.0f - 1.0f;
position.y = -(psInput.Tex.x * 2.0f - 1.0f);
position.z = depthVal;
position.w = 1.0f;
//transform to world space
position = mul(position, InvertViewProjection);
position /= position.w;
float3 nLightDirection = normalize(LightDir);
float3 directionToCamera = normalize(view_position - position);
// Lichtanteil Directional berechnen
float4 I_Directional = min(saturate(dot(normalize(normal), nLightDirection)), 1.0f);
// Sepcular Directional Werte berechnen
float3 Reflect_Directional = normalize(2*I_Directional*normal - nLightDirection);
float4 Specular_Directional = pow(saturate(dot(Reflect_Directional, directionToCamera)), 16);
float DiffuseAttn = clamp(0, 1, dot(normal, LightDir));
return LightColor*(I_Directional*(Specular_Directional+DiffuseAttn));
}