2023. 10. 14. 12:29
Unity/shader
Shader "Unlit/AndroidDepth"
{
Properties
{
_DepthTex("_DepthTex", 2D) = "white" {}
}
SubShader
{
Tags {
"RenderType" = "Transparent"
"Queue" = "Transparent"
}
LOD 100
ZWrite Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 screenPos : TEXCOORD1;
};
sampler2D _DepthTex;
float4 _DepthTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _DepthTex);
o.screenPos = ComputeScreenPos(o.vertex);//면이 닿는 부분
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float4 screenPos = float4(i.screenPos.xyz, i.screenPos.w);
float4 screenPosNorm = screenPos / screenPos.w;
screenPosNorm.x*= _ScreenParams.x/ _ScreenParams.y;
screenPosNorm.x+= 0.5;
screenPosNorm.x-= _ScreenParams.x/ _ScreenParams.y/2;
screenPosNorm.y*=_DepthTex_ST.y;
screenPosNorm.x*=_DepthTex_ST.y;
screenPosNorm.x+=0.5;
screenPosNorm.x-=_DepthTex_ST.y/2;
float depCol= tex2D(_DepthTex, screenPosNorm.xy);
fixed4 col=0;
col.a=1;
col.r=depCol*2;
return col;
}
ENDCG
}
}
}
단 처음에 Rect사이즈를 가져와야 한다
이걸
이렇게 넣으면 끝
내가 이걸 왜 만들었냐 하면 안드로이드에선
정확히는 안드로이드의 OpenGLES3에서 _CameraDepthTexture를 가져올때 문제가 발생하기 때문
그리고 만약 멀티플랫폼을 지원해야 한다면 아래와같은 분기처리를 해줘야 한다
#if UNITY_IOS || UNITY_STANDALONE
//기존코드
#else
//커스텀 뎁스
#endif
그리고 당연히 카메라설정도 반영해야 하는데 난 FOV만 바꿔서 FOV만 설정함
using UnityEngine;
public class CameraCopy : MonoBehaviour
{
void Update()
{
var camMain = Camera.main;
var camThis = GetComponent<Camera>();
camThis.fieldOfView = camMain.fieldOfView;
}
}
뎁스 카메라에 이걸 넣어줌
결과물
근데 빌드하고 보니 뎁스 카메라도 안 되더라
찌발
왠지 렌더텍스처를 동적으로 생성하면 될거같기도 한데
이러면 생성할때마다 마테리얼에 하나하나 할당해줄거 생각하니 끔찍해서
결국 분기처리해서 안드로이드쓸때만 작동 안 하게 함
(어차피 아이폰은 된다고)
'Unity > shader' 카테고리의 다른 글
유니티 쉐이더 오류 모음 (0) | 2023.12.18 |
---|---|
PerlinNoise HLSL (0) | 2023.04.25 |
스크린 오버레이 샘플 (0) | 2023.01.20 |