2014-12-07 12 views
0

헤더가 나타내는 바와 같이 여러 점 조명이있는 장면을 렌더링 할 때 최종 픽셀 색상을 계산할 때 몇 가지 문제가 있습니다. 하나의 라이트를 계산할 때 장면은 잘 보이지만, 하나 이상의 라이트를 계산할 때 조금 엉뚱한 것처럼 보입니다! 아래 이미지는 대각선 패턴의 5 개 점 표시등을 보여줍니다 (시각적 디버깅 용). 여러 점 조명을 사용하여 최종 픽셀 색상을 계산할 때의 문제 DX11

http://imgur.com/nkQBTVM

가 나는 한 점 광원을 계산할 때, 픽셀 셰이더의 http://imgur.com/9LXVz79

HLSL 코드 아래와 같이 아래에 배치되어 잘 작동 상술 된 바와 같이.

//================ 
// 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); 
} 

답변

1

내가보기에 가장 중요한 것은 범위 검사입니다.

또한 주위 조명은 각 조명이 아닌 한 번만 추가해야합니다.