post processing in_color

21
POST PROCESSING IN COLOR 이민웅 Shader Study

Upload: -

Post on 12-Jul-2015

1.193 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Post processing in_color

POST PROCESSING IN COLOR

이민웅

Shader Study

Page 2: Post processing in_color

목차

Flimic Tone Mapping

Color Grading

Image Sharpening

Color Correction

Photo Filter

Page 3: Post processing in_color

Flimic Tone Mapping

John Hable이 Unchated2 HDR Lighting 발표

문서에서 소개한 내용

Flim에서의 색상 Curve가 더 나은 결과를 보

여준다는 것에서 착안

밝아질수록은 Reinhard방식과 유사하게 타

들어가는것을 방지하고, 어두워 질수록 어

두운 영역이 더 어두워 지도록 만듬

Page 4: Post processing in_color

Flimic Tone Mapping

John Hable의 Blog를 통해서, Fixed 된 버전이라고 소개.

Gamma 보정을 최종적으로 적용 (pow(x, 1/2.2))

A = Shoulder StrengthB = Linear StrengthC = Linear AngleD = Toe StrengthE = Toe NumeratorF = Toe Denominator

Note: E/F = Toe Angle

Page 5: Post processing in_color

Flimic Tone Mapping

Page 6: Post processing in_color

Flimic Tone Mapping

Page 7: Post processing in_color

Color Grading

http://ttmayrin.tistory.com/34 Color Grading by LookUpTexture (컬러 그레이딩 by LUT)

톤 매핑 (HDR to LDR 변형) 및 그에 따른 색 보정 (LDR color to color 변형) 기능을 포함

http://udn.epicgames.com/Three/ColorGradingKR.html

Page 8: Post processing in_color

Color Grading

기본 텍스쳐는 RGB값을 컨버팅한 UV좌표에 정확히 자기의 Color를 가지고 있는 상태 텍스쳐를 16x16x16 3DTexture로 제작 사용하면 tex3D한방

으로 ColorGrading이 가능

LUT를 이용한 ColorGrading은 Post Effect로서의 색보정 역할 뿐만 아니라 개별 사물이나 캐릭터에도적용이 가능 Actor의 ShaderCode마지막에 LUT관련 함수만 적용해주

면 완성

추가 텍스쳐 제작없이도 LUT만 만들어 놓으면 다양한 색의 사물이나 몬스터, 이펙트를 다량으로 생성할 수 있음 포토샵 색조정은 어디까지나 한계가 있음

Page 9: Post processing in_color

Color Grading

1. ColorGrading을 적용할 게임장면을 캡쳐하여 포토샵에서 불러옴

2. 기본이 되는 LUT도 같이 불러옴

기본 LUT 텍스쳐 256x16

16x16x16 3D 텍스쳐로 만들어서 사용 가능

Page 10: Post processing in_color

3. 포토샵의 여러 기능으로 화면을 마음껏 원하는 이미지로 편집

- 여기서 중요한 것은 불러온 LUT도 같이 바뀌어야한다는 점

4. 원하는 화면이미지에서 LUT를 따로 저장

GrayScale용 LUT

Page 11: Post processing in_color

float3 CalcLUT( sampler InLUT, float3 InColor )

{// requires a volume texture 16x16x16 unwrapped in a 2d texture 256x16// can be optimized by using a volume texturefloat2 Offset = float2(0.5f / 256.0f, 0.5f / 16.0f);float Scale = 15.0f / 16.0f;

// Also consider blur value in the blur buffer written by translucencyfloat IntB = floor(InColor.b * 14.9999f) / 16.0f;float FracB = InColor.b * 15.0f - IntB * 16.0f;

float U = IntB + InColor.r * Scale / 16.0f;float V = InColor.g * Scale;

float3 RG0 = tex2D( InLUT, Offset + float2(U , V) ).rgb;float3 RG1 = tex2D( InLUT, Offset + float2(U + 1.0f / 16.0f, V) ).rgb;

return lerp( RG0, RG1, FracB );}

float3 CalcLUT( sampler InLUT, float3 InColor ){return tex3D( InLUT, InColor * 15.f / 16.f + 0.5f / 16.f ).rgb;}

16x16x16 3D VolumeTexture로 제작된 경우

256x16 LUT일 경우 ShaderCode from Unreal3

Page 12: Post processing in_color

Image Sharpening

이미지를 선명하게 하여 보정

Simply lerp between low-res blurred image with original image by a ratio bigger than 1

Sharp = lerp(blurred, orig, bigger than 1 ratio)

Page 13: Post processing in_color

vector rcpres;

float4 lSharp(in float2 Tex : TEXCOORD) : COLOR0{

float4 inColor = tex2D(s0, Tex);float4 blur = inColor;

blur += tex2D(s0, float2(Tex.x, Tex.y+rcpres.y)) * 0.25;blur += tex2D(s0, float2(Tex.x, Tex.y-rcpres.y)) * 0.25;blur += tex2D(s0, float2(Tex.x+rcpres.x, Tex.y)) * 0.25;blur += tex2D(s0, float2(Tex.x-rcpres.x, Tex.y)) * 0.25;blur += tex2D(s0, float2(Tex.x-rcpres.x, Tex.y+rcpres.y)) * 0.25;blur += tex2D(s0, float2(Tex.x-rcpres.x, Tex.y-rcpres.y)) * 0.25;blur += tex2D(s0, float2(Tex.x+rcpres.x, Tex.y+rcpres.y)) * 0.25;blur += tex2D(s0, float2(Tex.x+rcpres.x, Tex.y-rcpres.y)) * 0.25;

blur /= 3;

float4 final = lerp(blur,inColor, 3);return final;

}

Page 14: Post processing in_color

Color Correction

Color range based on Euclidian distance ColorRange = saturate(1 - length( src - col.xyz) );

색상보정은 CMYK 공간에서 수행

c = lerp( c, clamp(c + dst_c, -1, 1), ColorRange);

원본화면과 보정된 색상 화면을 조합

Orig =lerp( Orig, CMYKtoRGB( c), ColorRange);

Page 15: Post processing in_color

Color Correction

Page 16: Post processing in_color

Photo Filter

칼라값을 이용하여 전체 이미지의 분위기를 바꿈

아티스트가 색을 지정

cMood = lerp(0, cMood, saturate( fLum * 2.0 ) );

cMood = lerp(cMood, 1, saturate( fLum - 0.5 ) * 2.0 );

최종 칼라는 휘도(luminance)와 사용자 비율(user ratio) 설정값으로 분위기 색값과 전체 이미지를 혼합

final= lerp(cScreen, cMood , saturate( fLum * fRatio));

Page 17: Post processing in_color

float fRatio = 0.25;float moodR = 0.5;float moodG = 0.4;float moodB = 0.25; //default is a mild orange

float4 colorMood(in float2 Tex : TEXCOORD) : COLOR0{

float4 cScreen = tex2D(s0, Tex);float4 cMood = 1;cMood.r = moodR;cMood.g = moodG;cMood.b = moodB;float fLum = ( cScreen.r + cScreen.g + cScreen.b ) / 3;

cMood = lerp(0, cMood, saturate(fLum * 2.0));cMood = lerp(cMood, 1, saturate(fLum - 0.5) * 2.0);float4 final = lerp(cScreen, cMood, saturate(fLum * fRatio));return final;

}

Page 18: Post processing in_color
Page 19: Post processing in_color
Page 20: Post processing in_color
Page 21: Post processing in_color