우리게임에 향상을 위해서 Vulkan에 대해서 다시 한번 조사를 해보았습니다. 그리고 테스트도 진행중입니다.

Vulkan API는 2016년 초반에 출시되었으며, 이 시점부터 그래픽 카드 제조사들은 대부분의 현대 하드웨어에 Vulkan 지원을 도입하기 시작했습니다. 각 GPU 제조사(NVIDIA, AMD, Intel)별로 최초로 Vulkan을 지원하는 그래픽 카드는 다음과 같습니다.

- NVIDIA: GeForce GTX 600 시리즈부터 (Kepler 아키텍처 기반) Vulkan 지원이 도입되었습니다. 예를 들면, GeForce GTX 680이 이에 해당합니다.
- AMD: AMD의 경우, Radeon HD 7000 시리즈부터 (GCN 아키텍처 기반) Vulkan 지원이 도입되었습니다. Radeon HD 7970 등이 이에 해당합니다.
- Intel: 6th Generation Intel Core 프로세서 (Skylake 아키텍처)부터 Vulkan을 지원하는 내장 GPU를 제공하였습니다. 예를 들면, Intel HD Graphics 520이 이에 해당합니다.

위의 그래픽 카드 및 프로세서는 Vulkan 지원의 시작이나 최소 요구 사항에 해당하는 것으로, 최신 Vulkan 기능을 모두 지원하지는 않을 수 있습니다. 최신 기능을 완전히 활용하려면 업데이트된 그래픽 카드 및 드라이버를 사용해야 합니다.


Vulkan을 사용하면 일부 게임에서 Direct3D11보다 FPS가 효과적으로 향상될 수 있다고 합니다.

1. 저수준 제어: Vulkan은 저수준 그래픽 API로서 개발자가 GPU 작업에 대한 세밀한 제어를 할 수 있게 해줍니다. 이를 통해 자원 관리와 성능 최적화를 개선할 수 있습니다.

2. 멀티스레딩 최적화: Vulkan은 실행 시에 멀티 스레딩에 적합한 향상된 지원을 제공합니다. 이를 통해 멀티 코어 프로세서의 성능을 최대한 활용하여 더 나은 성능을 제공할 수 있습니다.

3. 드라이버 오버헤드 축소: Vulkan은 그래픽 드라이버의 오버헤드를 최소화하기 위해 설계되었습니다. 이를 통해 안정적이 건 효율적인 그래픽 처리 성능이 개선됩니다.

 

4. 더 작은 API: Direct3D보다 Vulkan은 더 작은 API입니다. 이것은 API 호출 및 오버헤드를 줄임으로써 빠른 렌더링을 가능하게 합니다.

 

5. 안정성: Vulkan은 안정성 면에서 DirectX보다 더 나은 성능을 제공합니다. 이는 Vulkan API의 명시성 및 안정성과 관련이 있습니다.

그러나 Vulkan이 무조건 모든 경우에서 Direct3D11보다 우수한 성능을 제공한다고 단정짓긴 어렵습니다. 성능 향상은 게임 개발자가 얼마나 Vulkan을 최적화하여 사용하는지, 그리고 실행되는 플랫폼 및 하드웨어가 어떤지에 따라 다릅니다. 적절한 호환성 및 성능을 위해 일부 게임 개발자들은 여전히 Vulkan과 Direct3D11을 동시에 지원하는 게임을 개발합니다.

결론적으로, Vulkan을 사용하면 게임에서 Direct3D11보다 FPS가 효과적으로 향상될 수 있지만, 성능에 영향을 미치는 여러 요인을 고려해야 합니다. 게임 개발자는 하드웨어 및 플랫폼, 그러한 기술의 최적화 수준을 고려하여 최상의 그래픽 API를 선택해야 합니다.

 

Vulkan은 Windows 10 이상, Linux 4.5 이상, iOS 11 이상, Android 7.0 이상에서 지원됩니다.

URP의 포스트프로세싱을 사용하면서 이것저것(Bloom, Shadows Midtiones...등등)을 만져봐도 뭔가 포토샵처럼 셋팅이 되는 느낌이 아니라는 느낌을 받았습니다.

하여, 예전에 테스트해봤던 LUT를 적용해보기로 하였습니다.

 

포트스트프로세싱에서 Color lookup을 이용하면 사용할수있습니다.

문제는 처음에...Texture가 없어서 어떤걸 기준으로 써야할지 몰라서 헤메었습니다.

Unity 가이드에 보니  [Standard Assets Effects package을 설치하여야합니다.]라고 써있습니다.

 

헌데...여기 아래에 있는거 같습니다...

라고 존재합니다.

 

NeutralLdrLut.png
0.00MB

찾기 귀찮다면 제가 올려둔것을 기본으로 사용하면됩니다.

 

포토샵에서 이렇게 컬러를 바꾸면

이렇게 됩니다.

참고로...

LUT 텍스쳐는 sRGB를 사용하면 안됩니다.

'Unity > ETC' 카테고리의 다른 글

Baked Lightmaps 문제점  (0) 2022.12.12
Prefab에 대해서 정리해봅시다.  (0) 2022.01.18
Asset Database version2?  (0) 2021.05.27
UTS2 Shader 모바일용과 일반의 차이  (0) 2021.05.25
플렛폼별 대표 이미지 압축율 테스트  (0) 2021.05.13

(개인적으로 테스트하고 세팅한 값들이라 오류가 있을 수 있습니다.)

 

HDRP Project setting은 개인적으로 굉장하다고 생각됩니다.(더 많은 옵션이 있으면 좋겠다는...)

URP에서의 Project setting는 뭐랄까 굉장히 제약이 많고 할수 있는게 별로 없다는 느낌이지만, 

HDRP Project setting 정말 많은 부분을 직접 설정할수 있다는게 굉장히 매력적입니다.

 

Project Setting을 열어 초기 셋팅을 시작합니다.

 

HDRP는 기본적으로 Linear로 설정이 되어 있지만, 처음에 확인하는 것이 좋습니다.

이게 왜 중요한가는 화면에 보이는 방식과 Shader를 계산할때 수치적으로 정확하게 하기 위함이라고 생각하고 넘어가면 될 거 같습니다.

(감마와 리니어에 대한 장단점은 대마왕님 강의를 검색하셔서 보시는것을 추천합니다.)


그다음은 Graphics인데, 이게 개인적으로는 초기에는 Quality랑 좀 헛갈리는 부분이 있었습니다.

둘다 똑같이 HDRenderPipelineAsset이라는 놈을 사용합니다.

 

그냥 두시면됩니다. 그냥 기본적인 게임 Quality셋팅이라고 할수 있습니다.

 

DefaultHDRPAsset을 임의로 설정할수 있는데, 어차피 Quality에서 설정하기 때문에 이부분은 구지 건드릴 필요는 없다고 생각됩니다.(이렇게 말하면서, 본인은 medium HDRenderPipelineAsset을 여기에 바꿔놓았고..)

Quality에서 보면 이렇게 보이는것을 알수 있습니다.

 


그다음은 HDRP Default Settings로 넘어가서 대부분 그대로 두면되는데,

중요한 부분은 Light Layer names과  Volume Components를 설정하는 것입니다.

Light Layer name은 조명 레이어 설정할때 이름 변경하는 부분입니다.(기본으로 둬도 상관없는데, 은근히 헛갈리기 때문에 이름을 바꿔서 사용합니다. 레이어 이름을 어디서 변경하나 했더니...여기있었군요...)

 

Volume Components를 확인하면, 기본적으로 뭔가 많이 있습니다.

이부분은 Scene을 구성할 때 기본적으로 설정하는 포스트프로세싱입니다.

전체적으로 어떤 분위기를 잡기 위해서 설정하는 것인데, 스테이지마다 분위기가 다르고 설정해야 할 값이 다르다면

Scene에서 직접 구성하는 것 좋기 때문에 대부분 삭제하는 것 좋습니다.

전 개인적으로 Exposure를 제외하고 다 없애고 사용합니다. 어차피 Scene에서 Exposure(노출)를 따로 조정하기 때문에 이것도 의미가 크게 있진 않지만 통일된 기본셋을 하나는 넣어 두는 것이 좋다고 생각합니다.

(그외에 Shadows 처럼 크게 변경되지 않는 것들을 넣어두면 편리합니다.)

 

