2016-08-25 4 views
0

참조 Phong 공식을 사용하여 조명 모델을 구현 중입니다. 다른 색상으로 재질을 적절하게 렌더링하는 방법을 아직 확실히 알지 못합니다. 나는 텍스처를 사용하지 않는다. 광 포인트에 I가 화소마다 사용하고 기본 방정식은, 다음과 같다 :퐁 쉐이딩 (Phong Shading) 조명 모델의 재질 색

Result.R := Ia.R*ka.R + P.IL.R*((M.kd.R*LN) + (M.ks.R*Power(Max(VR,0),M.Ns))); 
Result.G := Ia.G*ka.G + P.IL.G*((M.kd.G*LN) + (M.ks.G*Power(Max(VR,0),M.Ns))); 
Result.B := Ia.B*ka.B + P.IL.B*((M.kd.B*LN) + (M.ks.B*Power(Max(VR,0),M.Ns))); 

Result.R := Round(Result.R*255/3); 
Result.G := Round(Result.G*255/3); 
Result.B := Round(Result.B*255/3); 

(* Where: 
    Result : (R,G,B) color of pixel; 
    Ia: intensity of Ambient Light for each component R, G, B; 
    ka: material coefficient for reflection of ambient light; 
    P: Dot Light; 
    IL: intensity of Dot Light for each component R, G, B; 
    kd: material coefficient for diffuse reflection of Dot Light; 
    ks: material coefficient for specular reflection of Dot Light; 
    LN: dot product (L.N); 
    VR: dot product (V.R); 
    L: Vector from pixel to Dot Light; 
    N: Normal vector on the pixel; 
    V: Vector from pixel to Observer; 
    R: Reflected vector of L relative to N; *) 

각 식의 최대 값은, 각 구획 때문에 (Ia.R ka.R * 3, 각 구성 요소 (Result.R, Result.G 및 Result.B)가 0에서 255까지 유지되도록 결과를 조정합니다.

이렇게 정확하게 프로그래밍되지 않았습니다. 두 개 이상의 도트 라이트가있는 경우 결과의 모든 라이트의 확산 및 반사 구성 요소 합계를 계산합니다. Ia * ka 구성 요소는 변경되지 않습니다. 위의 3으로 나누는 대신 다른 숫자로 나눕니다 (2 개의 점등이 있으면 5로 나눕니다. 3, 7 등으로 나눕니다).

이러한 종류의 구현으로 ka, kd 및 ks 계수를 통해 재료 색상을 제어 할 수 있습니다. 밝은 색상은 전반적으로 Ia 및 P.IL에 의해 제어됩니다. 내가 따라 왔던 모델은 위키 백과에서 찾은 one과 비슷합니다.

내가 Phong의 공식을 잘못 해석하면 나는 어떤 종류의 오해를 저 지르지 만 알고 싶습니다. Phong의 조명 모델은 여러 버전이 있지만, 어떤 것들이 재료와 조명 색상을 변경할 가능성이 있는지 배우고 싶습니다. 사전에

덕분에, 나는 모든 관심을 주셔서 감사하고 클램핑 대신 값을 정상화됩니다하고 있습니다 :

답변

1

하나의 실수를 도움이됩니다. 맨 끝에서 결과를 0과 1 사이로 클램프해야합니다. 그런 숫자를 나눠서 각 광원이 더 많은 광원을 제공하는 것이 아니라는 것을 말하고있는 것입니다.

예를 들어 같은 영역에 10 개의 매우 강력한 조명이 켜져 있지만 하나만 켜져 있다고 가정 해 봅시다. 이 경우에는 하나의 빛도 매우 밝기 때문에 (1에 가까운) 매우 큰 수를 여전히 기대할 수 있습니다. 그러나 그들을 나누기 때문에 그것이 있어야하는 것의 아주 작은 부분 일뿐입니다.

두 번째로 누락 된 부분은 다음과 같습니다. "위의 공식이 Phong 리플렉션 모델을 표시하는 일반적인 방법이지만 용어의 점 product가 양수이면 각 용어가 포함되어야합니다 (또한 specular term은) "

이 양 : P.IL.R * (M.kd.R LN) + (M.ks.R Power (Max (VR) (확산주기의 내적이 양수인 경우 포함) , 0), M.Ns))) B를 곱해야합니다. B가 1이면 점 (L * N)> 0이고, 그렇지 않으면 0입니다. 이것은 도트 (L * N) <이 0이면 표면의 다른면 아래에서 빛이 비추고 있기 때문에 그 값을 계산하지 않기 때문입니다.

+0

좋아, 내가 지적한 두 번째 주석을 수행하는 코드 부분을 게시하지 않았습니다. 미안합니다. 나는 아직도 불빛의 수에 대해 혼란 스럽지만. 계속해서 새로운 조명을 추가하면 계속해서 더 밝아 져야합니다. 그러나 만약 내가 하나의 매우 밝은 빛을 가지고 있다면 그 효과는 같지 않을까요? –

+0

그러나 색상을 처리하는 방법에 대해 뭔가 어색한 점이 있습니까? –

+0

색상이 꺼져 있음을 나타내는 결과물이 있습니까? Round (...) 대신 Clamp (Result.R, 0, 255)를 사용하여 색상을 정규화해서는 안됩니다. 앰비언트, 스페 큘러 및 디퓨즈는 각각 0-1 범위를 가질 수 있어야합니다. 그들은 0-0.333의 범위를 가지고 있다고 말하고 있습니다.즉, 내가 거울이나 앰비언스를 가지지 않는다면, 단지 확산을 기반으로 한 흰색 픽셀을 가질 수 없다는 것을 의미합니다. – ciel712