Vorsprung durch Technik

블로그 이미지

MSNU

Cook Torrance 금속인 재질을 표현하는 조명 모델

myPPT 2014. 6. 29. 20:22



















금속인 재질을 표현하는 조명 모델

1. 소개

 금속 표면을 표현하는데 적합한 조명 모델. 

 표면의 거칠기를 위한 미세면(micro facet) 모델, 프레넬 방정식, 미세면을 위한 기하학적인 감쇠요소 등을 사용한다.


2. 전체 공식





 k = 물체의 색

 D = 미세면 분포 함수 (희석 효과)

 G = 기하 감쇠 계수

 F = 프레넬 공식에 의한 반사 계수(입사각에 따른 반사광 강도 변화)

 N = 법선 벡터

 V = 시선 벡터 


3. 미세면 분포 함수 D

 미세면(micro facet)이 기울어진 각각의 각도에 관해서(미세면 자체의 법선) 시선벡터의 반사 벡터가 광원 벡터로 향하는 비율을 나타내는 함수. (beckmann)





 m은 표면의 거친 정도를 나타내는 상수로, 작으면 분포가 좁아져서 세밀한 반사가 되고 반대로는 희미한 반사가 된다


3-1. 의사코드

 // n, h

 float normalDotHalf = dot( normal, half );

 // (n, h) 의 제곱

 float normalDotHalfSquare = normalDotHalf * normalDotHalf;

 // 거칠기 제곱

 float roughnessSquare = roughness * roughness;

 // 지수 부분 계산 

 float exponent = - ( 1 - normalDotHalfSqaure ) / ( normalDotHalfSqaure * roughnessSqaure );

 // 이거슨 무엇인가?

 float e = 2.71828182845904523536028747135f;

 // 최종

 float D = pow( e,exponent ) / ( 4 * m2 * normalDotHalfSquare * normalDotHalfSquare ); 


4. 기하 감쇠율 G

 미세면에 입사한 빛이 다른 미세면에 그림자를 만드는 효과. 결과가 1에 가까울 수록 본래의 반사광을 표현.

 반사광 차폐(마스킹) 



 입사광 차폐(섀도잉) 



 최종

4-1. 반 벡터 (half vector)

 광원 벡터와 시선벡터의 중간 벡터

 반사광의 강도가 가장 큰 곳은 법선 벡터와 반 벡터의 방향이 가까운 경우, 즉 법선 벡터와 하프벡터가 같을 경우이다. 시선 벡터로부터 반사 벡터를 만들었을 때, 반사벡터가 광원 벡터와 일치하는 상황.

 반사 벡터는 광원 벡터에 반 벡터는 법선 벡터에 비교. 결과는 비슷하나 연산은 반 벡터가 단순하다.

 float3 H = normalize(L+eye)


4-2. 의사 코드

 // 법선, 시선

 float normalDotEye = dot( vNormal, vEye );

 //  법선, 광원

 float normalDotLight = dot( vNormal, vLight );

 //  주요부분

 float X = 2.0f * normalDotHalf  /  dot( vEye, vHalf );

 // 마무리 

 float G = min( 1, min( X * normalDotLight, X * normalDotEye ) );


5. 프레넬 방정식(Fresnel Equations) F

 굴절률이 다른 두 매질 사이를 진행하는 전자기 파의 투과율과 반사율의 비를 계산해주는 공식

 가까운 곳은 투과율이, 멀리 있는 곳은 반사율이 높아진다. 

5-1. 

 빛이 굴절률 n1인 매질에서 굴절률 n2인 매질로 지나갈때 경계면에서 반사와 굴절이 발생할 수 있다.

 입사광이 전반사되지 못하고 일부는 투과(굴절)되고 일부는 반사되는 것을 표현 

 입사광과 법선과의 각이 클(작을) 수록 표면 반사광의 양이 커짐(적어짐).

 굴절률( 빛의 속도가 줄어드는 비율 )이 크다는 것은 각에 따른 전체적인 반사광의 양이 커진다는 것.

 금속의 경우, 굴절광은 직진하지 않고 금속에 흡수되어 버림

 물질 마다 그 물질 내에서의 빛의 속도는 각각 다르다 

