고급 셰이더 언어
1. 개요
고급 셰이더 언어(HLSL)는 Direct3D에서 프로그래밍 가능한 셰이더를 작성하기 위해 사용되는 고수준 언어이다. Direct3D 8의 어셈블리 언어 셰이더의 한계를 극복하기 위해 C/C++와 유사한 문법으로 개발되었으며, Direct3D 9에서 처음 도입되었다. HLSL은 버텍스 셰이더, 픽셀 셰이더, 지오메트리 셰이더, 컴퓨트 셰이더 등 다양한 파이프라인 스테이지를 프로그래밍하는 데 사용되며, 셰이더 모델에 따라 지원되는 기능이 다르다. HLSL은 C/C++와 유사한 문법을 가지면서도 그래픽스 프로그래밍에 특화된 기능들을 제공하며, 셰이더 모델의 발전에 따라 기능이 지속적으로 확장되고 있다. HLSL 프로그램은 주로 C++ 애플리케이션에서 Direct3D API를 사용하여 관리되며, DirectX, WPF, Direct2D 등 다양한 환경에서 활용된다.
-
셰이더 언어 -
GLSL
GLSL은 OpenGL에서 GPU를 프로그래밍하기 위한 셰이딩 언어이며, 렌더링 파이프라인을 제어하고, C 언어와 유사한 문법으로 셰이더 단계와 데이터 형식을 지원하며, 실시간 3D 그래픽 구현에 기여한다. -
셰이더 언어 -
Cg (프로그래밍 언어)
Cg는 엔비디아와 마이크로소프트가 GPU 프로그래밍을 위해 개발한 고수준 셰이딩 언어로, GLSL, HLSL과 유사하며 CUDA 환경에도 영향을 미쳤고 현재도 활용되고 있다. -
마이크로소프트 API -
윈도우 API
윈도우 API는 마이크로소프트 윈도우 운영 체제에서 응용 프로그램이 시스템 기능에 접근하도록 돕는 인터페이스 집합이며, 다양한 버전으로 발전해 왔고, 현재 Win32가 널리 사용되며, 유연성을 제공하지만 복잡하다는 단점을 보완하기 위해 다양한 래퍼 라이브러리가 개발되었다. -
마이크로소프트 API -
WinFS
WinFS는 마이크로소프트가 개발한 파일 시스템으로, 검색 기능 내장 및 메타데이터 관리를 통해 데이터 관리 효율성을 높이는 것을 목표로 했으나 별도 제품으로 출시되지는 못하고 핵심 기능들이 윈도우 비스타 이후 기술에 통합되었다. -
C 프로그래밍 언어 계열 -
C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. -
C 프로그래밍 언어 계열 -
펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
2. 개발 경위
Direct3D 7까지는 그래픽스 칩(GPU)에 탑재된 고정 파이프라인 및 하드웨어 기능을 활용하여 3D 그래픽스 장면을 구축했지만, 그래픽스 표현의 유연성을 향상시키기 위해 Direct3D 8에서는 프로그래밍 가능 셰이더가 탑재되었다。 이를 통해 그래픽스 애플리케이션 개발자가 그래픽스 렌더링 알고리즘을 소프트웨어로 커스터마이즈할 수 있게 되었다. 그러나 Direct3D 8에서 사용할 수 있는 셰이더 언어는 어셈블리 언어 (저수준 언어)였기 때문에 개발 효율성 및 프로그램 코드의 재사용성에 한계가 있었다. 이를 해소하기 위해 C/C++와 유사한 선언문과 제어문 등의 표기를 가능하게 한 고수준 언어 HLSL이 개발되었다. HLSL은 Direct3D 9에서 처음 도입되었으며, 이후에도 Direct3D와 함께 기능 확장이 계속되고 있다.
GDC 2016에서는 DirectX 12의 향후 발전, 그리고 새로운 차기 DirectX와 셰이더 모델 6의 개발에 관해 언급이 있었고, HLSL 언어 사양에도 큰 기능 추가가 예정되어 있다는 것이 발표되었다。 셰이더 모델 6.0에서는 Wave라고 불리는 Single instruction, multiple threads영어 스레드 그룹의 개념과 각 그룹 내 데이터 교환(셔플)을 위한 내장 명령이 도입되어, NVIDIA GPU의 Warp 및 AMD GPU의 Wavefront를 표준화했다。
3. 프로그래밍 가능 파이프라인 스테이지
HLSL로 프로그래밍 가능한 그래픽스 파이프라인 스테이지는 해당 다이렉트3D 버전 및 셰이더 모델에 따라 다르다.
컴퓨트 셰이더는 그래픽스 파이프라인과 독립적으로 동작시킬 수 있다.
버텍스 셰이더는 응용 프로그램에서 제공(입력)되는 각 버텍스에 대해 실행되며, 주로 객체 공간에서 시점 공간으로의 버텍스 좌표 변환, 텍스처 좌표 생성, 그리고 버텍스의 접선, 종법선, 법선 벡터와 같은 광선 계수 계산 등의 처리를 담당한다. 버텍스 셰이더를 통해 버텍스 그룹(삼각형의 경우 일반적으로 3개)이 입력될 때 출력 좌표는 해당 영역 내에서 화면상의 픽셀을 결정하기 위해 보간된다. 이 처리는 래스터화로 알려져 있다. 이러한 각 픽셀은 픽셀 셰이더를 통과하여 결과적으로 화면상의 각 점의 색상이 계산된다.
Direct3D 10/11/12 지원 하드웨어에서 Direct3D 10/11/12 인터페이스를 사용하는 애플리케이션은 버텍스 셰이더 스테이지 다음에 지오메트리 셰이더를 지정할 수도 있다. 지오메트리 셰이더는 래스터화 전에 프리미티브의 증감 및 종류 변경을 수행할 수 있다.
Windows 10 2018년 10월 업데이트(버전 1809)에서는 DirectX Raytracing영어(DXR)이라고 불리는 실시간 레이 트레이싱 기술이 구현되었다。DXR을 하드웨어 수준에서 지원하는 GPU에서는 셰이더 모델 6.3의 레이 트레이싱 파이프라인을 기술하기 위한 HLSL 셰이더를 사용할 수 있다。
4. 언어 기능
HLSL의 기본 문법은 C/C++에 준하지만, 그래픽스 프로그래밍에 적합한 벡터, 행렬형 및 함수를 갖추고 있다. 수학 함수 중에는 C/C++ 표준 라이브러리와 동일한 것도 포함된다. Direct3D 10에서는 API의 대폭적인 설계 변경으로, Direct3D 9용 HLSL과 비교하여 Direct3D 10 이후용 HLSL에서는 객체 지향에 기반한 언어 사양의 재설계가 이루어져, 많은 사양 변경이 이루어졌다。
Direct3D 10 이후에는 HLSL에서 클래스를 정의하여, C++처럼 데이터(멤버 변수)와 동작(멤버 함수)을 연관시키는 것이 가능하지만, 접근 지정자에 의한 캡슐화나 상속 및 가상 함수와 같은 기능은 갖추고 있지 않다.
Direct3D 11에서는 셰이더의 조합 폭발 문제를 해소하기 위해, HLSL에서 인터페이스의 정의와 구현에 의한 다형성을 흉내 내는 "동적 셰이더 연결 (Dynamic Shader Linkage)"이라는 기능이 추가되었다。
5. 코드 예시
cpp
// Shader Constants.
matrix TrWorldViewProj;
matrix TrWorld;
float4 LightPosition;
float3 EyePosition;
float4 DiffuseColor;
float4 SpecularColor;
float SpecularPower;
bool IsPhongModel;
struct BasicVSOutput
{
float4 Pos : SV_POSITION;
float3 WPos : TEXCOORD1;
float3 WNormal : NORMAL0;
};
typedef BasicVSOutput BasicPSInput;
// Vertex Shader Program.
BasicVSOutput BasicVS(float3 pos : POSITION0, float3 normal : NORMAL0)
{
BasicVSOutput output = (BasicVSOutput)0;
output.Pos = mul(float4(pos, 1), TrWorldViewProj);
output.WPos = mul(float4(pos, 1), TrWorld).xyz;
output.WNormal = mul(normal, (float3x3)TrWorld);
return output;
}
float4 CalcLambert(float3 light, float3 wnormal)
{
// Half Lambert.
float lambert = dot(light, wnormal);
lambert = lambert * 0.5f + 0.5f;
lambert *= lambert;
return lambert * DiffuseColor;
}
float4 BasicLambert(BasicPSInput input)
{
const float3 light = normalize(LightPosition.xyz - input.WPos);
const float3 normal = normalize(input.WNormal);
return CalcLambert(light, normal);
}
float4 BasicPhong(BasicPSInput input)
{
// Phong lighting with specular.
const float3 eye = normalize(EyePosition - input.WPos);
const float3 light = normalize(LightPosition.xyz - input.WPos);
const float3 halfway = normalize(light + eye);
const float3 normal = normalize(input.WNormal);
const float specular = pow(max(dot(normal, halfway), 0.0), SpecularPower);
return CalcLambert(light, normal) + specular * SpecularColor;
}
// Pixel Shader Program.
float4 BasicPS(BasicPSInput input) : SV_TARGET0
{
if (IsPhongModel)
{
return BasicPhong(input);
}
else
{
return BasicLambert(input);
}
}
```
위 코드는 Direct3D 10/11용 HLSL을 사용한 간단한 하프 램버트 조명 모델 및 퐁 조명 모델(Blinn-Phong)의 정점 셰이더 및 픽셀 셰이더 프로그램이다. 분기를 통해 조명 모델을 전환하지만, 이는 소위 우버 셰이더(uber-shader)이므로 실행 속도 효율성 등은 고려하지 않았다.
픽셀 셰이더를 통해 픽셀 단위의 정규화된 법선 벡터를 구함으로써, Direct3D 7 이전의 고정 기능 셰이더에서는 구현하기 어려웠던 픽셀 단위 조명(Per-Pixel lighting)을 쉽게 구현할 수 있게 되었다.
6. 지원 환경
HLSL 프로그램은 주로 호스트가 되는 C++ 애플리케이션 프로그램 코드에서 Direct3D API를 사용하여 입력과 출력을 관리해야 하므로 단독으로 동작시킬 수 없다. 단독 컴파일러는 마이크로소프트에서 무상으로 제공하는 DirectX SDK (또는 버전 8.0 이후의 Windows SDK)에 포함되어 있다. 전용 HLSL 컴파일러인 fxc.exe로 출력되는 것은 그래픽스 하드웨어 벤더에 의존하지 않는 공통 바이트코드 (중간 표현)이므로, 한 번 컴파일해두면 다른 하드웨어에서도 (컴파일 시에 예상되었던 기능을 충족하는 한) 동작시킬 수 있다。HLSL 프로그램을 지원하는 것은 Direct3D 9 이후를 지원하는 시스템에 한정되므로, 이전에는 윈도우 OS 및 Xbox 360 이후의 Xbox 시리즈가 주요 동작 환경이었지만, Vulkan용 셰이더 프로그램을 사전 컴파일하여 중간 표현 SPIR-V를 생성하는 컴파일러 glslangValidator가 GLSL과 HLSL을 모두 지원하게 되면서, 크로스 플랫폼에서의 HLSL 활용이 진행되고 있다.
애플리케이션 실행 시 HLSL 소스 코드를 컴파일하여 바이트코드를 생성하는 기능을 통합하기 위한 D3DCompiler 런타임도 제공된다。
그 외에도 게임 엔진 Unity에서는 셰이더 프로그램의 기술에 HLSL이 사용되고 있다 (과거에는 Cg가 사용되었기 때문에 일부 흔적이 남아있다)。윈도우 상에서 DirectCompute 기반 (DirectX 11 기반)의 컴퓨트 셰이더를 사용할 수 있지만, Cg는 컴퓨트 셰이더를 지원하지 않기 때문에, 컴퓨트 셰이더의 기술에는 처음부터 HLSL이 사용되었다。Unity는 Cg/HLSL에서 GLSL로의 변환이 가능하므로, OpenGL 4.3이나 OpenGL ES 3.1의 컴퓨트 셰이더를 사용하는 경우에도 GLSL이 아닌 HLSL을 사용하는 것이 권장되었다。
LLVM/Clang 기반의 HLSL 컴파일러 dxc.exe도 GitHub에서 개발이 진행되고 있다。이것은 DirectX Intermediate Language (DXIL)라고 불리는 다른 중간 언어 코드를 생성하지만, 지금까지 fxc.exe가 생성하는 바이트코드 (DXBC)와는 호환성이 없다.
7. 이펙트
HLSL 자체는 셰이더 함수 및 각 셰이더 스테이지의 엔트리 포인트(일명 메인 함수)를 기술하는 데 사용되지만, 여러 셰이더 스테이지를 함께 관리·적용하는 "이펙트"라고 불리는 구조도 존재한다. 예를 들어, 두 개의 정점 셰이더 엔트리 포인트 VS1(), VS2()와 두 개의 픽셀 셰이더 엔트리 포인트 PS1(), PS2()를 단일 HLSL 소스 프로그램 파일(통상 .fx 확장자가 붙고, 이펙트 파일이라고 불린다)에 기술할 수 있다. 또한, VS1+PS1, VS2+PS2, VS1+PS2, VS2+PS1과 같은 셰이더 스테이지 조합(패스) 외에도 각종 렌더링 상태 설정을 이펙트 파일 내에 기술하여 연관시킬 수 있다. 이펙트를 다루는 API는 Direct3D 10의 코어 라이브러리 또는 Direct3D 9/11의 익스텐션 라이브러리(D3DX)에 준비되어 있으며, 렌더링 파이프라인 관리를 C++ 코드로부터 분리할 수 있다.
8. WPF 및 Direct2D 이펙트
WPF는 윈도우 데스크톱 애플리케이션 프레임워크 중 하나로, 그래픽 렌더링에 Direct3D를 사용하며 GUI 위젯에 블러(흐림)나 드롭 섀도와 같은 효과(필터)를 적용할 수 있다. 또한 WPF에서는 HLSL로 작성한 픽셀 셰이더를 사용하여 사용자 정의 효과를 적용할 수도 있다.
WPF 3.5까지는 셰이더 모델 2.0의 픽셀 셰이더만 지원했지만, WPF 4에서는 셰이더 모델 3.0의 픽셀 셰이더도 사용할 수 있게 되었다.
9. 셰이더 모델
Direct3D 지원 하드웨어(그래픽 카드)의 세대에 따라 GPU에서 하드웨어 레벨로 실행 가능한 셰이더 프로그램의 사양(제약, 기능 등)이 다르다. 이 사양을 셰이더 모델이라고 하며, 새로운 세대의 셰이더 모델을 지원하는 하드웨어는 기본적으로 이전 세대의 셰이더 모델도 지원한다. 단, 벤더별로 확장된 2.0a/2.0b 등은 예외이다.
HLSL이 Direct3D에 탑재된 것은 버전 9 이후이지만, 셰이더 모델 2.0 이후가 아니어도 HLSL을 사용하여 셰이더 모델 1.x 레벨의 프로그램을 작성할 수 있다. Direct3D 10에서는 어셈블리 언어를 사용한 셰이더 프로그램 개발이 폐지되어, 셰이더 작성에는 HLSL만 사용할 수 있게 되었다.
셰이더 모델 3.0까지는 각 회사의 기능 지원에 차이가 있었다. 예를 들어, VTF(Vertex Texture Fetch, 정점 텍스처 페치) 기능은 엔비디아 하드웨어에서만 지원되었고, ATI 하드웨어에서는 지원되지 않았다. 반대로 부동 소수점 버퍼에서의 안티 앨리어싱 기능은 엔비디아 하드웨어에서는 지원되지 않고, ATI 하드웨어에서만 지원되었다 . (DirectX 11에서 표준화되기 전) 테셀레이션 기능 역시 ATI 하드웨어에서만 지원되었다 . 이러한 벤더별 기능 차이는 Direct3D 10 이후 요구 사양이 엄격해지면서 어느 정도 해소되었다.
Direct3D API 버전에 따라 사용 가능한 셰이더 프로파일에 제한이 있다. Direct3D 10.1 API에서는 4.x 프로파일 외에 2.0 프로파일을 사용할 수 있고, Direct3D 11/12 API에서는 5.x 및 4.x 프로파일 외에 2.0 프로파일을 사용할 수 있지만, 3.0 프로파일은 사용할 수 없다 .
9.1. DirectX 버전과 각 셰이더 스테이지
Direct3D 프로그래밍 가능 셰이더를 실행하려면 Direct3D 8 이상을 지원하는 하드웨어가 필요하다. Direct3D 지원 하드웨어(그래픽 카드)의 세대에 따라 GPU에서 하드웨어 레벨로 실행 가능한 셰이더 프로그램의 사양(제약, 기능 등)이 다르다. 이 사양을 셰이더 모델이라고 하며, 새로운 세대의 셰이더 모델을 지원하는 하드웨어는 기본적으로 이전 세대의 셰이더 모델도 지원한다.
HLSL로 프로그래밍 가능한 그래픽스 파이프라인 스테이지는 해당 Direct3D 버전 및 셰이더 모델에 따라 다르다.
* Direct3D 9의 경우(셰이더 모델 1.x-3.0)는 버텍스 셰이더 및 픽셀 셰이더(OpenGL의 프래그먼트 셰이더에 해당) 2개이다.
* Direct3D 10.x의 경우(셰이더 모델 4.x)는 버텍스 셰이더, 지오메트리 셰이더(OpenGL에서는 프리미티브 셰이더라고도 한다) 그리고 픽셀 셰이더 3개이다.
* Direct3D 11.x/12의 경우(셰이더 모델 5.x)는 버텍스 셰이더, 헐 셰이더(OpenGL의 테셀레이션 제어 셰이더에 해당), 도메인 셰이더(OpenGL의 테셀레이션 평가 셰이더에 해당), 지오메트리 셰이더, 픽셀 셰이더, 그리고 컴퓨트 셰이더(계산 셰이더, 연산 셰이더) 6개이다. 단, 컴퓨트 셰이더는 그래픽스 파이프라인과 독립적으로 동작시킬 수 있다.
다음 표는 하드웨어가 지원하는 DirectX 버전과 해당 하드웨어가 지원하는 각 셰이더 스테이지의 최상위 버전 간의 관계를 나타낸다. 실행 가능한 셰이더 프로그램의 최대 명령 수, 레지스터 수, 리소스 슬롯 수 등은 새로운 버전일수록 커지며, 더 유연하고 긴 프로그램을 작성할 수 있게 된다.
| | 픽셀 셰이더 || 버텍스 셰이더 || 지오메트리 셰이더 || 헐 셰이더 || 도메인 셰이더 || 컴퓨트 셰이더 | ||||||
|---|---|---|---|---|---|---|
| 8.0 | 1.0, 1.1 | 1.0 | - | - | - | - |
| 8.1 | 1.2, 1.3, 1.4 | 1.1 | - | - | - | - |
| 9.0 | 2.0 | 2.0 | - | - | - | - |
| 9.0a | 2.0a | 2.0a | - | - | - | - |
| 9.0b | 2.0b | 2.0 | - | - | - | - |
| 9.0c | 3.0 | 3.0 | - | - | - | - |
| 10.0 | 4.0 | 4.0 | 4.0 | - | - | 4.0 |
| 10.1 | 4.1 | 4.1 | 4.1 | - | - | 4.1 |
| 11.0-11.2 | 5.0 | 5.0 | 5.0 | 5.0 | 5.0 | 5.0 |
| 11.3, 12 | 5.1 | 5.1 | 5.1 | 5.1 | 5.1 | 5.1 |
| 12 | 6.0 | 6.0 | 6.0 | 6.0 | 6.0 | 6.0 |
컴퓨트 셰이더는 DirectX 11에서 도입된 스테이지이며, 드라이버가 지원하면 DirectX 10.x 세대 하드웨어에서도 DirectX 11 API를 경유하여 기능 제한이 있는 컴퓨트 셰이더를 실행할 수 있다.
셰이더 모델 5.1은 DirectX 12 API를 드라이버 레벨에서 지원하는 모든 하드웨어(기능 레벨 11_0 이상 필수)에서 사용할 수 있지만, Root Signature에 관한 기능은 DirectX 11.3에서는 사용할 수 없으며, DirectX 12 전용 기능이 된다。
셰이더 모델 6.0의 내장 함수는 기능 레벨 12_0의 요구 사항으로 추가되었다.
9.2. 픽셀 셰이더 비교
9.3. 버텍스 셰이더 비교
| 정점 셰이더 버전 | VS 1.1 | VS 2.0 | VS 2.0a | VS 3.0 | VS 4.0, 4.1, 5.0 |
|---|---|---|---|---|---|
| 명령 슬롯 수 | 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 | |||
| 지오메트리 인스턴싱 지원 | 아니요 | 아니요 | 아니요 | 예 | 예 |
| 비트 연산자 | 아니요 | 아니요 | 아니요 | 아니요 | 예 |
| 네이티브 정수 | 아니요 | 아니요 | 아니요 | 아니요 | 예 |
9.4. 지원 하드웨어 개요
다음은 각 그래픽 카드 제조사별 셰이더 모델 지원 현황을 나타낸 표이다. 셰이더 모델 1.x부터 6.0까지, 그리고 DirectX 버전 8.0부터 12까지의 지원 현황을 보여준다.
| | 픽셀 셰이더 || 버텍스 셰이더 || 지오메트리 셰이더 || 헐 셰이더 || 도메인 셰이더 || 컴퓨트 셰이더 | ||||||
|---|---|---|---|---|---|---|
| 8.0 | 1.0, 1.1 | 1.0 | - | - | - | - |
| 8.1 | 1.2, 1.3, 1.4 | 1.1 | - | - | - | - |
| 9.0 | 2.0 | 2.0 | - | - | - | - |
| 9.0a | 2.0a | 2.0a | - | - | - | - |
| 9.0b | 2.0b | 2.0 | - | - | - | - |
| 9.0c | 3.0 | 3.0 | - | - | - | - |
| 10.0 | 4.0 | 4.0 | 4.0 | - | - | 4.0 |
| 10.1 | 4.1 | 4.1 | 4.1 | - | - | 4.1 |
| 11.0-11.2 | 5.0 | 5.0 | 5.0 | 5.0 | 5.0 | 5.0 |
| 11.3, 12 | 5.1 | 5.1 | 5.1 | 5.1 | 5.1 | 5.1 |
| 12 | 6.0 | 6.0 | 6.0 | 6.0 | 6.0 | 6.0 |
컴퓨트 셰이더는 DirectX 11에서 도입되었으며, DirectX 10.x 하드웨어에서도 DirectX 11 API를 통해 제한적으로 사용 가능하다. 셰이더 모델 5.1은 DirectX 12를 지원하는 하드웨어(기능 레벨 11_0 이상)에서 사용 가능하지만, 일부 기능은 DirectX 12에서만 사용 가능하다. 셰이더 모델 6.0은 기능 레벨 12_0에서 추가되었다.
다음 표는 각 제조사의 그래픽 카드별 Direct3D 프로그래밍 가능 셰이더 지원 현황을 나타낸다. 일반적으로 칩은 상위 호환성을 가지므로, 예를 들어 PS 3.0 지원 칩은 PS 2.0과 PS 1.1도 지원한다.
| PS 버전 | DirectX 버전 | 3Dlabs | AMD(구 ATI) | 인텔 | Matrox | NVIDIA | S3 Graphics | SiS | XGI |
|---|---|---|---|---|---|---|---|---|---|
| 1.0/1.1 | 8.0 | - | - | - | - | GeForce 3 시리즈 | - | Xabre-Series | - |
| 1.2 | 8.0a | Wildcat VP | - | - | - | - | - | - | - |
| 1.3 | 8.0a | - | - | - | Parhelia-Series | GeForce 4 Ti/Go 시리즈 | - | Mirage 2 (소프트웨어 에뮬레이션으로 지원) | - |
| 1.4 | 8.1 | - | Radeon R200 (8500-9250) | - | - | - | - | Mirage 3 | Volari V3 시리즈 (V3XT 제외) |
| 2.0 | 9.0 | Wildcat Realizm | Radeon R300 (9500-9800, X300-X600) | Intel GMA 900 | - | GeForce FX 시리즈 | DeltaChrome, GammaChrome, Chrome S2x 시리즈, Chrome9 HC | Mirage 3+ | Volari V3XT, Volari V5 시리즈, Volari V8 시리즈, Volari 8300, Volari XP10 |
| 2.0a | 9.0a | - | - | - | - | GeForce FX 시리즈 | - | - | - |
| 2.0b | 9.0b | - | Radeon R420 (X700-X850) | - | - | - | - | - | |
| 3.0 | 9.0c | - | Radeon X1xxx | Intel GMA 950 (3.0은 소프트웨어 에뮬레이션), 3000, 3100 | M Series | GeForce 6 시리즈, GeForce 7 시리즈 | - | - | - |
| 4.0 | 10 | - | Radeon HD 2xxx | Intel GMA X3100 이후 시리즈 | - | GeForce 8 시리즈, GeForce 9 시리즈 | - | - | - |
| 4.1 | 10.1 | - | Radeon HD 3xxx, Radeon HD 4xxx | HD Graphics 2000/3000 | - | GeForce GT 200 시리즈 | Chrome400/500 | - | - |
| 5.0 | 11 | - | Radeon HD 5xxx | HD Graphics 2500/4000 | - | GeForce GTX 400 시리즈 | - | - | - |
게임 콘솔의 GPU 셰이더 모델 지원 정보는 다음과 같다.
* Xbox: SM1.x 또는 파생형
* Xbox 360, PlayStation 3: SM3.0 또는 파생형
* Wii U: SM4.0 또는 파생형
* Xbox One, PlayStation 4: SM5.0 또는 파생형
OpenGL 지원 레벨은 다음과 같이 DirectX 버전 및 셰이더 모델과 대략적으로 관련된다.
* OpenGL 2.x - Direct3D 9
* OpenGL 3.x - Direct3D 10
* OpenGL 4.x - Direct3D 11