WinCNT

NPR(None Photo Realistic) - Cartoon 본문

게임 프로그래밍(학습 내용 정리)/게임 수학

NPR(None Photo Realistic) - Cartoon

WinCNT_SSS 2022. 6. 7. 18:47
예전 카툰 렌더링은 Outer Line이 정말 중요하게 여겨졌지만
현재는 딱히 중요하게 여기지 않은 것이 트랜드가 되었다

Cartoon의 3요소

  • Specular Reflection
  • (Two)Tone Shading
  • Rim Lighting

Toon shading의 3가지 방법

1. 전통적인 Texture LUT사용

N dot L을 밝기 값으로 사용하지 않고 텍스처의 U 좌표로 사용하는 법
이 방법의 장점은 텍스처를 바꾸기만 해도 다양한 효과를 나타낼 수 있다는 것
(팀 포트리스에서도 적용함)

2. ceil() 혹은 floor()함수 사용

N dot L의 값을 경계로 나눠서 구분한다

음영이 너무 칼같이 끊어지기 때문에 현재 트렌드에는 좀 맞지 않는다

예시

3. smoothstep()함수 사용

smoothstep은 경계면을 적절히 보간해준다

smoothstep ( 0, 1, dot(N,L) )

 

float lightIntensity = smoothstep( 0, 0.01, dot(N,L) );

Specular Reflection

일반적으로 Specular를 그대로 사용하면 카툰 렌더링에는 어울리지 않는다

smoothstep 등으로 카툰 렌더링에 어울리는 하이라이트로 바꿔야 한다

fvTotalSpecular = pow( dot(R,V), 24 );  fvTotalSpecular  = smoothstep(0.005, 0.01, fvTotalSpecular);

 

 

Rim Lighting

일반적인 Rim Light(시선벡터와 법선 벡터의 내적)

float rimDot = 1 - dot(fvNormal, fvViewDirection);

 

Rim Light를 모든 외곽선에 처리하는 것이 아니라 조명이 닿는 부분에만 처리

float rimDot = 1 - dot(fvNormal, fvViewDirection);    rimDot = rimDot * fNdotL;

 

Rim Light가 적용되는 부위를 조정하도록 외부 변수 _RimThreshold추가

 

Rim Light의 굵기를 조정하도록 외부 변수 _RimAmount추가

Toon+Specular+Rim 처리 후 최종 결과

카툰 렌더링에서 Normal Map, Lim Lighting 적용시 주의점

노멀 맵의 경우 버텍스 노말을 노멀맵에 넘겨줘서 사용해야 예쁘게 나온다

 

림 라이트의 경우도 그냥 평범하게 할 경우

노멀 맵이 적용된 부분에도 림 라이트가 생기기 때문에

버텍스의 노멀을 사용해야 예쁘게 나온다

 

SSS

'게임 프로그래밍(학습 내용 정리) > 게임 수학' 카테고리의 다른 글

Radial Blur  (0) 2022.06.14
Blur  (0) 2022.06.14
PBR - 2회차  (0) 2022.06.07
VRAM과 PCI express  (0) 2022.06.07
Tonemaping  (0) 2022.05.10