그리고, LookDev Volume이라는 것이 있는데, 이건 임시로 모델링에 포스트프로세싱을 볼 수 있게 해주는 별도의 툴인데,  게임 설정과는 아무런 상관이 없는 부분이라 무시하셔도 됩니다.(이게 뭔지 한참을 찾았다는...)

 


다음 제일 중요한 퀄리티 셋팅 부분입니다.

이부분을 어떻게 설정하느냐에 따라 고사양 컴퓨터와 저사양 컴퓨터에서 돌아가게 하는것을 결정하는 곳이기 때문입니다. 말그대로 퀄리티를 설정하는 부분인데, 각각 설정을 어떻게 하느냐에 따라서 포스트프로세싱이나 그림자의 퀄리티가 결정이 됩니다. 아래는 기본 HDRP 설정입니다.

근데, Quality 아래에 HDRP가 또 있습니다.

이게 뭐냐면 Quality에 있는 Very low, Medium, Ultra를 각각 컨트롤 하는 부분입니다.

일종에 세부 설정입니다.

근데, 이게 Inspector에서도 수정할수 있는 부분입니다.(편의상 이곳에 해놓은거 같습니다.)

이 퀄리티 파일은 Project에서 우클릭하여 아래처럼 생성할수 있습니다만, 아무래도 유니티에서 제공되는 기본을 가지고 변경하는것이 뭔가 맘이 편합니다.

 

중요한 Quilty 셋팅은 다음장으로...

'Unity > HDRP' 카테고리의 다른 글

Shader variant collections  (0) 2022.09.02
HDRP에서 Emssion 사용시 주의점  (0) 2022.06.24
HDRP와 URP의 빛의 차이  (0) 2022.02.10
URP, HDRP 라이트맵(shadowmask) 설정  (0) 2022.01.18
HDRP Quality 셋팅  (0) 2021.10.08

 

Z는 공간에서 Z축 위치를 뜻하며,Buffer는 카메라와 물체의 거리를 저장하는 메모리 공간을 의미합니다.

 

처음엔 초록색을 그리고, 그다음엔 빨간색을 그리고, 그다음은 파란색순으로 색위를 덫칠한다고 생각해야합니다.

위 과정으로 화면에  컬러들이 표시된다고 상상하면 됩니다.

 

Unity는 Cull , Zwrite, Ztest의 세가지 옵션을 제공합니다.

 

ZTest는 7가지 값이 있습니다.

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

기본값은 LEqual  (이미 그려진 오브젝트와 거리가 같거나 더 가까운 경우에 그립니다. 그보다 먼 경우에는 오브젝트로 숨깁니다)입니다.

 

Ztest와 Cull 를 이용하면 재미있는 형태를 만들어 낼수 있다.

 


태그는 위와 같은 구문을 사용합니다. 위 Tag는 전체 셰이더에 영향을 주지만, pass 안에 있으면 선택한 pass에만 영향을 미칩니다.

 

장면에 물체를 그릴때 마다 객체 정보를 GPU에 전달하고 이 그리는 과정을 "Draw Call"이라고 합니다. 셰이더에 pass가 많을수록 드로우콜이 늘어납니다.(카메라는 가장 먼거리에서부터 가까운 물체를 그립니다.)

 

Unity에 처리 대기열을 Render Queue라고 합니다.

Render Queue를 수정하는 방법은 두가지 방법이 있습니다.

위처럼 material inspector의 숫자를 변경하여 순서를 정하거나, 

아래 셰이더 Tag를 이용하는 방법입니다.

 

 

Queue의 순서는 다음과 같습니다.

"Queue"= "배경" 범위는 0 ~ 1499입니다. 기본값은 1000입니다.
"Queue"= "지오메트리" 1500 ~ 2399 범위 기본값은 2000입니다.
"Queue"= "AlphaTest" 2400 ~ 2699 범위 기본값은 2450입니다.
"Queue"= "투명"  2700 ~ 3599 범위 기본값은 3000입니다.
"대기열"= "오버레이" 범위는 3600에서 5000까지입니다. 기본값은 4000입니다.


