본문 바로가기
대학생활/수업

게임프로그래밍고급 10주차 - Shader, HLSL, Kernel, Thread, Group

by se.jeon 2023. 5. 9.
728x90
반응형

Shader

3D Scene에서 Shading에 사용되는 작은 프로그램

 

Shading

음영, 3D Scene에서 물체/ 표면/ 폴리곤의 색상을 변경시키는 과정

표면을 기준으로 한 빛에 대한 각도, 빛과의 거리, 카메라 각도, 재질의 속성

- Flat Shading : Face 내에 같은 Shading 처리, 계단 현상

- Gouraud Shading : Face 내의 정점 별로 Shading 처리 후 bilinear interpolation 처리

- Phong Shading : Normal Vector를 보간하여 계산, 각 Pixel 별로 Normal Vector 다시 계산

 

Shader Language 종류

- CG (C for Graphics) : Nvidia에서 발표한 shader language. Direct3D와 OpenGL에서 동시 사용 가능.

- HLSL : MS에서 발표한 Shader language. Direct3D에서만 사용 가능.

- GLSL : OpenGL에서만 사용 가능, 크로스 플랫폼 지원.

 

Unity에서의 Shader Language

- 2019.4버전부터 명시적으로 HLSL 사용.

- 이전에는 CG를 사용했지만 더 이상 사용 안함.

- Windows 플랫폼 : HLSL 이용

- OpenGL, OpenGL-ES, Metal : HLSL이용한 후 HLSLcc 사용하여 변환 (GLSL, Metal, SPIR-V)

- Vertex & Fragment Shaders

- Surfce Shaders

- Fixed Function Shaders : 거의 사용 안함.

 

Vertex & Fragment Shaders

- Shader : Shader의 이름을 설정

- Properties : Material에서 확인 가능, Shader에서 지정할 변수 지정

- SubShader : Shader는 하나 이상 SubShader 지정 가능 (GPU 성능 고려)

- Pass : SubShader는 여러 개의 Pass로 구성

- CGProgram/EndCG

   - Vertex & Fragment Shader 내의 HLSL 코드 부분

 

Unity HLSL Snippet 학습.

- Vertex Shader

- Fragment Shader

- Geometry Shader

- Hull Shader

- Domain Shader

 

Default Vertex & Fragment Shader

CGPROGRAM
#pragma vertex vert		//1) Vertex shader는 함수 vert 이용
#pragma fragment frag		//2) Fragment Shader는 함수 frag 이용
// make fog work			//3) 다양한 안개 처리

#pragma multi_compile_fog	//4) 유니티에서 제공해 주는 Helper 함수 호출을 위해서 많이 사용.
#include "UnityCG.cginc"    	//   설치 폴더/Editor/Data/CGIncludes에 존재
v2f vert (appdata v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex); 	//1)world상의 한 점을 카메라의 Clip공간 안의 점으로 계산
    o.uv = TRANSFORM_TEX(v.uv, _MainTex); 	//2)정점의 U,V값을 계산
    
    UNITY_TRANSFER_FOG(o,o.vertex);
    return o;
}
fixed4 frag (v2f i) : SV_Target			//4) Fragment Shader의 출력 특성 의미
{						//   SV_Target : 출력 색상
    // sample the texture
    fixed4 col = tex2D(_MainTex, i.uv);		//3)정점의 U,V값과 Texture를 통해서 컬러값 얻기
    
    // apply fog
    UNITY_APPLY_FOG(i.fogCoord, col);
    
    return col;
}
ENDCG

Unity 실습 진행.

- Cube 하나 실행

- Assets > Create > Shader > Standard Surface Shader 생성

- Assets > Create > Material

- Material에 생성한 Surface Shader를 설정

- Material을 Cube에 적용

 

Surface Shader

기본적인 Vertex Shader의 내용을 자동으로 처리한다.

- PBR을 기반으로 구성되어져 있음.

- 자동으로 코드가 구성되어져 있으므로, 최적화에는 한계

- 자동으로 지원해주는 내용들이 많아서 공부하면서 하기에는 편리하다.

Properties
{
    _Color ("Color", Color) = (1,1,1,1)			//1) 색깔 값을 지정하게 한다.
    _MainTex ("Albedo (RGB)", 2D) = "white" {}		//2) Albedo Texture를 지정한다.
    _Glossiness ("Smoothness", Range(0,1)) = 0.5	//3) Glossiness 설정 0~1 사이의 실수값
    _Metallic ("Metallic", Range(0,1)) = 0.0		//4) Metallic 설정 0~1 사이의 실수값
}
void surf (Input IN, inout SurfaceOutputStandard o)
{
    // Albedo comes from a texture tinted by color
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;	//1) texture와 Color값 혼합
    o.Albedo = c.rgb;						//2) Albedo에 해당 Color 적용
    
    // Metallic and smoothness come from slider variables
    o.Metallic = _Metallic;					//3) Metallic : 금속성
    o.Smoothness = _Glossiness;					//4) Smoothness : 매끄러움
    o.Alpha = c.a;						//5) Alpha : 알파 값
}

