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:
1cbuffer TransformBuffer: register(b0)2{3float4x4 worldViewProj;4};56struct VS_INPUT7{8float3 position: POSITION;9float3 normal: NORMAL;10};1112struct VS_OUTPUT13{14float4 position: SV_POSITION;15float3 normal: TEXCOORD0;16};1718VS_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#version 330 core23uniform mat4 worldViewProj;45layout(location = 0) in vec3 position;6layout(location = 1) in vec3 normal;78out vec3 fragNormal;910void 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.
0 yorum