반응형
두 개의 블럭이 있다.
블럭 하나는 조명에 대해 밝기가 일정하지만, 다른 하나는 바라보는 방향에 따라 밝기가 변하고 있다.
쉐이더를 이용해 카메라가 바라보는 방향이 밝아지는 큐브를 만들어보자.
먼저 큐브하나에는 빨간색 Material을 추가하자. RGB는 (255, 100, 100)이다.
이제 두 번째 블럭에 입힐 쉐이더를 만들자. Standard Surface Shader를 추가한다.
BlockLight.shader는 아래와 같다.
Shader "MyShader/BlockLight"
{
Properties
{
_BlockColor("blockColor", Color) = (.0, .0, .0, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Lambert noambient noshadow
float4 _BlockColor;
struct Input
{
float3 viewDir;
};
void surf(Input IN, inout SurfaceOutput o)
{
//o.Albedo = _BlockColor.rgb;
o.Alpha = _BlockColor.a;
float rim = dot(o.Normal, IN.viewDir);
o.Emission = rim * _BlockColor.rgb;
}
ENDCG
}
FallBack "Diffuse"
}
Input의 viewDir로 현재 바라보는 방향의 벡터를 얻을 수 있다.
이것을 Normal 벡터와 내적 연산(dot)을 하여 Emission에 넣어준다.
즉, viewDir와 Normal이 일치할 때 가장 밝은 값이 나오게 된다.
struct Input
{
float3 viewDir;
};
void surf(Input IN, inout SurfaceOutput o)
{
//o.Albedo = _BlockColor.rgb;
o.Alpha = _BlockColor.a;
float blockColor = dot(o.Normal, IN.viewDir);
o.Emission = blockColor * _BlockColor.rgb;
}
Material을 추가한 후, 위에서 만든 쉐이더를 입힌다.
그리고 다른 큐브에 추가한다.
이 Material의 색상도 RGB가 (255, 100, 100)이 되도록 변경한다.
좀 더 효과를 제대로 보기 위해 [Mesh Renderer] → [Lighting] → [Cast Shadows] 를 Off로 설정하여
조명에 의해 그림자가 생기지 않도록 한다.
카메라를 변경해가면서 블럭의 색상/밝기가 어떻게 변하는지 비교해보자.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 - 2차원 배열 디버깅 : 인스펙터에 보여주기 (2D Array in the Inspector) (0) | 2022.06.18 |
---|---|
유니티 - OnGUI로 실시간 초당 프레임 수 확인하기 (FPS Status based on OnGUI) (0) | 2022.06.17 |
유니티 - BoundBox로 블럭이 움직일 위치 미리 예상하기 (Runtime Collider, 런타임 콜라이더) (0) | 2022.06.12 |
유니티 - 드래그로 블럭 옆으로 한 칸 움직이기 (Drag GameObject Snapped to a Grid) (0) | 2022.06.12 |
유니티 쉐이더 - 카메라 흑백 효과로 게임 오버 이펙트 만들기 (Camera Game Over Effect) (0) | 2022.06.11 |
댓글