HLSL 문법

- Direct3D 9 : Shader Model 3까지 지원.

- Direct3D 10 : Shader Model 5

- Direct3D 11 : Shader Model 5

- Direct3D 11.3 & Direct3D 12 : Shader Model 5.1

- Direct3D 12 : Shader Model 6

 

HLSL - Scalar Types

- bool : true and false

- int : 32bit signed integer

- uint : 32 bit unsigned integer

- dword : 32 bit unsigned integer

- half : 16 bit floating point value (-60,000 ~ 60,000)

- float : 32 bit floating point value

- double : 64 bit floating point value

- fixed : 11bit floating point value (-2~2사이, 1/256)

 

HLSL - Vector Types

- TypeComponents Name

- Vector <Type, Components> Name

   - Type : HLSL Scalar Type 설정

   - Components : 1~4까지의 차원 설정

 

HLSL - Matrix Types

- TypeComponents Name

- Matrix <Type, Components> Name

   - Type : HLSL Scalar Type 설정

   - Components : row 개수, column 개수 (1~4)

 

HLSL - ETC

- Array (배열) : 다차원 배열 가능

- Structure (구조체) : C언어 구조체 방식 (C++방식이 아님)

- typedef : C/C++와 동일한 방식

- 다양한 내장 함수를 지원 (삼각 함수, 수학 함수, 벡터 함수, 기타 함수)

 

HLSL - Properties

- Properties에 원하는 Texture2D, Color 등을 입력 기능 추가 가능

- Properties { Property [Property ...] } 형식을 지원

- Number & Sliders

- Colors & Vectors (Color는 0~1 사이의 값)

- Textures

 

HLSL - 단순 Color Shader

- Vertex & Fragment Shader를 이용해서 Color 값을 재질에 적용

- 불필요한 Texture, Fog 관련 코드 삭제

- Properties에 Color 설정

- Color값을 입력 받아서 Fragment Shader에 적용

- 지정된 값을 통해서 화면에 Color 값 설정

 

HLSL - Combine Texture & Color Shader

- Vertex & Fragment Shader를 이용해서 Texture, Color 재질에 적용

- 불필요한 Texture, Fog 관련 코드 삭제

- Properties에 Texture와 Color 설정

- Texture와 Color값 받기

- 2개의 값을 곱해서 화면에 출력해 보기

 

Compute Shader

- GPU를 이용한 병렬 처리를 통해서 동시에 많은 작업을 고속으로 처리하기 위해서 사용되는 Shader

- GPU를 이용해서 작업이 이루어지지만, 기타 다른 Shader와 다르게 렌더링 파이프라인을 이용하는 측면에서 다른 Shader와 차이가 존재한다.

- GPGPU(General Purpose GPU, 범용 GPU 계산) : GPU를 CPU처럼 쓸 수 있겠는가 하는 개념

- Unity의 Compute Shader (GPGPU 기술)와 유사한 개념 : CUDA, OpenCL, DirectCompute 등 존재

 

Unity Computer Shader

- 기존의 Shader와 유사하게 프로젝트의 Asset 파일로 존재

- Create > Shader > Compute Shader를 통해서 생성

- 파일 확장자 .compute

- DirectX11 스타일의 HLSL 언어로 구현

 

Kernel, Thread, Group

Kernel

- GPU에서 실행되는 하나의 프로세스, 코드상에서는 하나의 함수

- 최소 하나의 kernel 포함 필수

- Kernel 사용시 #pragma kernal 행 추가

Thread

- 커널을 실행하는 단위, 하나의 Thread가 하나의 Kernel을 실행

- Compute Shader를 통해서 다중 스레드를 이용해 커널 실행 가능

- Thread는 3차원(x, y, z)으로 하나의 그룹 구성

- (3, 2, 2) : 3x2x2 = 12개, (3, 3, 1) : 3x3x1 = 9개 스레드 실행

- 같은 차원의 Thread를 구성하더라도, 1차원이냐 2차원이냐에 따라서 병렬처리 때문에 스레드 구동 시 효율성의 차이 존재.

- Thread의 수는 최대 3차원까지 구성 가능

Group

- 동시에 Thread들을 실행하는 단위

- 같은 Group안에 속한 Thread들은 Group Thread라 칭함.

- Compute Shader는 여러 개의 Group들도 동시에 실행 가능

- Group은 Thread처럼 3차원으로 그룹 생성 가능.

 

Thread의 한계

- ShaderModel 4.x : x * y * z의 최대 값이 768이며, z의 차원의 최대값 1

- ShaderModel 5.0 : x * y * z의 최대 값은 1024이며, z의 차원의 최대값 64

Group의 한계

- x, y, z에 대해서 각각 최대값 65535

 

Unity Compute

- Kernel 함수 정의

- CPU와 GPU의 데이터 연동을 위한 Buffer와 변수 정의

- Kernel 함수 실행 Thread 수 지정 (numthreads을 이용)

- Kernel 함수 구현

 

22페이지~ 랜더링 실습, 컴퓨터 쉐이딩 실습 다음 주에 이어서 진행.

728x90
반응형