Cg(프로그래밍 언어)

Cg (programming language)
Cg/HLSL
HLSL-Examples-1.PNG
여러 개의 다른 2D HLSL 셰이더를 포함하는 장면.불상의 왜곡은 순수하게 물리적으로 이루어지며, 그 옆에 놓인 직사각형 프레임의 질감은 색의 강도에 근거한다.배경의 사각형이 변형되고 회전되었다.전면의 물의 부분적인 투명성반사작용은 마침내 전체 장면에 적용된 셰이더에 의해 추가된다.
가족음영어
개발자nVIDIA, 마이크로소프트
방언
Cg, HLSL, Playstation Shading Language
영향을 받은
C, 렌더맨 음영 언어
영향받은
GLSL

Cg(C for Graphics)와 HLSL(High-Level Shader Language)은 NvidiaMicrosoft쉐이더프로그래밍하기 위해 개발한 고급 음영 언어에 부여한 두 가지 이름이다.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 언어는 원래 정점 쉐이더픽셀 쉐이더에 대한 지원만 포함했지만, 다른 유형의 셰이더도 점차 도입되었다.

배경

그래픽 하드웨어의 기술적 진보로 인해 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]

HLSL 픽셀 쉐이더의 비교
픽셀 셰이더 버전 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.1GeForce 3, DirectX 8.
  • PS 1.23Dlabs Wildcat VP, DirectX 8.0a.
  • PS 1.3GeForce 4Ti, DirectX 8.0a.
  • PS 1.4Radeon 8500-9250, Matrox Parhelia, DirectX 8.1.
  • Shader 모델 2.0 — Radeon 9500-9800/X300-X600, DirectX 9.
  • 쉐이더 모델 2.0aGeForce FX/PCX 최적화 모델, DirectX 9.0a.
  • 쉐이더 모델 2.0bRadeon X700-X850 쉐이더 모델, DirectX 9.0b.
  • Shader 모델 3.0 Radeon X1000GeForce 6, DirectX 9.0c.
  • Shader 모델 4.0Radeon HD 2000GeForce 8, DirectX 10.
  • Shader 모델 4.1 — Radeon HD 3000GeForce 200, DirectX 10.1.
  • Shader Model 5.0 — Radeon HD 5000GeForce 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개의 산술 지침"을 의미한다.

HLSL 정점 쉐이더 비교
정점 셰이더 버전 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을 사용하는 응용 프로그램 및 게임

참고 항목

참조

  1. ^ "Fusion Industries :: Cg and HLSL FAQ ::". 24 August 2012. Archived from the original on 24 August 2012.
  2. ^ "The Cg Tutorial - Chapter 1. Introduction". developer.download.nvidia.cn.
  3. ^ "Writing HLSL Shaders in Direct3D 9 (Windows)". msdn.microsoft.com.
  4. ^ "Cg FAQ". NVIDIA DesignWorks. 8 March 2011. Retrieved 25 May 2017.
  5. ^ "Cg Toolkit NVIDIA Developer". 8 March 2011.
  6. ^ https://developer.download.nvidia.com/cg/Cg_2.0/2.0.0012/Cg-2.0_Jan2008_ReleaseNotes.pdf
  7. ^ a b Mark J. Kilgard, Cg in Two Page, 2003.
  8. ^ a b "Cg Profile Documentation". Nvidia developer.
  9. ^ "Shader Models vs Shader Profiles - Win32 apps". docs.microsoft.com.
  10. ^ a b c d e f "Pixel Shader Differences". msdn.microsoft.com. 2011-02-08.
  11. ^ 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.
  12. ^ Shimpi, Anand Lal. "NVIDIA Introduces GeForce FX (NV30)".
  13. ^ Wilson, Derek. "ATI Radeon X800 Pro and XT Platinum Edition: R420 Arrives".
  14. ^ a b 쉐이더 모델 3.0, NVIDIA Developer Technology Group, 2004.
  15. ^ a b Direct3D 10 System, David Blythe, Microsoft Corporation, 2006.
  16. ^ "Registers - ps_4_1 (Windows)". msdn.microsoft.com.
  17. ^ a b "Registers - ps_5_0 (Windows)". msdn.microsoft.com.
  18. ^ a b c d "Vertex Shader Differences". msdn.microsoft.com. 2011-02-08.
  19. ^ a b Shimpi, Anand Lal. "NVIDIA Introduces GeForce FX (NV30)".
  20. ^ "Registers - vs_4_1 (Windows)". msdn.microsoft.com.
  21. ^ "Porting from FXC to DXC". GitHub.
  22. ^ "microsoft/DirectXShaderCompiler: This repo hosts the source for the DirectX Shader Compiler which is based on LLVM/Clang". Microsoft. 21 October 2020.
  23. ^ "glslang: Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator". The Khronos Group. 21 October 2020.
  24. ^ 맷 터너.유튜브 영상.
  25. ^ Stenson, Richard; Ho, Chris. "PlayStation Shading Language for PS4". GDC Europe 2013.
  26. ^ "ReShade FX shading language". GitHub. 15 February 2022.
  27. ^ "Maya Cg Plug-in NVIDIA".
  28. ^ "LightWave - 11.6 Features Overview".
  29. ^ "Unity - Manual: Writing Shaders".

추가 읽기

외부 링크