유니티/게임그래픽
-
홀로그램 응용유니티/게임그래픽 2024. 2. 24. 16:44
1. 홀로그램을 깜빡이게 해보자 깜빡이는 주기는 _speed라는 이름으로 입력받은 range로 조절할 수 있다 void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex); o.Emission = _Color.rgb; //rim float ndot = saturate(dot(o.Normal, IN.viewDir)); float rim = pow(1- ndot, _RimPow); o.Alpha = rim * sin(_Time.y * _Speed); } 윗부분은 사실 다 아는 내용이니까 넘어가고 출력파트만 보겠다 o.Alpha = rim * sin(_Time.y); 이게 핵심이다. 우선은 깜빡이게 하기 위해서는 ..
-
홀로그램유니티/게임그래픽 2024. 2. 24. 16:38
이번엔 Rim 라이트를 알파에 집어넣어 우리가 흔히 알고 있는 홀로그램의 기본형을 만들어보자 Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; struct Input { float2 uv_MainTex; float3 viewDir; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex); o.Albedo ..
-
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..