728x90 Computer Graphics/ShaderLab, HLSL19 [ShaderLab] NPR - 2Pass, Fresnel ■ PR, NPR 앞서 공부했던 Standard, Lambert, Blinn-Phong의 공통점은 실사와 비슷하게 표현하려고 하는 것이다. 이와 같은 렌더링 방식을 PR(Photo Realistic)이라고 한다. 이와 반대로, 전혀 사실적이지 않은 렌더링 시도가 있는데 대표적으로 셀 쉐이더 (Cell Shader or Toon Shader)가 있고 이러한 방식을 NPR(Non-Photo Realistic)이라고 한다. ■ 외곽선 만드는 방법 대표적으로 아래와 같이 두 가지가 있다. (1) 2Pass를 이용한 외곽선 제작 (2) Fresnel을 이용한 외곽선 제작 구분 특징 장점 단점 2Pass 이용 먼저 Pass란 '한 번 그리는 것'을 뜻한다.그러므로 2Pass는 두 번 그린다는 뜻이다. (1) 완전히.. 2024. 3. 4. [ShaderLab] Blinn-Phong, Gloss Map, Fake Specular ■ Blinn-Phong 여러 가지 스페큘러 표현 공식 중 가장 유명하고 전통적인 방식이다. 기본 원리는 '내가 바라보는 방향으로부터 반사되는 방향에 조명이 있으면 그 부분의 하이라이트가 가장 높다'이다. 보통 하이라이트를 표현하는 공식은 매우 유명한 Phong공식이 사용된다. Phong 공식은 반사 벡터와 조명 벡터의 내적으로 스페큘러를 표현하는 방식이다. 공식은 R(반사벡터) = 2N(L · N) - L 이다. 이러한 Phong 공식을 간략화한 것이 Blinn-Phong 공식이다. BlinnPhong은 '시선 벡터와 조명 벡터의 중간값인 하프 벡터(Half Vector)를 구하고 이를 노멀 벡터와 내적' 하는 것이다. 공식은 H · N 이다. 하프벡터를 구하는 방법은 시선벡터와 조명벡터를 더해주면 된.. 2024. 3. 3. [ShaderLab] Rim Light, Hologram ■ Fresnel (프레넬), Rim Light (림라이트) 우리 주변을 자세히 살펴보면 모든 물체는 기울어질수록 반사가 심해진다는 것을 느낄 수 있다. 실제로 모든 물체는 길우기가 심할수록 반사가 되며 그 반사율은 재질에 따라 크게 달라진다. 이와 같이 재질과 각도에 따라 빛이 반사되는 세기가 달라지는 현상을 프레넬(Fresnel) 현상이라고 한다. 역광을 예로, 털이나 반투명 재질의 물체들은 이 현상이 강렬하게 나타날 수 있고 재질에 따라 때로는 잘 보이지 않게 나타날 수도 있다. 이러한 역광으로 오브젝트의 외곽이 빛나보이는 듯한 현상을 림라이트(Rim Light)라고한다. ■ Fresnel 공식 구현 먼저 우리가 엔진에 내장되어 받을 수 있는 변수 중 viewDir인 뷰벡터 [카메라 벡터]를 얻어온.. 2024. 3. 3. [ShaderLab] (Half) Lambert Light ■ 커스텀 라이트 (Custom Light) 이전까지 스니핏(snippet)에 #pragma surface surf Standard 와 같이 'Standard'라는 지시어로 어떠한 라이트 구조를 사용하는지 명시했었다. 여기에는 Lambert, BlinnPhong, Standard의 키워드가 대표적으로 들어갔는데 이들을 제외하고 커스터마이징한 라이팅 구조를 쓰고싶다면 아래와 같이 고쳐주면 된다. surf 뒤에 CustomLight라는 키워드를 추가해줬다. 이름은 아무렇게나 지어도 된다. void surf 함수 아래 float4를 반환하는 LightingCustomLight함수가 보일 것이다. CustomLight함수 이전에 'Lighting'키워드가 중요하다. 이는 surf함수 이후에 Light 함수를 정.. 2024. 3. 2. [ShaderLab] AO(Ambient Occlusion), Vertex Color 활용2 ■ AO (Ambient Occlusion; 환경차폐) 보통 대부분의 사물, 공간들은 주변광(Ambient Light)으로 인하여 빛이 닿지 않는 공간도 밝아지는 경향이 있다. 이렇게 환경광이 가득한 공간에서 매우 구석져 있거나 복잡한 물체들로 가려져서 환경광도 닿지 못하는 부분은 더욱 어두워지는데 이 부분을 Ambient Occlusion라고 부른다. (예시. 출처: 유니티 공식문서) (코드) Occlusion은 개별 uv를 받으면 에러를 뱉어내므로 위와 같이 기존에 사용하고있는 텍스처의 uv를 가져다 사용해야한다. 그리고 일반적으로 Occlusion은 float값을 받지만 위와 같이 float4를 반환하는 tex2D사용 시 여러 채널 중 r 채널만 사용하고 나머지는 내부적으로 버린다고한다. [AO 적.. 2024. 2. 28. [ShaderLab] NormalMap ■ Footage Metalic과 Smoothness 프로퍼티를 추가 및 적용한 뒤 노말맵을 적용한 모습이다. 노말맵은 텍스처의 디테일을 살리기 위해 존재하는 눈속임용 맵이다. 벡터 데이터들로 이루어져있으며 이러한 데이터들은 일반적인 게임용 텍스처 포맷인 DXT1 혹은 DXT5가 아니라 DXTnm의 형식으로 집합되어 있다. 위와 같이 다른 이유는 일반적으로 사용하는 포맷을 그대로 가져다 쓴다면 벡터 데이터들의 품질 저하를 일으킬 수 있기 때문에 AG파일 포맷인 DXTnm 포맷을 만들어 사용하게 된 것이다. 이 포맷은 노말맵의 RGB중 R과 G 값의 퀄리티를 최대한 보전하여 A와 G에 개별적으로 넣어 저장한다. R과 G는 X와 Y에 대응되며 Z는 삼각함수를 이용해 수학적으로 추출된다. 그러므로 벡터 데이터.. 2024. 2. 28. [ShaderLab] Vertex Color (Masking) ■ Vertex Color 정점(Vertex)에는 여러 가지 정보가 들어있다. 대표적으로 (1) 위치 (Position) (2) 컬러 (Color) (3) 노말 (Normal) (4) 탄젠드 (Tangent) (5) UV (Texcoord) 위와 같은 정보를 담고 있는데 버텍스 컬러는 이 중에서 버텍스가 내포하고있는 Color값을 뜻한다. 이같이 외부 인터페이스에서 입력해주는 값이 아니라 엔진 내에서 버텍스 값을 받아와 사용하려면 Input 구조체를 사용해야했다. ■ Poly Bursh 유니티 2018부터 Poly Bursh라는 툴을 사용해 버텍스에 컬러값을 칠해줄 수 있게 되었다. Poly Bursh를 통해 위와 같이 R, G, B 영역을 칠해줬다. 처음에 칠하기만 하면은 우리 눈에는 보이지 않으므로 .. 2024. 2. 27. [ShaderLab] UV, 불 이펙트 ■ 기본적인 세팅 불 텍스처를 오브젝에 그대로 씌우기만한다면 검은색 배경화면이 분리되지 않은 채 그대로 적용이 됨. 이를 제거하기 위해 RenderType은 Transparent로 두고 alpha:fade 키워드를 스니핏에 추가해준다. 또한 빛의 영향을 받지 않고 텍스처 본연의 색깔을 나타내기 위해 o.Albedo = c.rgb 코드를 주석처리한 뒤 o.Emission = c.rgb를 추가해줬다. 기본 불 이미지를 적용해줄 뿐만이 아니라 불을 역동적으로 표현 하기 위해 불기둥 이미지를 적용 한 뒤 불기둥 이미지의 uv를 유니티 내장된 _Time 변수(시간)에 따라 조절해주는 코드를 추가해줬다. ▼ 결과물 불을 더 사실적으로 표현하기 위해 저자께서 올려주신 리소스 중 노이즈를 추가했다. 그리고 방금 추가한.. 2024. 2. 27. [ShaderLab] Surface Shader - Texture ■ 코드 이전 쉐이더 코드 속 스니핏에서 사용했던 fullforwardshadows키워드를 제거했다. 추가한다면, 이 쉐이더를 사용하는 오브젝트는 포워드 렌더링(Forward Rendering)일 때, 모든 라이트로부터 그림자를 생성하는 상태가 된다. 해당 키워드가 없다면 Directional Light로부터만 그림자를 생성하고 Point Light이나 Spot light로부터 그림자를 생성하지 않는다. [추가한 부분] Lerp함수를 활용하여 Texture1과 Texture2를 선형적으로 섞어 사용하였다. ■ Scene 작업물들을 한 데 모아놓고 깔끔한 상태로 보고싶어서 GUIText를 띄워줄 컴포넌트를 작성하고 부착했다. Texture 작업을 한 것은 Texture Mix Shader의 글자가 박힌 P.. 2024. 2. 15. 이전 1 2 3 다음 728x90