Shader Yazmanın Temelleri: HLSL ve GLSL Karşılaştırması

Shader yazmaya başlamadan önce hangi dili seçeceğini bilmek önemli. HLSL (High Level Shader Language) DirectX ekosisteminin dili, GLSL (OpenGL Shading Language) ise OpenGL'nin standart shader dilidir. Her ikisi de GPU'da çalışan programları yazar ama sözdizimi ve hedefleri farklı.

HLSL Microsoft tarafından geliştirilen ve DirectX 9 sonrasında standartlaşan bir dildir. Genellikle Windows oyun geliştirilmesinde ve ticari motorlarda (Unreal Engine) tercih edilir. GLSL ise açık kaynak ve platformdan bağımsız; Unity, WebGL ve masaüstü OpenGL uygulamalarında yaygındır.

Sözdizimi açısından ikisi de C benzeri yapıya sahip ama vektör ve matris işlemleri farklı şekilde yapılır. Koordinat sistemleri de uyuşmaz: OpenGL NDC'de Y ekseni yukarıya, DirectX'te aşağıya bakıyor.

Basit bir vertex shader yazacağız. Önce HLSL versiyonu:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1cbuffer TransformBuffer: register(b0)
2{
3float4x4 worldViewProj;
4};
5
6struct VS_INPUT
7{
8float3 position: POSITION;
9float3 normal: NORMAL;
10};
11
12struct VS_OUTPUT
13{
14float4 position: SV_POSITION;
15float3 normal: TEXCOORD0;
16};
17
18VS_OUTPUT main(VS_INPUT input)
19{
20VS_OUTPUT output;
21output.position = mul(float4(input.position, 1.0f), worldViewProj);
22output.normal = input.normal;
23return output;
24}

Aynı işi yapan GLSL versiyonu:

1 330 core
2
3uniform mat4 worldViewProj;
4
5layout(location = 0) in vec3 position;
6layout(location = 1) in vec3 normal;
7
8out vec3 fragNormal;
9
10void main()
11{
12gl_Position = worldViewProj * vec4(position, 1.0);
13fragNormal = normal;
14}

Farkları görebilirsin: HLSL `cbuffer` ile constant buffer tanımlar, GLSL `uniform` kullanır. HLSL'de semantik (`:POSITION`, `:SV_POSITION`) gerekli, GLSL'de `layout` ile slot numarası belirtilir. Matris çarpım sırası da ters: HLSL vektörü sağdan çarpar, GLSL soldan.

DirectX ve Windows oyun geliştiriyorsan HLSL, cross-platform veya WebGL hedefliyorsan GLSL. Modern oyun motorları (Unity, Unreal) her ikisini de destekler ama arkaplanda birini diğerine çevirirler. Başlangıçta GLSL daha öğrenme dostu; syntax açık ve platformdan bağımsız.

İkisini de bilmek faydalı çünkü shader mantığı aynı kalıyor, sadece sözdizimi değişiyor.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz