Cook Torrance 금속인 재질을 표현하는 조명 모델
금속인 재질을 표현하는 조명 모델
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 |