0
헤더가 나타내는 바와 같이 여러 점 조명이있는 장면을 렌더링 할 때 최종 픽셀 색상을 계산할 때 몇 가지 문제가 있습니다. 하나의 라이트를 계산할 때 장면은 잘 보이지만, 하나 이상의 라이트를 계산할 때 조금 엉뚱한 것처럼 보입니다! 아래 이미지는 대각선 패턴의 5 개 점 표시등을 보여줍니다 (시각적 디버깅 용). 여러 점 조명을 사용하여 최종 픽셀 색상을 계산할 때의 문제 DX11
가 나는 한 점 광원을 계산할 때, 픽셀 셰이더의 http://imgur.com/9LXVz79HLSL 코드 아래와 같이 아래에 배치되어 잘 작동 상술 된 바와 같이.
//================
// PIXEL SHADER
//================
struct PointLight
{
float3 lightPosition;
float range;
float3 att;
float padding;
float4 ambient;
float4 diffuse;
};
cbuffer CB_PER_FRAME_LIGHT : register(b2)
{
PointLight lights[5];
};
Texture2D tex;
SamplerState samplerState;
float4 PS(DS_OUTPUT input) : SV_Target
{
float4 finalDiffuse;
float3 finalColor = float3(0.0f, 0.0f, 0.0f);
float3 LIGHTSTRENGTH;
float4 ambient, diffuse;
for (int i = 0; i < 5; i++)
{
float3 lightWorldPosition = mul(lights[i].lightPosition, world).xyz;
ambient = float4(0.0f, 0.0f, 0.0f, 0.0f);
diffuse = float4(0.0f, 0.0f, 0.0f, 0.0f);
LIGHTSTRENGTH = float3(0.0f, 0.0f, 0.0f);
finalDiffuse = tex.Sample(samplerState, input.texCoord);
//Create the vector between light position and pixels position
float3 lightToPixelVec = lights[i].lightPosition - input.worldPosition;
//Find the distance between the light pos and pixel pos
float d = length(lightToPixelVec);
//Create the ambient light
float3 finalAmbient = finalDiffuse * lights[i].ambient;
//If pixel is too far, return pixel color with ambient light
if(d > lights[i].range)
return float4(finalAmbient, finalDiffuse.a);
//Turn lightToPixelVec into a unit length vector describing
//the pixels direction from the lights position
lightToPixelVec /= d;
//Calculate how much light the pixel gets by the angle
//in which the light strikes the pixels surface
float howMuchLight = dot(lightToPixelVec, input.normal);
//If light is striking the front side of the pixel
if(howMuchLight > 0.0f)
{
//Add light to the finalColor of the pixel
LIGHTSTRENGTH += howMuchLight * finalDiffuse * lights[i].diffuse;
//Calculate Light's Falloff factor
LIGHTSTRENGTH /= lights[i].att[0] + (lights[i].att[1] * d) + (lights[i].att[2] * (d*d));
}
//make sure the values are between 1 and 0, and add the ambient
finalColor += saturate(LIGHTSTRENGTH + finalAmbient);
}
//Return Final Color
return float4(finalColor, finalDiffuse.a);
}