Alphatest(Cutout) 이란?
불투명(Opaque)오브젝트를 그린 후 알파 테스트를 거쳐 픽셀값을 제거한 오브젝트가 그려지게 된다.
불투명 오브젝트를 그린 후에 알파테스트된 오브젝트를 렌더링 하는 것이 효율적이기 때문에
이를 별개의 Queue로 구분해서 (TransparentCutout 2450) 사용하게 된다.
먼저 tags를 다음과 같이 변경해준다
Tags
{
//Render type과 Render Queue를 여기서 결정합니다.
"RenderPipeline"="UniversalPipeline"
"RenderType"="TransparentCutout"
"Queue"="AlphaTest"
}
일단은 Alpha Test를 하기 위해선 쟤료로 사용할 수 있는 텍스쳐가 필요할텐데 그것은 전 강의를 살펴보면 될 것이다.
// Shader 시작. 셰이더의 폴더와 이름을 여기서 결정합니다.
Shader "URPTraining/URPBasic"
{
Properties
{
// Properties Block : 셰이더에서 사용할 변수를 선언하고 이를 material inspector에 노출시킵니다
_MainTex("MainTexture2D", 2D) = "white" {}
}
SubShader
{
Tags
{
//Render type과 Render Queue를 여기서 결정합니다.
"RenderPipeline"="UniversalPipeline"
"RenderType"="TransparentCutout"
"Queue"="AlphaTest"
}
Pass
{
Name "Universal Forward"
Tags { "LightMode" = "UniversalForward" }
HLSLPROGRAM
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma vertex vert
#pragma fragment frag
//cg shader는 .cginc를 hlsl shader는 .hlsl을 include하게 됩니다.
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
//vertex buffer에서 읽어올 정보를 선언합니다.
struct VertexInput
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
Texture2D _MainTex;
SamplerState sampler_MainTex; //sampler + maintex
//보간기를 통해 버텍스 셰이더에서 픽셀 셰이더로 전달할 정보를 선언합니다.
struct VertexOutput
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
//버텍스 셰이더
VertexOutput vert(VertexInput v)
{
VertexOutput o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
return o;
}
//픽셀 셰이더
half4 frag(VertexOutput i) : SV_Target
{
half4 col = _MainTex.Sample(sampler_MainTex, i.uv);
return col;
}
ENDHLSL
}
}
}
자, 이제 본격적으로 Alpha Test를 할 생각이다. 이것은 픽셀셰이더에서 계산하는 것이기에
픽셀 셰이더 레벨에서 이것을 입력해주자
clip(col.a);
return col;
.. 이러고 적용을 해봤자 아무 일도 일어나지 않는다.
그 이유는 텍스쳐는 지금 RGB만 있고 A가 없어서 그렇다.
일단은 A값이 있는 텍스쳐를 만들어주자.
다만 그렇게 함에도 불구하고 당장 변화는 없어 보인다.
그 이유는 클립공간연산을 해야하는디 지금 0미만을 날리기 때문에 (지금 0미만이 없다.)
아무일도 없는 것이다.
일단 프로퍼티스에 제어할 수 있는 Range를 하나 추가해주자.
_AlphaCut("AlphaCut", Range(0, 1)) = 0.5
그 다음 우리는 숫자 하나를 이용할 것이 때문에 변수로 지정도 해주자
float _AlphaCut;
다시 픽셀셰이더로 돌아와서 어떤 픽셀을 지워나갈 것인지 규칙을 하나 만들어주자
half4 col = _MainTex.Sample(sampler_MainTex, i.uv);
clip(col.a - _AlphaCut);
return col;
이제 우리는 plane 하나로만 창틀이나 나뭇잎 같은 것들을 만들 수 있게 되었다!
Q : RenderQueue를 3000으로 올리고 col.a 값을 직접 조정하면 반투명으로 만들 수 있나?
A : 그..럴수가 없다 절대
알파를 그냥 쓰는게 아니고 클립이라는 함수를 이용해서 알파를 계산한다.
클립은 그냥 0 미만이면 픽셀값을 지워버린다 (반투명으로 만드는 것이 아님)
'유니티 > Shader Study' 카테고리의 다른 글
URP Shader Study #7 - Zwrite, ZTest, Offset (1) | 2023.12.02 |
---|---|
URP Shader Study #6 - Transparent Shader + Culling (1) | 2023.12.02 |
URP Shader Study #4 - Texture Sampling (3) | 2023.11.30 |
URP Shader Study #3 - Properties에 Range 항목을 추가하고 색 밝기/변경으로 슬라이드로 조절하기 (1) | 2023.11.29 |
URP Shader Study #2 (pragma, Rendering Pipeline, hlsl, 코드리뷰) (3) | 2023.11.29 |