원래 이걸 보면서 홀로그렘을 만들고 있었다.
https://sharpcoderblog.com/blog/create-a-hologram-effect-in-unity-3d
Hologram Effect in Unity 3D
Hologram Effect is widely used in many popular games such as Halo series, Call of Duty: Advanced Warfare, Half Life 2 etc. In this tutorial I will be showing how to create a ...
sharpcoderblog.com
이 쉐이더를 그냥 에셋 스토어에서 굴러다니는 좀비 모델에 테스트 해봤다.
이렇게 만들고 있었는데 기획자분이 줄무늬 없는 그런 홀로그렘은 원하셔서 눈물을 머금고 텍스쳐 부분을 빼봤는데
세상에
구강구조 TMI....
저는 당신의 구강구조를 알고싶지 않습니다 좀비 선생님..
내부 구조가 있는 모델은 알파로 투명하게 만들면 내부 구조가 보일 수 밖에 없다.
예전에 알파가 대환장파티라는걸 공부해 둬서 다행이다.
Unity Shader - Alpha 이론 & 문제 해결
게임을 만드는데 있어서 반투명 그래픽은 필수적이며 여러가지 활용하는 곳이 많습니다, 반투명이라는 것은 뒤의 픽셀과 블렌딩(Blending)된다는 의미입니다. 이번 포스팅에서는 알파에 관한 이
darkcatgame.tistory.com
이 블로그를 참고해서 고쳤다.
결론은 간단하게 말하자면 2pass로 Zwrite On , Off 하면 되는 문제이다.
근데 원래 있던 코드를 2Pass 적용하는데 코드가 복잡해서 잘 안됐다. 쉐이더 코드를 읽을줄은 아는데 전체적으로 뜯어 고치는건 아직 어렵다..
그래서 처음 썼던 쉐이더코드 말고 해당 블로그에서 2Pass 를 통해 처리하는 코드를 토대로 정말 간단한 림 라이트를 고치는 방향으로 갔다.
darkcatgame님의 코드에서
이렇게 수정했다.
Shader "Custom/RimLight"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_RimPower ("RimPower" , Range(1, 5) ) = 3
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue" = "Transparent" }
ZWrite on //! zwrite는 기본적으로 켜져있지만 확실하게 코드를 짜줍니다.
ColorMask 0 //! 렌더하지 않습니다.
CGPROGRAM
#pragma surface surf _NoLit nolight keepalpha noambient noforwardadd nolightmap novertexlights noshadow //! 최적화 코드
struct Input
{
float2 color:COLOR;
};
void surf (Input IN, inout SurfaceOutput o)
{
}
float4 Lighting_NoLit(SurfaceOutput s, float3 lightDir, float atten) //! 커스텀 라이트 함수를 만들어 아무런 연산을 하지 않습니다.
{
return 0.0f;
}
ENDCG
ZWrite off
CGPROGRAM
#pragma surface surf Lambert alpha:blend
sampler2D _MainTex;
fixed4 _Color;
float _RimPower;
struct Input
{
float2 uv_MainTex;
float3 viewDir;
};
void surf(Input IN, inout SurfaceOutput o)
{
// 여기에서 따로 림라이트를 만들어서 홀로그램을 만들자
fixed4 c = tex2D (_MainTex, IN.uv_MainTex );
//o.Albedo = c.rgb;
float rim = saturate(dot(o.Normal, IN.viewDir));
rim = pow(1-rim,_RimPower);
o.Emission = _Color;
o.Alpha = rim;
}
ENDCG
}
FallBack "Diffuse"
}
Surf 함수에서 림라이트 연산을 하는 것 뿐이다. 매우 간단. 연산도 그렇게 많지 않아서
모바일에서도 크게 문제 없을 거 같다.
결과물은
후~~~ 편안
그리고 RimPower 변수를 하나 더 만들어서 정도도 조절 할 수 있게 했다.
'Unity > Shader' 카테고리의 다른 글
[ 쉐이더 ]요절복통 Alpha 이야기 ppt (0) | 2020.07.07 |
---|---|
[Unity] post processing 적용방법 (0) | 2020.02.26 |
[ Unity Shader ] RimLight 구현 (0) | 2020.02.13 |