More Related Content
Similar to [Shader study] Color control (2014.05.12)
Similar to [Shader study] Color control (2014.05.12) (14)
[Shader study] Color control (2014.05.12)
- 8. Color Correction ์ด๋ ๋ง์
์ผ๋ฐ์ ์ผ๋ก ํ์ดํธ ๋ฐธ๋ฐ์ค๋ฅผ ๋ฐ๋ก ์ก๋๋ค๋ ์๋ฏธ๋ก ์ฌ์ฉ
์ผ์ข
์ ์๋ณด์
โ์์กฐ๋ฅผ ์ผ๊ด๋๊ฒ ๋ง๋๋ ๊ณผ์ โ
Color Correction
- 12. ํฌํ ์ต์ ์ปค๋ธ๋ฅผ ์ด์ฉ, ํน์ ๊ทธ๋ผ๋ฐ์ด์
์ ๋ง๋ค์ด ์ ์ฉ
float3 InColor = tex2D (inSampler, IN.UV) XYZ;.
Float3 OutColor;
OutColor.r = tex1D (ColorCorrMap, InColor.r) R;
OutColor.g = tex1D (ColorCorrMap, InColor.g) G;
OutColor.b = tex1D (ColorCorrMap, InColor.b) B;
Curves
- 13. Luminanace ๊ฐ
{0.222, 0.707, 0.071} ์ ๊ตญ์ ์ฐ์
์์ ํ์ค
Float4 GrayScaleConversion( float4 InSceneColor )
{
float4 gray = dot(InSceneColor.xyz, luminace.xyz);
float4 Color = balance * lerp(gray, InSceneColor, saturation);
color.rgb *= fadeValue;
return color;
}
Grayscale Conversion
- 14. float3 CalcLut( sampler InLUT, float3 InColor )
{
// 256 x 16 LUT
float2 Offset = float2(0.5f / 256.0f, 0.5f / 16.0f);
float Scale = 15.0f / 16.0f;
float IntB = floor(InColor.b * 14.9999f) / 16.0f;
float FraceB = 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);
}
Unreal3
- 15. Unreal3 16x16x16 3d VolumeTexture
Float3 CalcLUT( sampler InLut, float3 InColor )
{
return tex3D( InLUT, InColor * 15.f / 16.f + 0.5f).rgb;
}
์์ ์ฑ๋์ ํผํฉํด ๋ชจ๋ ํฝ์
์ ์ ์ฒด ๋งคํ ํ๋ ๊ฒฝ์ฐ
float3 InColor = tex2D . (inSampler, IN.UV) XYZ, float3
OutColor = tex3D (colorSpaceSampler, inColor);
Unreal3, GpuGems
- 16. ์ข ๋ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ฉด ์ฌ์ฉํ์ง ์์๊นโฆ
ํฌํ ์ต์์ ์ง์ํ๋ ๊ธฐ๋ฅ๋ค
Blend Mode
- 17. // Curves Shader
float2 g_fTexcoord;
float4 g_fColour;
uniform sampler2D texCurve;
vec4 curves(float4 inColor, sampler2D texCurve)
{
return float4(texture2D(texCurve, vec2(inColor.r, 0.5)).r,
texture2D(texCurve, vec2(inColor.g, 0.5)).g,
texture2D(texCurve, vec2(inColor.b, 0.5)).b, inColor.a);
}
void main()
{
float4 inColor = (g_fColour * texture2D(gm_BaseTexture, g_fTexcoord));
gl_FragColor = curves(inColor, texCurve);
}
- 18. ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ํ๋ ์ฆ๊ฐ, ๋น ํจ๊ณผ์ ์ ์ฉ
// Screen Shader
float2 g_fTexcoord;
float4 g_fColour;
uniform sampler2D texScreen;
void main()
{
float4 inColor = g_fColour * texture2D(gm_BaseTexture, g_fTexcoord);
float4 blend = texture2D(texScreen, g_fTexcoord);
float4 outColor = float4(1.0 - (1.0 - inColor.rgb) * (1.0 - blend.rgb), inColor.a);
gl_FragColor = mix(outColor, inColor, 1.0 - blend.a);
}
- 19. ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ๋ฐ๊ธฐ๋ฅผ ๋ฎ์ถ๋ ํจ๊ณผ, vignette effects์ ์ ์ฉ
// Multiply Shader
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D texMultiply;
void main()
{
vec4 inColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
vec4 blend = texture2D(texMultiply, v_vTexcoord);
vec4 outColor = vec4(blend.rgb * inColor.rgb, inColor.a);
gl_FragColor = mix(outColor, inColor, 1.0 - blend.a);
}
- 20. ์์ ๋๋น์ฆ๊ฐ ๋น์ด ์๋ ์ฌ ์ ์ฉ
// Overlay Shader
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D texOverlay;
void main()
{
vec4 inColor = v_vColour * texture2D(gm_BaseTexture,
v_vTexcoord);
vec4 outColor = vec4(0.0, 0.0, 0.0, inColor.a);
vec4 overlay = texture2D(texOverlay, v_vTexcoord);
if (inColor.r > 0.5)
outColor.r = (1.0 - (1.0 - 2.0 * (inColor.r - 0.5)) * (1.0
- overlay.r));
else
outColor.r = ((2.0 * inColor.r) * overlay.r);
if (inColor.g > 0.5)
outColor.g = (1.0 - (1.0 - 2.0 * (inColor.g - 0.5)) * (1.0
- overlay.g));
else
outColor.g = ((2.0 * inColor.g) * overlay.g);
if (inColor.b > 0.5)
outColor.b = (1.0 - (1.0 - 2.0 * (inColor.b - 0.5)) * (1.0
- overlay.b));
else
outColor.b = ((2.0 * inColor.b) * overlay.b);
gl_FragColor = mix(outColor, inColor,1.0 - overlay.a);
}
- 21. ํฌํ๋(์์ ๊ฐ๋) ์กฐ์ , Point light์ ์ ์ฉ
// Color Dodge Shader
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D texColorDodge;
void main()
{
vec4 inColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
vec4 blend = texture2D(texColorDodge, v_vTexcoord);
vec4 outColor = vec4(inColor.rgb / (1.0 - blend.rgb), inColor.a);
gl_FragColor = mix(outColor, inColor, 1.0 - blend.a);
}
- 22. ์ฑ๋๋ฅผ ์กฐ์
// Color Burn Shader
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D texColorBurn;
void main()
{
vec4 inColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
vec4 blend = texture2D(texColorBurn, v_vTexcoord);
vec4 outColor = vec4(1.0 - (1.0 - inColor.rgb) / blend.rgb, inColor.a);
gl_FragColor = mix(outColor, inColor, 1.0 - blend.a);
}
- 23. Multipuly์ ๋ฐ๋๋ก ํ์์ ๋ฐ๊ฒ, ๊ฟ๊พธ๋๋ฏํ ํจ๊ณผ
// Divide Shader
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D texDivide;
void main()
{
vec4 inColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
vec4 blend = texture2D(texDivide, v_vTexcoord);
vec4 outColor = vec4(inColor.rgb / blend.rgb, inColor.a);
gl_FragColor = mix(outColor, inColor, 1.0 - blend.a);
}
- 24. ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ , ํฌํ?
// Exclusion Shader
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform sampler2D texExclusion;
void main()
{
vec4 inColor = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
vec4 blend = texture2D(texExclusion, v_vTexcoord);
vec4 outColor = vec4((abs(inColor - blend)).rgb,inColor.a);
gl_FragColor = mix(outColor, inColor, 1.0 - blend.a);
}
- 26. ์ฒ์์ ์ด๊ฑธ ์๊ฐ
๊ทธ๋ฌ๋ ์ดํ ๋๋ ์๊ฐ์ ๋๊ฐ ์ด๊ฑธ ๋ง๋ค์ด?
http://www.slideshare.net/noerror/07visual-shader-
editor?qid=b3a04c6d-70a3-4363-9574-
976b739f9a01&v=default&b=&from_search=1
Visual Shader Editor
- 28. ํ๋์ Shader๋ก ๋ชจ๋ ๊ธฐ๋ฅ ๊ตฌํ
์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ด์ฉํด Shader ์ปจํธ๋กค
Define๋ ๋ช
๋ น์ ์ด์ฉํด on/off
Uber Shader
- 31. ๊ฐ๋ง
ํ
์ค์ณ ๊ฐ์ ธ์ฌ๋ ๋ณด์
float3 diffuseCol = pow( tex2D( diffTex, texCoord ), 2.2 );
์ต์ข
์นผ๋ผ ๋ฆฌํด ๋ณด์
return float4( pow(finalCol, 1.0 / 2.2), pixelAlpha);
ํ๋์จ์ด ์ฌ์ฉ์ ์ต์
Texture : D3DSAMP_SRGBTEXTURE
RenderTarget write: D3DRS_SRGBWRITEENABLE