ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 24년 6월 18일 TIL
    공부 기록 2024. 6. 18. 22:19

    셰이더에 대해서

    세이더란 GPU에서 실행 되는 작은 프로그램으로, 주로 그래픽 렌더링을 제어 하는 데 사용 된다고 한다. 

    그래픽 데이터를 처리 하고, 화면에 표시 될 픽셀의 색상과 광택 등을 계산한다고 한다.

     

    유니티에서 색을 직접 계산 하게 할 수 있는 기능이다. 특강에서 광택 효과를 주고 색을 바꾸고 투명하게 하게 하는 것을 코드로써 제어 해서 게임 플레이 중에 반짝이는 연출, 롤 존야 같은 연출, 레이져처럼 번쩍 하는 연출, 아무튼 많은 것을 구현 할 수가 있다. 

     

    주요 기능 : 광택 효과, 색상 변경, 투명도 제어, 반짝이는 연출 등등등

     

    사용방법 : Shader 에셋 생성(lit는 조명효과를 받는 것. UnLit는 조명효과를 받지 않는 것) -> Shader를 담을 Material 생성 -> Shader Graph로 조작 하면 된다.

    Shader 생성방법

     

    색에 대해서 프로그래머가 가질 마음가짐

    색은 숫자다. 이미지는 숫자다. 숫자는 데이터다. 데이터로 이미지를 표현한다. 

    예를 들어서 128 x 128 크기의 이미지를 표현 하는 방식은 2차원 배열을 사용해 각 픽셀 생삭을 저장 시키는 것이다.(C#문법 강의에서 그림 그렸던 것과 같은 느낌) 

    튜터님 제공)특강 내용사진

     

    하지만 이러한 방법은 데이터 사용이 크기 때문에 압축을 해줘야 한다고 한다. 

     

    위와 같은 이미지를 출력 할 경우에 1,1,1 배열을 만들고 128이 담긴 int를 곱해주는 방법으로 압축을 한다고 하는데..., 그리고 또 RGB 압축 하는 방법은 AAAABBCCCCCDDD 이거를 A4B2C5D3 이런 식으로 압축...,RGB는 Vector3라고 한다..

    사진 쓰게 해주셔서 감사합니다 튜터님.

     

    아무튼 이렇게 해서 그림을 효율적으로 저장 한다고 한다. RGBA = Red Green Blue Alpha 그리고 숫자를 글자로 표현 하는 방법은 255/255/255, fffff, 111 등인데 유니티가 1,1,1을 사용 하는 이유는 짧기 때문이라고 한다.

     

    프로그래머는 색을 숫자로 봐야 한다고 한다. 프로그래머 안 할래

     

     

    렌더링 파이프라인

    그래픽 데이터를 처리 하여 화면에 이미지를 렌더링 하는 과정을 말한다. 

     

    Rendering Pipeline의 과정 ( 컴퓨터가 화면에 그림을 그리는 과정 )

    1. Vertex Shader -> 각 정점의 위치를 계산 한다고 한다. 

    점을 찍어서 삼각형과 같은 도형을 만들고 그걸로 또 다른 모양을 만든다. 이 과정으로 모델을 만든다.

    찍고 도형 만들고 도형으로 모델 만드는 과정을 Vertex Shaer

     

    2. M.V.P -> 모델좌표(기본적으로 모델을 그리는 좌표는 0,0,0이라고 한다. 그곳에서 모델을 만듦)에서 월드 좌표로 변환 하는 것을 M, 월드 좌표에서 뷰 좌표로 변환 하는 것이 V, 뷰 좌표를 투영 좌표로 변환 하는 과정이 P라고 한다. (카메라 좌표를 클립 공간으로 변환 하여 원근감을 준다고 함.)

     

    이 위치를 배치 해주는 과정을 M.V.P라고 한다. 

     

    3. 레스터라이저 : 3D 좌표를 2D 화면에 맞게 변환 하는 과정이라고 한다. / 모니터는 2D니까 .,

     

    4. Fregment Shader : 각 픽셀들의 색을 넣어주는 과정이라고 한다. 

     

    이 과정을 거쳐서 GPU는 최종 이미지를 화면에 갖다 주게 된다. 면접에 자주 나오는 유형이라고 한다. 

     

     

    PBR 렌더링

    물리 기반 렌더링이란 뜻( Physically Based Rendering ), 실제 빛의 물리적 특성을 기반으로 하여 물체의 표면을 현실감 있게 렌더링 하는 기술이라고 한다. 

     

    유니티에서 PBR 렌더링을 사용 하면 빛에 대한 퀄리티를 높일 수 있다고 한다. 

     

    PBR 렌더링의 속성들 

    이건 셰이더의 속성인데 PBR과 거의 같다.

     

    + Base Color : 물체의 기본 색상이다.

     

    + Normal : 표면의 미세한 굴곡을 나타내는 노멀 맵이라고 한다. 

    빛은 반사 될 때 정방향 반사가 되는데 표면에 굴곡에 따라서 빛의 반사각도가 달라진다. 빛의 반사 되는 각도에 따라서 굴곡 졌네 라는 것을 인지. 그런데 지면을 울퉁불퉁 하게 해서 빛을 반사하게 하면 비효율적이라고 한다. 그래서 빛의 반사정도를 저장 한 것이 Normal이다. Normarl의 기본 색은 파란색인데 왜 파란색이냐,

     

    + Metallic : 금속성 재질의 정도를 나타낸다. 이건 사진을 봐야 안다. 

    메탈릭 없는 거
    메탈릭 적용한 거
    참고사진

    직접 해보면 어떤 효과들인지 쉽게 알 수 있다.

     

    + Smoothness / Roughness : 각각 표면의 거칠기, 매끄러움을 나타낸다. 

    튜터님 제공사진)거칠기와 메탈릭의 차이

     

    + Emission : 물체가 자체적으로 빛을 발산 하는 정도를 나타낸다. 

    원기옥 같은 연출 가능. 반짝 반짝 하는 연출 가능. 우주비행기 같은 것들이 특정 부분이 레이저 반짝반짝 할 때 연출 가능.

    참고사진

     

    + Ambient Occlusion(AO) : 주변 광 차폐 효과를 나타낸다고 한다. AO라는 개념

     

     

    Shader Graph란 

    유니티에서 셰이더를 시각적으로 편집 할 수 있는 툴이다. 복잡한 셰이더를 노드 기반 인터페이스를 사용 해서 쉽게 만들 수 있다. 

    무슨 게임 화면 같다..

     

    여기서 코드에 쓰는 변수처럼 변수를 넣어줄 수 있고 그 변수들에 값을 줘서 색을 적용 할 수 있다. 왼 쪽에 + 눌러서 변수 추가 가능. 거기에 값을 넣고 Base Color에 연결 해주면 된다. 더하기, 빼기, 곱하기 기능들을 주로 이용 하고 그게 거의 다라고 한다. 

    참고영상

     

    변수 하나 만들고 더하기 기능 추가해서 변수 두개 더하고 거기에 또 곱하고 나중에 Base Color로 연결 하는 방식으로 만드는 것 같다. 

    튜터님이 보여준 셰이더. 복잡해 보인다..

     

    셰이더 그래프의 장점

    1. 시각적 편집이 가능 : 코드로 작성 하지 않고도 셰이더를 직관적으로 편집 할 수 있다고 한다. 원래는 코드로써 매우 복잡하게 사용을 했어야 했다고 한다. 

    2. 디버깅이 용이하다 : 각 노드의 출력을 실시간으로 확인 할 수 있어서 디버깅에 용이.

    3. 재사용성 : 노드를 재활용 하여 셰이더의 일부를 다른 셰이더에서 활용 할 수 있다고 한다. 

     

    이 또한 면접 질문에 많이 나온다고 한다. 

     

     

    드로우 콜(Draw Call)

    CPU가 GPU에게 그래픽 작업을 수행 하도록 지시 하는 명령을 말한다. 드로우 콜이 호출 되면 GPU는 다음 단계를 거쳐서 작업을 수행 한다. 

     

    1. Vertex Processing : 버텍스 셰이더를 통해 정점 데이터를 만듦. 

    2. Primitive Assembly : 정점들을 삼각형 등 기본 도형으로 구성

    3. Rasterization : 3D 도형이 2D픽셀로 변환. (모니터에 비추기 위해서?)

    4. Fragment Processing : 색상 넣어주기 

    5. Output Merger : 최종 Pixel 데이터를 프레임 버퍼에 저장한다. 

     

    이 과정을 거쳐서 CPU에게 그림을 갖다 준다고 한다. 

     

     

    유니티의 렌더링 방식 

    + Built - in Rendering Pipeline : 기본 제공 되는 파이프라인이다. 설정이 간단하고 다양한 프로젝트에 사용.

    + URP(Universal Render Pipeline) : 성능과 품질을 균형 있게 제공하는 렌더링 파이프라인으로, 모바일과 PC등 다양한 플랫폼에 적합 하다고 한다. 

    + HDRP(High Definition Render Pipeline) : 고사양 PC와 콘솔을 위한 고품질 렌더링 파이프라인으로, 현실적인 그래픽 표현에 적합하다고 한다. 

    강의 내용 사진

     

    URP와 HDRP는 컴퓨터 사양이 좋지 않을 때 성능적인 문제로 좋지 않은 대우를 받았을 때가 있었다고 한다. 하지만 요즘은 컴퓨터들이 좋아져서 주로 URP가 쓰인다고 한다. 프로젝트 생성 할 때 URP로 만들면 된다고 함.

     

    HDRP는 고품질을 구현 할 때 사용 한다고 하는데 굳이 유니티로 그런 걸 하지 않고 언리얼을 쓰는 게 낫다고 한다. 그래서 거의 실제 그래픽 같은 건 하지 않는다고 한다. 최적화가 어려움.

    프로젝트를 만들 때 렌더링방식을 선택 할 수 있는 모습.

     

    이제 우리는 유니티 프로젝트를 만들 때 무슨 2D, 3D를 선택 해야 하는지 깨달았다.

     

     

    GPU와 VRAM

    그렇다면 RAM이 성능이 좋아야 하나라는 질문이 있었다. 

     

    셰이더 연산은 GPU가 처리를 하기 때문에 VRAM(GPU가 사용 하는 RAM)을 사용해서 GPU가 좋아야 한다고 한다. 

    풀 같은 것들이 움직일 때 우리는 그 오브젝트를 움직이게 함으로써 연출을 할 수 있지만, 이미지 데이터를 움직여서도 구현이 가능하다고 한다. 그렇게 하면 CPU의 부담을 나눌 수가 있게 되고 성능도 최적화 할 수도 있다고 한다. 

    물체의 색상 변화, 등등 애니메이션 효과로 구현 하게 되면 CPU 대신 GPU를 사용 해서 CPU의 부담을 줄일 수 있다고 한다. 성능이 최적화 되는 것은 애매하다? 적절히 분리 해줘야 한다고 한다.

     

     

    그래서 셰이더란 무엇이냐. 

    그래픽 데이터를 처리하여 화면에 이미지를 렌더링하는 역할을 해서, 현실감 있는 그래픽을 구현하고, 다양한 시각적 효과를 적용할 수 있다고 한다., 

    셰이더를 배우고나니 어떻게 했는지 보인다. 메탈릭과 황금색을 적용한것으로 추정.
    셰이더의 예시들

     

    지금은 일단 구체적인 색상 조절과 반짝이고 빛나고 번쩍번쩍 하고 그런 걸 연출을 하려면 해야한다.. 라고 알고 있자!

    ex) 롤 존야, 레이저, 원기옥 등등등. 그리고 투명도 조절을 통해 손가락부터 투명해지게 하는 것도 연출 가능. 그리고 알베도 기능을 사용하여 팀마다 색 다르게 가능(스타 유닛들 판마다 색 바뀌는 거)

     

    어렵게 생각 하면 안 된다. 쉽게쉽게.., 반짝반짝이게 하려면 셰이더 추가 해서 광택 효과 집어 넣고 코드로 0~1 값 조절 하면 되는구나~ 라고 알고 있자.

     

    '공부 기록' 카테고리의 다른 글

    24년 6월 20일 TIL  (0) 2024.06.20
    24년 6월 19일 TIL  (0) 2024.06.19
    24년 6월 16일 TIL  (0) 2024.06.17
    24년 6월 14일 TIL  (0) 2024.06.14
    24년 6월 13일 TIL  (0) 2024.06.13
Designed by Tistory.