블랜딩 종류
각종 블랜딩 옵션 설정 방법

 SubShader
    {
        Tags 
        { 
            "RenderType"="Opaque"
            "Queue" = "Transparent"
        }
        
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha //전통적인 투명
            //Blend One OneMinusSrcAlpha // 미리 곱해진 투명
            //Blend One One //ADD
            //Blend OneMinusDstColor One // SOFT ADD
            //Blend DstColor Zero // MULTIPLY
            //Blend DstColor SrcColor // 2X MULTIPLY
            //Blend SrcColor One //OVERLAY
            //Blend OneMinusSrcColor One //SOFT LIGHT
            //Blend Zero OneMinusSrcColor //SUBTRACT


            BlendOp Add  //Default Value
            //BlendOP Sub
            //BlendOP Max
            //BlendOP Min
            //BlendOP RevSub

        Pass

코드는 위처럼 만들어지게 되고, 그 결과는 아래와 같은 순서로 됩니다.

Blend SrcAlpha OneMinusSrcAlpha
Blend One OneMinusSrcAlpha
Blend One One
Blend OneMinusDstColor One
Blend DstColor Zero
Blend DstColor SrcColor
Blend SrcColor One
Blend OneMinusSrcColor One
Blend Zero OneMinusSrcColor
Blend One OneMinusSrcAlpha + BlendOP Sub

유니티 도움말 참고: docs.unity3d.com/Manual/SL-Blend.html

'Unity > Code base Shader' 카테고리의 다른 글

Microsoft HLSL  (0) 2021.02.09
인위적 유리 셰이더  (0) 2021.02.09
Unity Shader에 대한 이해  (0) 2021.01.01
Specular 다 광원지원  (0) 2020.12.21
SpecularShader  (0) 2020.12.19

Unity Shaders con CG/HLSL y Shader Graph 강의를 대충듣고 작성된겁니다.

(원어가 스페인어이고 이를 번역한 영어를 또 해석한거라 오역이 있을수 있습니다.)

 

 

물체가 화면에 뿌려지는 과정은 위와 같은과정을 거친다.

 

unity 쉐이더는 CG 코드를 사용한다.

CG언어는 NVIDIA와 마이크로소프트의 협력하여 만든 언어이다.

그리고 이것은 HLSL가 비슷한 구문으로 사용된다.

 

GLSL- OpenGL Shading Language

HLSL- High Level Shader Language

HLSL과 CG는 동일한 언어이지만 다른 이름을 반영합니다.

 

셰이더가 CG 언어로 작동하는 이유 HLSL과 GLSL을 모두 컴파일 할 수 있기 때문입니다.

 

1. Shader의 이름을 정의합니다.

2. Shader 속성을 정의합니다.

3. Shader 시작과끝

4. 하나 이상의 pass를 설정합니다.

 

반투명과 투명픽셀의 블랜딩을 설정하여 투명단계를 설정합니다.

Shader의 모든 속성은 쉐이더랩 언어로 선언됩니다.

이 모든것은 CG언어가 GPU에서 실행됩니다.

 

Unity는 두가지를 선택할수 있는 언어 옵션을 제공합니다.

Surface shader는 빠르고 쉽게 접근이 가능하지만 갖혀진 틀에서 작업해야하며,

Vertex/Fragment Shader는 좀더 많은 범위에서 조작이 가능해집니다.

 

속성은 8가지로 작성될수 있습니다.

 

투명과 불투명을 설정합니다. (이외에 뭐라 설명하는데 이해를 못했네요.)

 

투명패스, 컬러패스, 그림자패스등 렌더 패스를 나타냅니다.

패스가 많을수록 드로우콜이 늘어나게 됩니다.

 

Fallback은 subshader가 실패할 경우 사용해야 하는 기본 셰이더 이름에 해당합니다.

(만든 셰이더가 제대로 작동하지 않는다면 다른 셰이더를 사용하라는 일종에 대비에 해당됩니다.)

 

구조체 사용변수

 

정점 셰이더는 3D 모델의 각 정점에서 실행되는 프로그램입니다.

객체의 정점 위치를 "클립공간" "투사공간"이라고 불리는 자표계로 변환할수 있습니다.

 

물체에 텍스쳐를 붙이고 싶다면 우리는 UV좌표를 갖을 필요가 있습니다.

Fragment Shader는 객체가 화면에 차지하는 각 픽셀에서 실행되는 프로그램입니다.

 

Fragment Shader는 최종적으로 화면에 뿌려지는 픽셀이라고 설명할수 있습니다.

 

그래서 우리는 원하는 결과를 화면에 물체를 뿌리기 위해서는  Vertex Shader와 Fragment Shader 둘다 필요합니다.

 

Unity에서 셰이더를 생성하기위한 표준 언어가 HLSL입니다.

Unity에는 모바일 장치에서 더 나은 작동을 허용하는 몇 가지 추가 데이터 유형이 위처럼 있습니다.

더 높은 정밀도로 데이터 유형으로 작업 할 때 GPU 계산이 높을수록 그러므로,모바일 장치가 더 뜨거워지고 배터리가 더 많이 소모됩니다.

Float는 고정밀 32 비트 데이터 유형입니다.
Half는 16 비트 중간 정밀도 데이터 유형입니다.
fixed는 낮은 정밀도의 11 비트 데이터 유형입니다.

 

벡터와 행열

 

텍스처의 데이터 유형의 예

 

3D 물체가  화면에 뿌려주는 과정

 

float4x4는 UNITY_MATRIX_MVP 행렬에 해당하는 세 개의 개별 행렬이 결합 된 형태입니다.

로컬, 월드, 뷰, 프로젝션 

 

Local space : 물체의 중심을 기준으로 정의됩니다.

POSITION 시맨틱은 꼭지점 값을 이야기 합니다.

float4 vertex : POSITION 의미는 "vertex"변수에 모델의 초기 정점 위치를 저장하여 셰이더에 할당합니다.

 

World space: 포인트의 위치는 그리드의 중심을 기준으로 정의됩니다.

 

View space: 공간에서 한 지점 사이의 거리 좌표에 해당 카메라 뷰의 포인트입니다. 카메라 시선이라고 생각하면됩니다.

 

 

Projection space: 클립스페이스이다.

카메라 렌즈의 중앙에있는 거리와 관련하여 클립 공간이라고도하는 투영 공간에서 좌표 변환 프로세스는 카메라 Frustum와 관련하여 수행됩니다.

Frustum: 근거리 클리핑 평면, 원거리 클리핑 평면 및 시야로 정의됩니다.

SV_POSITION 의미론은 픽셀의 위치에 해당합니다.

(유니티정의:두 클리핑 평면과 경계선에 의해 잘린 피라미드의 형상이 되며, 이것을 뷰 Frustum이라고 합니다.)

 

 

UnityObjectToClipPos ()는 오브젝트를 로드할 때 정점의 위치는 오브젝트 공간에 로드됩니다

물체를 로드하는 방식은 여러가지 이나, 가장 적절하고 간단한 방법은 포함 된 기능을 사용하는 것입니다.

'Unity > Code base Shader' 카테고리의 다른 글

인위적 유리 셰이더  (0) 2021.02.09
Z-Buffer, Render Queue, Tag, Blending  (0) 2021.01.01
Specular 다 광원지원  (0) 2020.12.21
SpecularShader  (0) 2020.12.19
diffuseShader  (0) 2020.12.15

Unity의 기본셰이더를 보면 Mask texture를 넣는 부분이 있습니다.

Mask 기본은 연두색으로 이루어진 경우가 많은데 이유는 RGBA채널별로 각각 다른 텍스쳐를 넣어서 텍스쳐 한장으로 효율적인 텍스쳐관리를 위해서 제작됩니다.

일반적으로 메탈이나 AO는 흑백외에는 컬러를 사용하지 않기 때문에 텍스쳐 한장으로 만드는것이 여러가지 유리합니다.

 

R- metal관련 맵을 넣는 부분입니다.
G- AO관련 맵을 넣는 부분입니다.
B- 마스크맵입니다.(구멍뚫는 용도?)
A-smoothness맵을 넣는 부분입니다.(블랙이면 반응이 없어요.)

 

'Unity > ETC' 카테고리의 다른 글

Reflection Probe의 반사..  (0) 2020.12.14
플렛폼별 Texutre 설정  (0) 2020.12.11
볼때마다 잊어버리는 조명설정..  (0) 2020.11.18
유니티 빌드옵션 Compression Method  (0) 2020.11.11
Memory Profiler  (0) 2020.11.10