2013-03-21 4 views
2

VS2012의 셰이더 디자이너가 내놓은이 함수로 문제가 발생하지 않았습니다. 아래 코드를 보면 VS 버전과 MY 버전의 차이점을 알 수 있습니다.VS2012 셰이더 디자이너 깨진 알고리즘?

VS 버전에서는 질감을 고려하지 않으므로 주변 환경에서만 켜지는 물체의 "그늘지는"면이 회색으로 표시됩니다. MY 버전에서는 픽셀 색조 (텍스처에서 나온 것)를 추가 한 것을 볼 수 있습니다. 그들은 확산 조명을 고려하여 픽셀 색조를 고려하기 때문에 왜 주변 환경에 적합하지 않은지 알 수는 없습니다.

저는 3D로 매우 익숙해 졌기 때문에 저는 현명하다고 생각하고 VS 팀이 이것을 테스트 한 적이 없다고 가정하고 싶지 않습니다. 그리고 근본적 이래로, 나는 단지 뭔가를 놓치고 있는지 궁금해하고 있습니다. 생각?

float3 LambertLighting(
float3 lightNormal, 
float3 surfaceNormal, 
float3 materialAmbient, 
float3 lightAmbient, 
float3 lightColor, 
float3 pixelColor 
) 
{ 
    // compute amount of contribution per light 
    float diffuseAmount = saturate(dot(lightNormal, surfaceNormal)); 
    float3 diffuse = diffuseAmount * lightColor * pixelColor; 

    // combine ambient with diffuse 

    // VS Version: 
    return saturate((materialAmbient * lightAmbient) + diffuse); 

    // MY Version: 
    return saturate((materialAmbient * lightAmbient * pixelColor) + diffuse); 

} 

답변

0

이 줄은 이미해야 텍스처에서 컬러 계정 : 나중에 주위 조명과 혼합

float3 diffuse = diffuseAmount * lightColor * pixelColor; 

올바른 결과를 얻을 수 있습니다. 귀하의 버전에서는 텍스처 색상을 두 번 추가합니다 (한 번 확산되고 주변에는 한 번). VS 버전은 내가 본 Lambertian 조명의 다양한 온라인 예제에 해당하므로 확실히 맞습니다.

잘못 될 수있는 것은 테스트 설정에서 확산 색이 검은 색 또는 회색이므로 픽셀 색이 회색으로 보일 수도 있다는 것입니다.