Cg(프로그래밍 언어)
Cg (programming language)가족 | 음영어 |
---|---|
개발자 | nVIDIA, 마이크로소프트 |
방언 | |
Cg, HLSL, Playstation Shading Language | |
영향을 받은 | |
C, 렌더맨 음영 언어 | |
영향받은 | |
GLSL |
Cg(C for Graphics)와 HLSL(High-Level Shader Language)은 Nvidia와 Microsoft가 쉐이더를 프로그래밍하기 위해 개발한 고급 음영 언어에 부여한 두 가지 이름이다.Cg/HLSL은 C 프로그래밍 언어를 기반으로 하며, 동일한 코어 구문을 공유하지만 C의 일부 특징을 수정하고 새로운 데이터 유형을 추가해 Cg/HLSL을 그래픽 처리 유닛 프로그래밍에 보다 적합하게 만들었다.[1][2]
Cg/HLSL 언어에는 DirectX 또는 OpenGL을 출력하는 Nvidia Cg 컴파일러(cgc)와 DirectX 셰이더를 바이트코드 형식으로 출력하는 Microsoft HLSL의 두 가지 주요 분기가 있다.[3][4]Nvidia의 cgc는 2012년에 더 이상 사용되지 않았으며 추가 개발이나 지원을 받을 수 없었다.[5]
HLSL 셰이더는 2D와 3D 컴퓨터 그래픽 모두에서 많은 특수 효과를 가능하게 할 수 있다.Cg/HLSL 언어는 원래 정점 쉐이더와 픽셀 쉐이더에 대한 지원만 포함했지만, 다른 유형의 셰이더도 점차 도입되었다.
- DirectX 10(Shader Model 4)과 Cg 2.0은 지오메트리 쉐이더를 도입했다.[6]
- DirectX 11(Shader Model 5)은 컴퓨팅 셰이더(GPGPU)와 테셀레이션 셰이더(hull 및 도메인)를 도입했다.후자는 Cg 3.1에 수록되어 있다.
- DirectX 12(Shader Model 6.3)는 레이 추적 쉐이더(레이 생성, 교차로, 비트 /클로스 히트/ 미스)를 도입했다.
배경
그래픽 하드웨어의 기술적 진보로 인해 3D 그래픽 프로그래밍의 일부 영역은 상당히 복잡해졌다.프로세스를 간소화하기 위해 정점 및 픽셀 셰이더를 사용하여 렌더링 파이프라인을 수정할 수 있는 기능 등 그래픽 카드에 새로운 기능이 추가됐다.
초기에는 정점과 픽셀 쉐이더를 그래픽 처리 장치의 조립 언어만으로 매우 낮은 수준으로 프로그래밍했다.비록 어셈블리 언어를 사용하는 것이 프로그래머에게 코드와 유연성에 대한 완전한 통제권을 주었지만, 그것은 사용하기가 꽤 어려웠다.GPU 프로그래밍을 위해서는 휴대성이 좋고 수준 높은 언어가 필요했기 때문에 이러한 문제를 극복하고 셰이더 개발을 쉽게 하기 위해 Cg를 만들었다.
Cg over Assembly를 사용하면 다음과 같은 이점이 있다.
- 하이 레벨 코드는 어셈블리 코드보다 학습, 프로그래밍, 읽기 및 유지보수가 더 쉽다.
- cg 코드는 일반적으로 하드웨어와 그것이 쓰는 플랫폼에 따라 달라지는 조립 코드와는 달리 광범위한 하드웨어와 플랫폼으로 이동 가능하다.
- Cg 컴파일러는 코드를 최적화할 수 있고 조립 시 오류가 발생하기 쉬운 낮은 수준의 작업을 자동으로 수행할 수 있다.
언어
데이터 유형
Cg에는 6가지 기본 데이터 유형이 있다.그 중 일부는 C와 동일하고, 다른 것들은 특히 GPU 프로그래밍을 위해 추가된다.이러한 유형은 다음과 같다.
- 부동 소수점 - 32비트 부동 소수점 번호
- 절반 - 16비트 부동 소수점 번호
- int - 32비트 정수
- 고정 - 12비트 고정 지점 번호
- bool - 부울 변수
- 샘플러* - 텍스처 객체를 나타냄
Cg는 또한 float3와 float4x4와 같은 기본 데이터 유형을 기반으로 하는 벡터 및 매트릭스 데이터 유형을 특징으로 한다.이러한 데이터 유형은 3D 그래픽 프로그래밍을 다룰 때 매우 흔하다.Cg는 또한 구조체 및 배열 데이터 유형을 가지고 있으며, 이는 C등가물과 유사한 방식으로 작동한다.
연산자
Cg는 C의 공통 산술 연산자, 벡터 및 매트릭스 데이터 유형의 등가 산술 연산자, 공통 논리 연산자 등 광범위한 연산자를 지원한다.
기능 및 제어 구조
Cg는 if/else, while 및 for와 같은 기본 제어 구조를 C와 공유한다.함수를 정의하는 방식도 비슷하다.
의미론
전처리기
Cg는 많은 C 전처리기 지침과 그것의 매크로 확장 시스템을 구현한다.그것은 구현한다.#include
.[7]
HLSL 특징
- 네임스페이스
- 주석
환경
컴파일 대상
cg 프로그램은 서로 다른 기능을 가진 GPU를 나타내는 서로 다른 셰이더 프로파일을 위해 구축된다.[8]이러한 프로파일은 무엇보다도 각 셰이더에 얼마나 많은 지침이 있을 수 있는지, 사용할 수 있는 레지스터 수가 얼마나 되는지, 셰이더가 사용할 수 있는 리소스의 종류를 결정한다.프로그램이 맞다고 해도 프로파일 작업을 하기에는 너무 복잡할 수 있다.[7]
프로필과 셰이더 유형의 수가 증가함에 따라 마이크로소프트는 "쉐이더 모델"이라는 용어를 사용하여 GPU 세대에서 발견된 프로필 세트를 그룹화하도록 전환했다.[9]Cg는 Shader Model 5.0까지의 일부 새로운 프로파일과 glsl 또는 hlsl로의 변환을 지원한다.[8]
픽셀 셰이더 버전 | 1.0~1[10].3 | 1.4[10] | 2.0[10][11] | 2.0a[10][11][12] | 2.0b[10][11][13] | 3.0[10][14] | 4.0[15] 4.1[16] 5.0[17] |
---|---|---|---|---|---|---|---|
종속 텍스처 한계 | 4 | 6 | 8 | 무제한 | 8 | 무제한 | 무제한 |
텍스처 지시 한계 | 4 | 6*2 | 32 | 무제한 | 무제한 | 무제한 | 무제한 |
포지션 레지스터 | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 네 | 네 |
지침 슬롯 | 8+4 | 8+4 | 32 + 64 | 512 | 512 | ≥ 512 | ≥ 65536 |
실행 지침 | 8+4 | 6*2+8*2 | 32 + 64 | 512 | 512 | 65536 | 무제한 |
텍스쳐가 빠져 있음 | 4 | 4 | 4 | 무제한 | 4 | 무제한 | 무제한 |
보간 레지스터 | 2 + 4 | 2 + 6 | 2 + 8 | 2 + 8 | 2 + 8 | 10 | 32 |
명령어 포식 | 아니요. | 아니요. | 아니요. | 네 | 아니요. | 네 | 아니요. |
인덱스 입력 레지스터 | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 네 | 네 |
온도 레지스터 | 2 | 6 | 12대 32 | 22 | 32 | 32 | 4096 |
상수 레지스터 | 8 | 8 | 32 | 32 | 32 | 224 | 16×4096 |
임의 스위즐링 | 아니요. | 아니요. | 아니요. | 네 | 아니요. | 네 | 네 |
그라데이션 지시사항 | 아니요. | 아니요. | 아니요. | 네 | 아니요. | 네 | 네 |
루프카운트 레지스터 | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 네 | 네 |
면 레지스터(양면 조명) | 아니요. | 아니요. | 아니요. | 아니요. | 네 | 네 | 네 |
동적 흐름 제어 | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 예(24) | 예(64) |
비트 연산자 | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 네 |
네이티브 인테거스 | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 아니요. | 네 |
- PS 1.0 — 공개되지 않은 3dfx Ramble, DirectX 8.
- PS 1.1 — GeForce 3, DirectX 8.
- PS 1.2 — 3Dlabs Wildcat VP, DirectX 8.0a.
- PS 1.3 — GeForce 4Ti, DirectX 8.0a.
- PS 1.4 — Radeon 8500-9250, Matrox Parhelia, DirectX 8.1.
- Shader 모델 2.0 — Radeon 9500-9800/X300-X600, DirectX 9.
- 쉐이더 모델 2.0a — GeForce FX/PCX 최적화 모델, DirectX 9.0a.
- 쉐이더 모델 2.0b — Radeon X700-X850 쉐이더 모델, DirectX 9.0b.
- Shader 모델 3.0 — Radeon X1000 및 GeForce 6, DirectX 9.0c.
- Shader 모델 4.0 — Radeon HD 2000 및 GeForce 8, DirectX 10.
- Shader 모델 4.1 — Radeon HD 3000 및 GeForce 200, DirectX 10.1.
- Shader Model 5.0 — Radeon HD 5000 및 GeForce 400, DirectX 11.
- Shader Model 5.1 — WDDM 2.0을 사용하는 GCN 1+, Fermi+, DirectX 12(11_0+)
- Shader 모델 6.0 — WDDM 2.1을 사용하는 GCN 1+, Kepler+, DirectX 12(11_0+)
- Shader 모델 6.1 — WDDM 2.3을 사용하는 GCN 1+, Kepler+, DirectX 12(11_0+)
- Shader Model 6.2 — WDDM 2.4를 사용하는 GCN 1+, Kepler+, DirectX 12(11_0+)
- Shader 모델 6.3 — WDDM 2.5를 사용하는 GCN 1+, Kepler+, DirectX 12(11_0+)
- Shader 모델 6.4 — WDDM 2.6을 사용하는 GCN 1+, Kepler+, Skylake+, DirectX 12(11_0+)
- Shader 모델 6.5 — WDDM 2.7을 사용하는 GCN 1+, Kepler+, Skylake+, DirectX 12(11_0+)
"32 + 64"는 "32 텍스쳐 지침 및 64개의 산술 지침"을 의미한다.
정점 셰이더 버전 | VS 1.1[18] | VS 2.0[11][18][19] | VS 2.0a[11][18][19] | VS 3.0[14][18] | VS 4.0[15] VS 4.1[20] VS 5.0[17] |
---|---|---|---|---|---|
지침 슬롯 수 | 128 | 256 | 256 | ≥ 512 | ≥ 65536 |
실행된 최대 명령 수 | 128 | 1024 | 65536 | 65536 | 무제한 |
명령어 포식 | 아니요. | 아니요. | 네 | 네 | 네 |
온도 레지스터 | 12 | 12 | 16 | 32 | 4096 |
# 상수 레지스터 | ≥ 96 | ≥ 256 | 256 | ≥ 256 | 16×4096 |
정적 흐름 제어 | 아니요. | 네 | 네 | 네 | 네 |
동적 흐름 제어 | 아니요. | 아니요. | 네 | 네 | 네 |
동적 흐름 제어 깊이 | 해당 없음 | 해당 없음 | 24 | 24 | 64 |
정점 텍스처 가져오기 | 아니요. | 아니요. | 아니요. | 네 | 네 |
텍스처 샘플러 수 | 해당 없음 | 해당 없음 | 해당 없음 | 4 | 128 |
지오메트리 인스턴스화 지원 | 아니요. | 아니요. | 아니요. | 네 | 네 |
비트 연산자 | 아니요. | 아니요. | 아니요. | 아니요. | 네 |
고유 정수 | 아니요. | 아니요. | 아니요. | 아니요. | 네 |
표준 라이브러리
C에서와 같이 Cg/HLSL은 GPU 프로그래밍의 공통 작업에 대한 일련의 기능을 특징으로 한다.일부 함수에는 수학 함수 복근, 죄와 같이 C에 동등 항목이 있는 반면, 텍스처 매핑 함수 tex1D, tex2D와 같은 GPU 프로그래밍 작업에 특화된 함수도 있다.
Cg 런타임 라이브러리
cg 프로그램은 정점과 픽셀 쉐이더일 뿐 나머지 렌더링 과정을 처리하는 지원 프로그램이 필요하다.Cg는 OpenGL 또는 DirectX의 두 가지 그래픽 API와 함께 사용할 수 있다.각각은 현재의 Cg 셰이더 설정, 패스 파라미터, 그런 작업 등 Cg 프로그램과 통신할 수 있는 자체 Cg 기능 세트를 가지고 있다.
Cg source to assembly code를 컴파일할 수 있을 뿐만 아니라, Cg 런타임은 지원 프로그램의 실행 중에 쉐이더를 컴파일할 수 있는 기능도 가지고 있다.이를 통해 런타임은 프로그램이 현재 실행 중인 하드웨어에 사용할 수 있는 최신 최적화를 사용하여 셰이더를 컴파일할 수 있다.그러나 이 기법은 셰이더의 소스 코드를 컴파일러에 일반 텍스트로 사용할 수 있도록 하여 프로그램 사용자가 셰이더의 소스 코드에 접근할 수 있도록 한다.일부 개발자들은 이것을 이 기술의 주요 단점으로 보고 있다.
셰이더의 소스 코드가 노출되는 것을 방지하고 하드웨어별 최적화 중 일부를 유지하기 위해 프로필 개념이 개발되었다.셰이더는 다른 그래픽 하드웨어 플랫폼에 적합하도록 컴파일할 수 있다(프로파일에 따라).지원 프로그램을 실행할 때, 그 프로파일에 따라 최고/최적화된 셰이더가 로드된다.예를 들어 복잡한 픽셀 셰이더를 지원하는 그래픽 카드의 프로필과 최소 픽셀 셰이더만 지원하는 그래픽 카드의 프로필이 있을 수 있다.이러한 각 프로필에 대해 픽셀 셰이더를 생성함으로써 지원 프로그램은 강력한 시스템에서 화질을 희생시키지 않고 지원되는 하드웨어 플랫폼의 수를 확대한다.'
컴파일러와 방언
cg 사투리는 지금까지 엔비디아의 cg 툴킷의 형태로 컴파일러를 단 한 개만 가지고 있었다.
마이크로소프트는 HLSL을 위한 컴파일러 2개를 출시했다.원래 컴파일러는 2015년까지 지원되는 비공개 소스 FXC(Effect-Compiler)이다.새로운 HLSL 기능에 대한 지원으로 오픈 소스 LLVM 기반 DXC(DirectXShaderCompiler)를 선호하지 않았다.[21]두 컴파일러 모두 바이트코드를 생성한다: 이전 FXC가 DXBC를 사용한 반면, DXC는 현재 DXIL을 사용한다. DXC 또한 SIR-V 바이트코드를 방출할 수 있다.[22]
Khronos Group은 또한 Glslang의 프런트 엔드 형태로 그들의 GLSL-to-SPIR_V 컴파일러인 LLVM 기반 HLSL 컴파일러를 작성했다.SPR-V에 대한 지원은 쉐이더가 더 이상 DirectX 스택으로 제한되지 않고 교차 플랫폼이 될 수 있다는 것을 의미한다.[23]이 작업은 이전에 HLSL2GLSL과 같은 소스 레벨 변환기에 의해 수행되었지만, 결과 코드는 종종 비대해진다.[24]
파생어군
PlayStation Shading Language는 Cg/HLSL을 기반으로 한다.[25]
RefreshadeFX 음영 언어 역시 Cg/HLSL을 기반으로 한다.RefreshadeFX로 작성된 셰이더는 OpenGL, DX 또는 벌칸으로 컴파일되어 게임에 주입되어 후처리 필터 역할을 한다.[26]
예
샘플 Cg 꼭지점 셰이더
// 정점 입력 구조상의 VertIn { 플로트4 양치류 : 포지션; 플로트4 색을 칠하다 : COLOR0; }; // 정점 출력 구조상의 VertOut { 플로트4 양치류 : 포지션; 플로트4 색을 칠하다 : COLOR0; }; // 꼭지점 셰이더 주 항목 VertOut 본래의(VertIn 인, 획일적인 4x4 플로트 모델ViewProj) { VertOut 아웃; 아웃.양치류 = 뽕을 먹이다(모델ViewProj, 인.양치류); // 출력 좌표 계산 아웃.색을 칠하다 = 인.색을 칠하다; // 입력 색상을 출력에 복사 아웃.색을 칠하다.z = 1.0f; // 파란색 색상 성분 = 1.0f 돌아오다 아웃; }
Cg 또는 HLSL을 사용하는 응용 프로그램 및 게임
- 3DVIA Virtools
- 어도비 포토샵
- 마야[27]
- 전장2길
- 카푸 엔진
- 크리스털 스페이스
- 돌피니티 레이서
- 지구의 특수부대 - 반감기 모형
- 적지: 지진 전쟁
- 둠 3 BFG 에디션
- EON Professional™/EON Reality의 Ultra™
- 이연 퓨전
- 파 크라이
- 가르샤프:몬스터 슬레이어
- GLScene
- 건 메탈
- 히트맨: 블러드 머니
- 이루릴리히트 엔진
- 리그 오브 레전드
- 가벼운 발광 3D 엔진
- 라이트웨이브 11[28].6
- 뮤비 폭로
- 오그레
- 오픈에무
- 판다3D
- PCSX2
- 플레이스테이션 3
- 레트로아치
- R.U.S.E.
- 스네스9x
- 유니티 게임 엔진[29]
- 언리얼 엔진
참고 항목
참조
- ^ "Fusion Industries :: Cg and HLSL FAQ ::". 24 August 2012. Archived from the original on 24 August 2012.
- ^ "The Cg Tutorial - Chapter 1. Introduction". developer.download.nvidia.cn.
- ^ "Writing HLSL Shaders in Direct3D 9 (Windows)". msdn.microsoft.com.
- ^ "Cg FAQ". NVIDIA DesignWorks. 8 March 2011. Retrieved 25 May 2017.
- ^ "Cg Toolkit NVIDIA Developer". 8 March 2011.
- ^ https://developer.download.nvidia.com/cg/Cg_2.0/2.0.0012/Cg-2.0_Jan2008_ReleaseNotes.pdf
- ^ a b Mark J. Kilgard, Cg in Two Page, 2003.
- ^ a b "Cg Profile Documentation". Nvidia developer.
- ^ "Shader Models vs Shader Profiles - Win32 apps". docs.microsoft.com.
- ^ a b c d e f "Pixel Shader Differences". msdn.microsoft.com. 2011-02-08.
- ^ a b c d e Peeper, Craig (2004-03-15). "Microsoft DirectX High Level Shader Language (HLSL)" (PPT). microsoft.com. pp. 5–8, 24–25.
- ^ Shimpi, Anand Lal. "NVIDIA Introduces GeForce FX (NV30)".
- ^ Wilson, Derek. "ATI Radeon X800 Pro and XT Platinum Edition: R420 Arrives".
- ^ a b 쉐이더 모델 3.0, NVIDIA Developer Technology Group, 2004.
- ^ a b Direct3D 10 System, David Blythe, Microsoft Corporation, 2006.
- ^ "Registers - ps_4_1 (Windows)". msdn.microsoft.com.
- ^ a b "Registers - ps_5_0 (Windows)". msdn.microsoft.com.
- ^ a b c d "Vertex Shader Differences". msdn.microsoft.com. 2011-02-08.
- ^ a b Shimpi, Anand Lal. "NVIDIA Introduces GeForce FX (NV30)".
- ^ "Registers - vs_4_1 (Windows)". msdn.microsoft.com.
- ^ "Porting from FXC to DXC". GitHub.
- ^ "microsoft/DirectXShaderCompiler: This repo hosts the source for the DirectX Shader Compiler which is based on LLVM/Clang". Microsoft. 21 October 2020.
- ^ "glslang: Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator". The Khronos Group. 21 October 2020.
- ^ 맷 터너.유튜브 영상.
- ^ Stenson, Richard; Ho, Chris. "PlayStation Shading Language for PS4". GDC Europe 2013.
- ^ "ReShade FX shading language". GitHub. 15 February 2022.
- ^ "Maya Cg Plug-in NVIDIA".
- ^ "LightWave - 11.6 Features Overview".
- ^ "Unity - Manual: Writing Shaders".
추가 읽기
- Randima Fernando, Mark J. Kilgard, The Cg Tutorial: 프로그램 가능한 실시간 그래픽에 대한 최종 가이드 애디슨 웨슬리 프로페셔널, ISBN 0-321-19496-9
- 랜디마 페르난도, GPU 젬스: 실시간 그래픽을 위한 프로그래밍 기법, 팁 및 요령, 애디슨-웨슬리 프로페셔널, ISBN 0-321-22832-4
- 윌리엄 R.마크, R.Steven Glanville, Kurt Akeley, Mark J. Kilgard, Cg: A System for Programming Graphics Hardware in a C-like Language, Process of SIGRAPH 2003, doi:10.1145/1201775.882362
외부 링크
- cgc-opensrc - nvidia의 오픈 소스 컴파일러용 미러, 2002
- 일부 필수 재료(예: 설계 용지)는 Siggraph 2005의 본 코스 노트에서 수집된다.
- Nvidia 호스트 자료:
- NeHe Cg 정점 셰이더 자습서
- 에뮬레이터에서 사용하는 Cg Shader 표준에 대한 문서
- 2014년 크로스 플랫폼 셰이더스의 아라스 프랑케비치우스.