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페이지~ 랜더링 실습, 컴퓨터 쉐이딩 실습 다음 주에 이어서 진행.
'대학생활 > 수업' 카테고리의 다른 글
게임레벨디자인기초 9주차 - 엑셀 사용 기초 (0) | 2023.05.11 |
---|---|
게임음악작곡법 9주차 - 중간고사 시험 (0) | 2023.05.11 |
게임기획크리틱 10주차 - 데이터 디자인 (0) | 2023.05.09 |
게임그래픽프로그래밍 9주차 - 기존 내용 복습 및 중간고사 가채점 (0) | 2023.05.08 |
게임네트워크프로그래밍 9주차 - 관계데이터모델의 복습, 트랜잭션, 데이터베이스프로그래밍, 턴 방식 게임 학습 (0) | 2023.05.08 |