유니티
-
Fresnel(프레넬) & Rim 라이트유니티/게임그래픽 2024. 2. 22. 15:38
Rim 라이트 : 역광이 있을때 털이나 반투명 재질을 가진 물체들이 반사율에 따라 반사가 나타나는것 몸 윤곽선에 보이는 얇은 하얀색 부분을 Rim 라이트라고 이해하면 쉽다 유니티에 물리기반 쉐이더는 BRDF라는 함수를 이용해 구현되어 있다. 현실에서 그렇듯 유니티에서도 물질의 재질에 따라 반사율이 달라진다. 그리고 이러한 반사공식을 Fresnel이라고 한다 원래 Fresnel은 빛 방향과 연관되어 만들수 있겠지만 주로 게임안에서는 캐릭터의 분리와 강조를 위한 수단으로 사용한다 이제 Rim 라이트와 Fresnel에 대해서 알아봤으니 먼저 Fresnel 공식부터 구현해보자 Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("Albedo (RGB)", 2D..
-
Half-Lambert유니티/게임그래픽 2024. 2. 22. 11:40
Half-Lambert란 갑자기 음영이 검게 떨어지는 단점을 보완하게 위해 벨브에서 발표한 Lambert라이팅의 수정공식으로, 물리적으로는 옳지 않으나 가볍고 게임속 음영을 보기편하게 하는 공식이다 딱봐도 게임할땐 오른쪽이 더 보기 편해보인다 float4 Lighting_MyLambert(SurfaceOutput s, float3 lightDir, float atten) { float ndot = dot(s.Normal, lightDir) * 0.5 + 0.5; float4 final = saturate(ndot) + 0.5; return final; } 적용하는 방법은 매우 간단하다. ndot에 들어가는 값에 (* 0.5 + 0.5) 만 넣어주면 된다 전후 차이이다. 확실히 더 자연스럽고 보기좋게 바뀐..
-
Lambert 커스텀 라이트유니티/게임그래픽 2024. 2. 21. 18:09
우선 간단하게 텍스쳐 하나 받아 출력하게 한다 Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf _MyLambert noambient // 환경광 제거 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) // Lambert쓸거면 output 이후로 지우자 { fixed4 c = tex2D(_MainTex, IN.uv_MainTex);..
-
디지털 라이트 이론 & Vector유니티/게임그래픽 2024. 2. 21. 17:18
대부분의 3D 프로그래밍, 엔진은 크게 3가지의 라이트를 지원한다 1. Direction Light 유니티를 시작하면 가장 기본적으로 담긴 라이트. 강도,컬러,방향 정도의 정보만 담고 있다 가장 가벼운 라이트. (시작점,끝점,넓이x) 2. Point Light 점 모양의 광원이며 사방으로 뻗어나가는 특성. 둥근 모양의 라이트 & 일정 범위의 국지적 분위기 표현 Direction Light보다는 무거움 3. spot Light 특정 부분을 강조할때 사용 너무 당연한 얘기지만 Plane을 라이트와 반대되게 돌려버리면 어두워지고, 똑같이 라이트를 반대로 돌려도 어두워진다 즉, Plane의 앞 방향과 빛의 방향이 마주보면 가장 밝다는 규칙이 만들어진다 너무 당연한 얘기다 방향 벡터 : 한점으로부터 다른 한점까지..
-
Lambert & Blinn Phong유니티/게임그래픽 2024. 2. 21. 16:06
유니티에 내장되어 있는 라이팅은 총 3가지가 있다 1. Lambert 빛에 의한 밝고 어두움이 구현된 가벼운 라이팅 구조. SurfaceOutput 구조체 사용 (Specular 공식 x) 2. Blinn Phong 램버트 공식에 블린 퐁 공식이 더해진 라이트 구조 (Specular 공식 o) 3. Standard 주변 환경을 반사해서 Specular을 구현 *Specular 공식 : 보는 각도와 조명각도에 따라 계산된 특정 색의 하이라이트 동그라미로 표현 주로 이런건 이론으로 보는것보다는 바로 적용시켜 차이점을 확인하는것이 훨씬 빠를것같다 Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubS..
-
NormalMap유니티/게임그래픽 2024. 2. 21. 16:06
NormalMap: 컴퓨터 그래픽에서 *폴리곤 수를 늘리지 않고 표면의 시각적 디테일을 향상시키는 데 사용되는 기술. 쉽게 말해 실제 디테일이 없는 부분을 디테일이 있는것처럼 보이게 만들기 위한 눈속임 맵 *폴리곤(Polygon) : 3차원 컴퓨터그래픽을 구성하는 가장 기본단위인 다각형. 개수가 많을수록 현실에 가까운 느낌 일반적으로 푸른 색을 띄고 있으며 , 빛을 속이기 위한 벡터 데이터들로 이루어진 텍스쳐 파일이다 의미에 대해 알아봤으니 이제 한번 노멀맵을 실전에서 이용해보자 _BumpMap("Normalmap", 2D) = "bump" {} 노멀맵을 선언하는 기본문이다. 노멀맵은 수치들의 집합에 가깝지만 형식은 텍스쳐이므로 텍스쳐를 받는것도 동일하다 솔직히 _Maintex("Maintex", 2D)..
-
SurfaceOutputStandard(Metallic & Smoothness)유니티/게임그래픽 2024. 2. 21. 14:19
Standard Shader : 유니티 5.0부터 다른 많은 그래픽 툴이나 엔진처럼 최신 쉐이더 시스템인 물리기반 시스템이 도입됐다 물리기반 쉐이더 : 주변 환경에 따른 재질 변화를 물리 법칙에 기반하여 실시간으로 재질을 구현해주는 사실적인 쉐이더 표현 방식 (Standard Shader가 대표적인 물리기반 쉐이더이고 o.Albedo, o.Emission 모두 물리기반 쉐이더 요소이다) 그리고 SurfaceOutputStandard 구조체에 이 요소들이 정의되어있다 즉, SurfaceOutputStandard는 물리기반 쉐이더 요소들을 정의하고 있는 구조체이다 이번글에서는 쉐이더 요소들 중 Metallic과 Smoothness를 사용해보겠다 Shader "Custom/NewSurfaceShader" { ..