5-2. 쉬릭스 근사(Schlick’s approximation)

 프레넬 항은 약간 틀리더라도 크게 차이나지 않기 때문에 근사값을 주로 사용한다.



5-3. 프레넬 방정식 의사 코드 

 // 복소굴절률의 실수부, 즉 굴절률

 float n = 20.0f; 

 float c = LH;

 float g = sqrt(n*n+c*c-1);

 float gpc = g+c;

 float gnc = g-c;

 float cgpc = c*gpc-1;

 float cgnc = c*gnc+1;

 // 최종

 float F = 0.5f*gnc*gnc*(1+cgpc*cgpc/(cgnc*cgnc))/(gpc*gpc);

5-4. 쉬릭스 근사 의사코드 

 // 재질의 굴절률 벡터

 float3 refindex = { 0.85f, 1.0f, 1.0f };

 float F = lerp( pow(1 - NV, 5), 1, refindex );

6. 1 / (N dot V)

 단위 면적 당 미세면의 농도

 시선과 법선의 각을 반대로 적용함, 즉

가장 자리 부분에서 반영 반사가 일어나기 쉽게 하는 역할  

7. 전체 코드(Vertex Shader)

 VS_OUTPUT VS(

      float4 Pos    : POSITION,          // 로컬위치좌표

      float4 Normal : NORMAL            // 법선벡터

 ){

 VS_OUTPUT Out = (VS_OUTPUT)0;        // 출력데이터



 // 좌표변환

 Out.Pos = mul(Pos, mWVP);



 // 확산광+환경광

 float amb = -vLightDir.w; // 환경광의 강도

 float3 L = -vLightDir; // 로컬좌표계에서의 광원벡터

 Out.Color = vColor * max(amb, dot(Normal, -vLightDir));



 // 반영반사용 벡터

 Out.N = Normal.xyz;

 Out.X = Pos.xyz;



 return Out;

 }

8. 전체 코드(Pixel shader)

 float4 PS(VS_OUTPUT In) : COLOR

 {   

 float3 L = -vLightDir.xyz; // 광원벡터

 float3 N = normalize(In.N); // 법선벡터

 float3 V = normalize(vEyePos - In.X); // 시선벡터

 float3 H = normalize(L + V); // 하프벡터



 // 계산에 필요한 여러가지 각도

 float NV = dot(N,V);

 float NH = dot(N,H);

 float VH = dot(V,H);

 float NL = dot(N,L);

 float LH = dot(L,H);


 // Beckmann분포함수

 const float m = 0.55f; // 거친정도

 float NH2 = NH*NH;

 float D = exp(-(1-NH2)/(NH2*m*m))/(4*m*m*NH2*NH2); // 원본






 // 기하감쇠율

 float G = min(1,min(2*NH*NV/VH, 2*NH*NL/VH));



 // 프레넬

 float n = 20.0f;// 복소굴절률의 실수부

 float g = sqrt(n*n+LH*LH-1);

 float gpc = g+LH;

 float gnc = g-LH;

 float cgpc = LH*gpc-1;

 float cgnc = LH*gnc+1;

 float F = 0.5f*gnc*gnc*(1+cgpc*cgpc/(cgnc*cgnc))/(gpc*gpc);



 // 금속의 색

 float4 ks = {2.0f*0.486f, 2.0f*0.433f, 2.0f*0.185f, 1.0f};



   return In.Color // 확산광+환경광

 + ks * max(0,F*D*G/NV); // 반영반사광






'myPPT' 카테고리의 다른 글

스포츠와 화학Sports and Chemistry  (0) 2014.07.01
중국에서 비지니스 에티켓  (0) 2014.06.30
서비스설계  (0) 2014.06.25
서비스 경영 관리-특징,내용, 정의,분류, 품질관리, 마케팅 전략  (0) 2014.06.24
사회보장과 의료보장  (0) 2014.06.21
Posted by MSNU






favicon

Vorsprung durch Technik

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 분류 전체보기 (993)
    • myPPT (813)
    • 시리즈 (164)
      • 연소 (14)
      • 경제 (5)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바