개발/Graphics, Shader 썸네일형 리스트형 Phong vs Blinn-Phong Phong float3 reflectVector = normalize(reflect(-lightDir, s.Normal)); float spec = saturate(dot(reflectVector, viewDir)); Blinn-Phong float3 H = normalize(lightDir + viewDir); float spec = saturate(dot(H, s.Normal)); Unity Matcap Shader Shader "MatCap" { Properties { _MainTex("Base (RGB)", 2D) = "white" {} _MatCap("MatCap (RGB)", 2D) = "white" {} } Subshader { Tags { "RenderType" = "Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos: SV_POSITION; float2 uv : TEXCOORD0; float2 cap: TEXCOORD1; }; uniform float4 _MainTex_ST; v2f vert(appdata_base v) { v2f o; o.pos .. 초간단 흑백쉐이더 (GrayScale) 초간단하게 해서 그냥 메인 텍스쳐와 GrayScale용 값을 내적을 이용해 구했는데 응용하기는 쉬워서 내적하는 부분만 잘 알아두면 될듯함 결과 참고 https://en.wikipedia.org/wiki/Grayscale 노말맵이 파란이유 노말맵을 보면 전체적으로 푸른빛임 노말맵은 픽셀 단위로 계산되는데 픽셀에 3차원 좌표(x, y, z)를 가지고 있음 RGB 각 값을 0~1로 표시하고 벡터에서 정규화된 0~1 값으로 사용됨 이중 z 축이 노말의 방향임 정규 벡터는 -1~1의 값으로 나오는데 0을 -1로 취급함 rgb : 0 0.5 1 xyz : -1 0 1 z 축은 역방향으로 나오지 않아 항상 0 이상 0의 rgb값은 0.5이고 항상 b값은 0.5 이상으로 나오므로 노말맵은 푸른색으로 나옴 난반사, 정반사, 주변광 (Diffuse, Specular, Ambient) 난반사 (Diffuse) LightVector = normalize(Light.Position - Object.Position) Diffuse = saturate(dot(LightVector, Normal) 정반사 (Specular) LightVector = normalize(Object.Position - Light.Position) Reflection = reflect(LightVector. Normal) CameraVector = normalize(Camera.Positon - Object.Position) Specular = pow(saturate(dot(Reflection, CameraVector)), SpecularPower); 주변광 (Ambient) Diffuse + Specular + A.. 공간 변환 Local Space(물체 공간) 각 3D 오브젝트가 가지는 자신만의 좌표계 World Space(월드 공간) 3D 오브젝트를 가상의 월드 공간 놓아 월드 공간의 원점에서 3D 오브젝트가 위치해 있는 좌표 View Space(뷰 공간) 카메라가 바라보는 공간의 원점에서 3D 오브젝트가 위치한 좌표 Projection Space(투영 공간) View Space를 2D 이미지 위에 투영. 투영공간에서 투시가 적용됨. 공간 변환 Local Matrix * World Matrix * View Matrix * Projection Matrix 로컬스페이스 -> 월드 스페이스 -> 뷰스페이스 -> 투영 -> 원근 분할 정점 셰이더(Vertex Shader), 래스터라이저(Rasterizer) , 픽셀 셰이더(Pixel Shader) 정점 셰이더 : 3D 모델의 정점의 위치를 화면상 좌표로 변환, 정점 수만큼 실행 래스터라이저 : 정점을 3개씩 찾아 삼각형 안에 픽셀을 찾음 픽셀 셰이더 : 래스터라이저가 찾은 픽셀의 최종 컬러를 계산, 래스터라이저가 찾은 픽셀 수만큼 실행 이전 1 다음