ComputerGraphics
[CG] Cartoon Rendering(Non-Photorealistic Rendering)
장 코범
2024. 12. 4. 02:27
728x90
반응형
핵심: 명암의 단계가 나뉜다.
굉장히 쉽게 구현을 할 수 있다. Base는 Phong Shading이고, Fragment Shader를 살짝만 고쳐주면 된다.
아래가 Phong Shading으로 구를 그린 것이다.
이 코드에서 Shader를 살짝만 바꿔보자.
Cartoon Rendering을 보면 명암이 딱딱 끊기는 것을 볼 수 있다.
if, else if, ... 로 구역을 나눠서 렌더링을 해보면
float d = max(dot(N3, L3),0);
vec4 diff;
// 딱딱 나눠지는 명암
// Diffuse
// 딱딱 나눠지는 명암
if (d > 0.6) diff = vec4(242.0f /255.0f , 22.0f / 255, 22.0f /255.0f, 1);
else if (d > 0.2) diff = vec4(213 / 255.0f, 12 / 255.0f, 12 / 255.0f, 1);
else diff = vec4(179 / 255.0f, 11 / 255.0f, 11 / 255.0f, 1);
// Specular
float s = pow(max(dot(R3, V3),0), sh);
if(s > 0.2) s = 1;
else s = 0;
이렇게 이쁘장하게, Cartoon같이 rendering이 된다. 살짝 아쉬운 부분은 실루엣 라인이 도드라지면 더 카툰 같을 것 같다.
정말 간단하게, 내적을 이용해서 나에게 안보이기 직전(?)인 부분을 검정색으로 그려준다.
float edge = abs(dot(V3, N3));
if(edge < 0.2) fColor = vec4(0.1,0.1,0.1,1);
728x90
반응형