High Level Shader Language (HLSL) (HLSL)
Transkript
High Level Shader Language (HLSL) (HLSL)
High Level Shader Language (HLSL) Uluslararası Bilgisayar Enstitüsü Ege Üniversitesi GPU İş hattı Programlanabilir GPU İş Hattı HLSL HLSL, Ekran kartında çalışan programlanabilir ünitelerin programlanmasında kullanılan programlama dillerinden biridir. HLSL veri tipleri Skalar veri tipleri bool: int: half: float: double: doğru / yanlış 32 bit tam sayı 16 bit ondalıklı sayı 32 bit ondalıklı sayı 64 bit ondalıklı sayı Vektörel veri tipleri bool2, bool3, bool4 int2, int3, int4 half2, half3, half4 float2, float3, float4 double2, double3, double4 HLSL intrinsics abs(x): Her bileşen için mutlak değer hesaplar. acos(x): Her bileşen için arkkosinüs hesaplar. all(x): Tüm bileşenlerin 0’dan farklı olup olmadığını kontrol eder any(x): Herhangi bir bileşenin o’dan farklı olup olmadığını kontrol eder asin(x): Her bileşen için Arksinüs hesaplar. atan(x): Her bileşen için arktanjant’ı [-pi/2, pi/2] aralığında hesaplar. atan2(y, x): y / x’in her bileşeni için arktanjantı [–pi,pi] aralığında döndürür ceil(x): x ten büyük eşit en küçük tam sayıyı döndürür (her bileşen için) clamp(x, min, max): x değerini [min, max] aralığına sınırlar. clip(x): x’in herhangi bir değeri 0’dan küçükse o pikseli işlemeyi bırakır. cos(x): her bileşen için kosinüs hesaplar. cosh(x): her bileşen için hiperbolik kosinüs hesaplar. ddx(x): x’in her bileşeni için ekran uzayında x koordinatına göre türevi verir. ddy(x): x’in her bileşeni için ekran uzayında y koordinatına göre türevi verir. degrees(x): x’in her bileşenini radyan’dan dereceye çevirir. determinant(x): X matrisinin determinantını verir. HLSL intrinsics distance(a, b): a ve b noktaları arasındaki uzaklığı verir. dot(a, b): a ve b vektörlerinin dot product’ını verir. exp(x): her bileşen için ex değerini hesaplar. exp2(x): her bileşen için 2x değerini hesaplar. floor(x): x ten küçük eşit en büyük tam sayıyı döndürür (her bileşen için) frac(x): x’in her bileşeninin virgülden sonraki [0, 1) aralığındaki değerlerini döndürür. length(x): x vektörünün uzunluğunu döndürür. lerp(a,b, s): a ve b arasında s parametresiyle lineer interpolasyon yap [a + s(b-a)] log(x): x’in her bileşeninin e tabanında logaritmasını döndürür. log2(x): x’in her bileşeninin 2 tabanında logaritmasını döndürür. max(a, b): a ve b skalar değerlerinden büyük olanını döndürür. min(a, b): a ve b skalar değerlerinden küçük olanını döndürür. mul(a, b): a ile b nin matris çarpımını döndürür. normalize(v): v ile aynı yönde birim vektör döndürür. pow(x, y): xy değerini döndürür. sqrt(x): x’in tüm bileşenlerinin karekökünü döndürür. transpose(m): m matrisinin transpozesini döndürür. …… Vertex Shader Girdileri POSITIONn BLENDWEIGHTn BLENDINDICESn NORMALn PSIZEn COLORn TEXCOORDn TANGENTn BINORMALn TESSFACTORn Konum Animasyon ağırlıkları Animasyon index’leri Köşe Normali Nokta büyüklüğü Renk Doku koordinatları Tanjant vektörü Binormal vektörü Tesselation Faktörü Vertex Shader Çıktıları POSITION PSIZE FOG COLORn TEXCOORDn Konum Nokta büyüklüğü Sis değeri Renk değerleri Doku koordinatları Pixel Shader Girdileri VFACE VPOS COLORn TEXCOORDn ön yüzey / arka yüzey pixelin x,y koordinatları Renk Değerleri Doku koordinatları Pixel Shader Çıktıları COLORn DEPTH n. RenderTarget için renk değeri Derinlik değeri float4x4 matWorldViewProjection; float4x4 matWorldView; float4 fLightDir; float4 LightColor; Per Vertex Işıklandırma // Modelden gelen vertex bilgileri struct VS_INPUT { float4 Position : POSITION; // Pozisyon float3 Normal : NORMAL; // Normal }; // Vertex Shader'ın döndüreceği değerler struct VS_OUTPUT { float4 Position : POSITION; // Pozisyon float4 LightColor : COLOR; // Renk }; // Vertex Shader VS_OUTPUT vs_main(VS_INPUT Input) { // Döndürülecek sonuçları saklayan yapı VS_OUTPUT Output; // Model koordinatlarındaki konumu projeksiyon uzayına taşı Output.Position = mul( matWorldViewProjection, Input.Position ); // köşe normalini görüntü uzayına taşı float3 vNormal = mul( matWorldView, Input.Normal ); // görüntü uzayındaki normal ile görüntü uzayındaki ışık // yönünü kullanarak ışık şiddeti ve rengini hesapla Output.LightColor = LightColor * max(0, dot(vNormal, fLightDir.xyz)); // Sonuçları döndür return Output; } // Vertex Shader çıktıları // (Pixel Shader Girdileri) struct PS_INPUT { float4 LightColor : COLOR; }; // Pixel Shader float4 ps_main(PS_INPUT In) : COLOR0 { // Vertex Shader'dan gelen Işık // rengini döndür. return In.LightColor; } float4x4 matWorldViewProjection; float4x4 matWorldView; //Modelden gelen vertex bilgileri struct VS_INPUT { float4 Position : POSITION; // Pozisyon float3 Normal : NORMAL; // Normal }; //Vertex Shader'ın döndüreceği değerler struct VS_OUTPUT { float4 Position : POSITION; // Pozisyon float3 vNormal : TEXCOORD1; // Normal }; //Vertex Shader VS_OUTPUT vs_main( VS_INPUT Input ) { // Döndürülecek sonuçları saklayan yapı VS_OUTPUT Output; // Model koordinatlarındaki konumu // projeksiyon uzayına taşı Output.Position = mul( matWorldViewProjection, Input.Position ); // Model koordinatlarındaki normali // görüntü uzayına taşı Output.vNormal = mul(matWorldView, Input.Normal); return( Output ); } Per Pixel Işıklandırma float4 fLightDir; float4 LightColor; // Vertex Shader çıktıları // (Pixel Shader Girdileri) struct PS_INPUT { float3 vNormal : TEXCOORD1; }; //Pixel Shader float4 ps_main(PS_INPUT In) : COLOR0 { // Vertex Shaderdan gelen normalin tekrar // normalize edilmesi gerekir float3 vNormal = normalize(In.vNormal); //Işık şiddeti ve rengi hesaplanması return LightColor * max(0, dot(vNormal, fLightDir.xyz)); } Köşelerdeki birim vektörlerin lineer interpolasyonu ara noktalarda birim vektörden kısa vektörlere neden olmaktadır Per Vertex vs. Per Pixel Per Vertex Per Pixel Efektlerin hiyerarşik yapısı Shader Editor Sonuç Sanatçılar için parametre Editörü Hata Ekranı Efekt Grubu Matris ve Dokular Modelden hangi bilgilerin okunacağını gösteren tablo Model OpenGL Efekti OpenGL ES Efekti DirectX Efekti Pass’ler Model Referansı Vertex ve Pixel Shaderlar Dokulardan okumaya yarayan Sampler’lar Stream Mapping Referansı Parametreler Teşekkürler