Autor Wątek: [DX11]Problem z SM dla świateł punktowych  (Przeczytany 622 razy)

Offline BEZIMENNY45645

  • Użytkownik

# Grudzień 02, 2012, 10:31:11
Witam. Mam problem polegający na tym,że z jakiegoś powodu nie mogę wyliczyć poprawnego cienia dla shadow mapy. Wydaje mi się,że wszystkie shadery mam dobre. Tutaj wrzucę shadery.

VS do generowania shadow map
cbuffer cbCameraInfo : register(b0)
{
matrix view;
matrix projection;
matrix world;
float4 eyePosition;
matrix viewPointLight[6];
};

float4 VS(float4 position : POSITION0) : SV_Position
{
float4 pos;
pos = mul(position,world);
return pos;
}

GS do generowania shadow map

cbuffer cbCameraInfo : register(b0)
{
matrix view;
matrix projection;
matrix world;
float4 eyePosition;
matrix viewPointLight[6];
};

cbuffer cbLightInfo : register(b1)
{
float4 lightDir;
float4 lightColor;
float4 lightPosition;
float4 lightAttenuation;
matrix viewLight;
matrix projectionLight;
matrix viewPointLightTranslate;
}

struct GS_INPUT
{
float4 position : SV_position;
};

struct GS_OUTPUT
{
float4 position : SV_position;
float4 vecLight : TEXCOORD0;
uint RTIndex : SV_RenderTargetArrayIndex;
};

[maxvertexcount(18)]
void GS(triangle GS_INPUT input[3],inout TriangleStream<GS_OUTPUT> CubeMapStream)
{
for(int f = 0; f < 6;++f)
{
GS_OUTPUT output;
output.RTIndex = f;
for(int v = 0;v < 3 ; v++)
{
float4 viewPos = mul(input[v].position,viewPointLight[f]);
output.position = mul(viewPos,projection);
output.vecLight  = lightPosition - input[v].position;
CubeMapStream.Append(output);
}
CubeMapStream.RestartStrip();
}
}

PS do generowania shadow map

cbuffer cbCameraInfo : register(b0)
{
matrix view;
matrix projection;
matrix world;
float4 eyePosition;
matrix viewPointLight[6];
};

struct PS_INPUT
{
float4 position : SV_position;
float4 vecLight : TEXCOORD0;
uint RTIndex : SV_RenderTargetArrayIndex;
};

float4 PS(PS_INPUT input) : SV_TARGET
{
float dist = length(input.vecLight);
return float4(dist,dist,dist,dist);
}

Funkcja obliczająca czy punkt jest w cieniu
float calculateShadowPointLight(TextureCube shadowMap,float3 samVector,SamplerState samLinear)
{
float shadowMapValue = shadowMap.Sample(samLinear,-samVector).r;
float shadowDepth = length(samVector);
return shadowMapValue < shadowDepth ? 0.3f : 1.0f;
}

Problem polega na tym,że ostatnia funkcja zawsze zwraca 0.3f. Męcze się już z tym około tygodnia i nie mogę sobie poradzić. Z góry dzięki za pomoc.

Teraz odkryłem,że shadow mapa nie ma tej wartości jaką powinna. Napisałem sobie mały shader sprawdzający i wychodzi na to,że gdy pixel shader odpowiadający za kolor w shadow mapie zwraca 1.0f,to ten wynik tak jakby jest czyszczony spowrotem do 0.0f. Nie wiem jak to wytłumaczyć. Sorry,że tak nie jasno, ale po prostu nie wiem jak to opisać.
« Ostatnia zmiana: Grudzień 03, 2012, 10:16:22 wysłana przez BEZIMENNY45645 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych