팀프로젝트/R&D

2020.06.28. Shader_Stencil Buffer, Culling & Depth Test, Pass, Blending

dev_sr 2020. 6. 28. 14:32

*아직 공부하는 중임*

 

 

1. Stencil Buffer

stencil Buffer 라는 것이 있다.

이걸 쓰면 포토샵의 마스크처럼 각도에 따라 또는 오브젝트에 가려지는 부분만 렌더링 할 수 있게 함

즉, 마스크 렌더러임

 

 

stencil

{

      ref 20

      comp Always     

      pass replace

}

 

1)Ref

-버퍼에 기록하기 위해 서로 비교하는 값(Comp이 Always가 아닌 경우)

-0~255까지 정수타입

-Pass, Fail , ZFail로 대체될 값임

 

2)Comp

-Buffer에 있는 Ref값을 현재 Contents와 비교할 때 사용 ( 디폴트는 Always)

 

3)Pass 

-Stencil 테스트와 Depth테스트를 통과한다면 Buffer의 Contents를 어떻게 할 것인지 지정 ( 디폴트는 Keep )

 

4)Fail

-테스트가 실패한다면 Buffer의 Contents를 어떻게 할 것인지 지정 (디폴트는 Keep)

 

5)ZFail

-Stencil은 통과했는데 Depth테스트는 통과 못했을 경우, Buffer의 Contents를 어떻게 할 것인지 지정 ( 디폴트는 Keep )

 

 

comp 뒤에 쓰는 비교함수

 

 

 

pass 뒤에 쓰는 함수

 

 

 

 

ShaderLab: 스텐실 - Unity 매뉴얼

스텐실 버퍼는 픽셀을 저장 또는 폐기하기 위한 용도의 픽셀 마스크로 사용할 수 있습니다.

docs.unity3d.com

 

 

 

2. Culling & Depth Test

1) Culling

- Back : 안보이는 뒷쪽이 렌더링 안됨 (디폴트)

- Front : 사람이 보는 앞쪽을 렌더링 하지 않음 (오브젝트의 안팎을 뒤집을 때 사용)

- off : 컬링 비활성화, 모든 면을 렌더링함 (특수한 효과에만 사용)

 

2) ZWrite

-오브젝트의 픽셀이 Depth Buffer에 작성될건지 결정함 (기본은 On)

-반투명 효과를 기대하는 경우 off로 설정

 

3) ZTest

- Depth테스트를 수행할 방법

- 이 값에 따라서 벽뒤의 물체가 다른 색상이나 반투명으로 렌더링 되는게 안됨 ( Less로 해보면 안됨 )

- Less,  Greater, LEqual,  GEqual,  Equal,  NotEqual,  Always (기본값은 LEqual)

 

 

 

3. Pass (위의 stencil 안의 그 pass 아님!)

stencil buffer 를 제대로 구현하려면 pass가 최소 2번은 거쳐야 한다.

pass란 쉐이더의 렌더링이 한번만 처리되는 구문 단위

SubShader에서 여러개의 Pass를 작성할 수 있다.

 

유니티에는 총 3종류가 있다고 함

1. Normal Pass : Pass 라고 작성됨, 일반적인 렌더링에 사용

2. Use Pass : 다른 shader 에 작성된 Pass 를 가져와서 사용

3. Grab Pass : Render To Texture(화면 캡쳐라고 함..), 특수한 Pass

 

 

여기 맨 밑에 UsePass랑 GrabPass링크 있음

 

유니티 - 매뉴얼: ShaderLab: Pass

ShaderLab: Culling & Depth Testing ShaderLab: Pass Pass 블록은 오브젝트 지오메트리를 한 번만 렌더링하도록 합니다. 문법 Pass { [Name and Tags] [RenderSetup] } 기본적인 pass 명령은 렌더링 설정 명령의 옵션 목록을

docs.unity3d.com

 

4. Blending

모든 쉐이더가 렌더링 되고, 텍스쳐가 적용되고 픽셀이 화면에 작성이 되는데

이 픽셀들이 기존 픽셀에 결합되는 방식을 설정하는 것을 Blending이라고 함 

 

 

위의 세팅으로 이 쉐이더에 어떤 Blend를 적용할 것인지 선택할 수 있음

아래 회색 네모의 내용은 가장 흔하게 사용하는 조합과 용도라고 함

 

렌더링되는 오브젝트가 순서가 섞이는 이슈가 있어서

렌더링 순서를 강제로 정해줌(배열처럼 실행될 인덱스를 정해줌)

 

Tags { "Queue" = "Transparent" }

Tags { "Queue" = "Geometry+1" }

 

이렇게 Queue 태그를 사용하면 오브젝트 드로우 처리 순서를 설정할 수 있다고 함

이런 방식으로 불투명한 오브젝트 먼저 처리 -> 투명한 오브젝트 처리가 가능

 

*우선순위

1. Background : 가장 먼저 렌더링 됨 , 배경에 배치해야할 항목에 사용 - 1000

2. Geometry : default, 대부분 오브젝트에 사용 , 불투명 오브젝트가 사용 - 2000

3. AlphaTest : 알파테스트 된 Geometry가 사용 -2450

4. Transparent : AlphaTest 렌더링 후에 뒤에서 앞의 순서로 렌더링 된다고 함

                     뎁스 버퍼에 기록되지 않는 쉐이더, 유리, 파티클 효과 등 - 3000

5. Overlay : 마지막에 렌더링 되는 모든 항복 (렌즈 플레어 등) - 4000

 

 

Tags { "Queue" = "Geometry+1" }

 

같은 경우는 인덱스가 2001이 되므로 모든 불투명 오브젝트가 렌더링 되고 난 뒤 투명 오브젝트 보다 먼저 렌더링 됨

- 불투명 오브젝트 렌더링 -> Geometry+1 렌더링 -> 투명 오브젝트 렌더링

 

 

 

ShaderLab: 블렌딩 - Unity 매뉴얼

블렌딩은 투명 오브젝트를 만드는 데 사용됩니다.

docs.unity3d.com

 

 

ShaderLab: 서브셰이더 태그 - Unity 매뉴얼

서브셰이더는 태그를 사용하여 렌더링 엔진을 렌더링할 방법과 시기를 지정합니다.

docs.unity3d.com