AGSL Hızlı Referansı

AGSL, GLSL ES 1.0 ile büyük ölçüde uyumlu olacak şekilde tasarlanmıştır. Daha fazla bilgi için OpenGL ES Gölgelendirme Dili dokümanlarındaki eşdeğer işleve bakın. Mümkün olduğunda bu belge, AGSL ve GLSL arasındaki farkları açıklamaya çalışır.

Türler

AGSL, GLSL ES 1.0 türlerini desteklemenin yanı sıra, vektör ve matris türlerini temsil etmek için ek bir yöntem sunar. AGSL, orta hassasiyeti temsil etmek için ek short ve half türlerini destekler.

Temel türler

Tür Açıklama
void Değer döndüren veya boş parametre listesi bulunan işlev yok. GLSL'nin aksine, void dönüş türü olmayan işlevler bir değer döndürmelidir.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
Boole skaler/vektör
int, ivec2, ivec3, ivec4
(int2, int3, int4)
highp işaretli tam sayı/vektör
float, vec2, vec3, vec4
(float2, float3, float4)
highp (tek hassasiyetli) kayan nokta skaler/vektör
short, short2, short3, short4 mediump int işaretli tam sayı/vektöre eşdeğerdir
half, half2, half3, half4 mediump float skaler/vektöre eşdeğer
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
2x2, 3x3, 4x4 float matris
half2x2, half3x3, half4x4 mediump float matris türüne eşdeğerdir

Hassasiyet ve aralık minimum değerleri

Bunlar, OpenGL ES 2.0 spesifikasyonuna dayalı olarak her bir değiştiriciyle ilişkili minimum garantili hassasiyet ve aralıktır. Çoğu cihaz ES 3.0'ı desteklediğinden highp hassasiyet/aralık ve int mediump kapsama alanı daha garanti edilir. Hassasiyet değiştiriciler; skaler, vektör ve matris değişkenlerine ve parametrelerine uygulanabilir. Yalnızca aşağıda listelenen minimum değerler garanti edilir; lowp, mediump kesin hassasiyetinden daha düşük değildir ve mediump, highp ile karşılaştırıldığında daha düşük hassasiyet olmayabilir. AGSL, şu anda son çıkışta lowp değerini mediump olarak dönüştürüyor.

Değiştirici "float" aralığı "kayan" büyüklük aralığı "kayan" hassasiyeti "int" aralığı
yüksek \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Akraba: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
orta \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Akraba: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
düşük \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Mutlak: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

Dizi sayısal alt simge söz dizimine ek olarak: var[num], names of vector components for vectors of length 2 - 4 are denoted by a single letter. Components can be swizzled and replicated. ex:vect.yx,vect.yy`

vect.xyzw: Noktaları/normalleri temsil eden vektörlere erişirken kullanın

vect.rgba: Renkleri temsil eden vektörlere erişirken kullanın

vect.LTRB - Vektör, bir dikdörtgeni temsil ettiğinde kullanın (GLSL'de değil)

AGSL'de, 0 ve 1, bu kanalda sabit bir 0 veya 1 değeri üretmek için kullanılabilir. Ör. vect.rgb1 == vec4(vect.rgb,1)

Yapılar ve diziler

Yapılar, GLSL ile aynı söz dizimiyle tanımlanır ancak AGSL, yalnızca küresel kapsamdaki yapıları destekler.

struct type-name {
 members
} struct-name; // optional variable declaration.

C stili veya GLSL stili söz dizimi kullanılarak belirli bir dizi boyutuyla yalnızca 1 boyutlu diziler desteklenir:

<base type>[<dizi boyutu>] değişken adı - ör: half[10] x;

<base type> değişken adı[<dizi boyutu>] - ör: half x[10];

Diziler işlevden döndürülemez, kopyalanamaz, atanamaz veya karşılaştırılamaz. Dizi kısıtlamaları, dizi içeren yapılara yayılır. Diziler yalnızca sabit veya döngü değişkeni kullanılarak dizine eklenebilir.

Eleme maçları

Tür Açıklama
const Derleme zamanı sabiti veya salt okunur işlev parametresi.
uniform Değer, işlenen temel öğeler arasında değişmez. Üniformalar setColorUniform, setFloatUniform, setIntUniform, setInputBuffer ve setInputShader için RuntimeShader yöntemleri kullanılarak Android'den iletilir.
in İletilen işlev parametreleri için. Bu varsayılan seçenektir.
out Aktarılan işlev parametreleri için. İşlev tanımıyla aynı hassasiyet kullanılmalıdır.
inout Bir işlevin hem içine hem de dışına aktarılan parametrelerdir. İşlev tanımıyla aynı kesinlik kullanılmalıdır.

Değişken bildirimi

Beyanlar açık bir şekilde süslü ayraçlı bir kapsamda olmalıdır. Aşağıdaki örnekte y beyanına izin verilmez:

if (condition)
    int y = 0;

Matris/yapı/dizi temelleri

Matris oluşturucu örnekleri

Bir matris tek bir değerle oluşturulduğunda, köşegen üzerindeki tüm değerlere bu değer verilirken, geri kalanına sıfırlar verilir. float2x2(1.0) bu nedenle 2x2 bir kimlik matrisi oluşturur.

Bir matris birden fazla değerle oluşturulduğunda, önce sütunlar doldurulur (sütun-ana sıralama).

GLSL'nin aksine, iletilen vektörün bileşenlerinin sayısını azaltan oluşturucular desteklenmediğini, ancak aynı etkiye sahip olmak için sarmalamayı kullanabilirsiniz. AGSL'de bir vec4 öğesinden, GLSL ile aynı davranışa sahip bir vec3 oluşturmak için vec3 nv = quadVec.xyz değerini belirtin.

Yapı oluşturucu örneği

struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));

Matris bileşenleri

Dizi alt simge söz dizimine sahip matrisin bileşenlerine erişin.

float4x4 m; // represents a matrix
m[1] = float4(2.0); // sets second column to all 2.0
m[0][0] = 1.0; // sets upper left element to 1.0
m[2][3] = 2.0; // sets 4th element of 3rd column to 2.0

Yapı alanları

Nokta . operatörünü kullanarak yapı alanlarını seçin. Operatörler arasında şunlar yer alır:

Operatör Açıklama
. alan seçici
==, != eşitlik
= atama

Dizi öğeleri

Dizi öğelerine, [ ] dizi alt simge operatörü kullanılarak erişilir. Örneğin:

diffuseColor += lightIntensity[3] * NdotL;

Operatörler

Öncelik sırasına göre numaralandırılır. İlişkisel ve eşitlik operatörleri > < <= >= == != Boole olarak değerlendirilir. Vektörleri bileşen olarak karşılaştırmak için lessThan(), equal() gibi fonksiyonları kullanın.

Operatör Açıklama İlişkilendirme
1 () parantez içinde gruplandırma Yok
2 [] () . ++ -- dizi altsimgesi işlev çağrısı ve kurucu yapısı alan veya yöntem seçici, swizzle postfix artırım ve azalt Soldan Sağa
3 ++ -- + - ! ve azalan tekli kodları Sağdan Sola
4 * / çarp ve böl Soldan Sağa
5 + - topla ve çıkar Soldan Sağa
7 < > <= >= ilişkisel Soldan Sağa
8 == != eşitlik/eşitsizlik Soldan Sağa
12 && mantıksal VE Soldan Sağa
13 ^^ mantıksal ÖZELVEYA Soldan Sağa
14 || mantıksal VEYA Soldan Sağa
15 ?\: seçim (tüm işlemenin) Soldan Sağa
16 = += -= *= /= ödev aritmetik ödev aritmetik ödev Soldan Sağa
17 , sequence Soldan Sağa

Matris ve vektör işlemleri

Aritmetik operatörler skaler değerlere uygulandığında skaler sonucunu verir. Modlo dışındaki operatörlerde bir işlenenin skaler ve diğerinin vektör veya matris olması durumunda işlem, bileşen olarak gerçekleştirilir ve aynı vektör veya matris türünde sonuçlanır. Her iki işlem de aynı boyutta vektör ise işlem bileşen düzeyinde gerçekleştirilir (ve aynı vektör türünü döndürür).

İşlem Açıklama
m = f * m Skalar bir değerle bileşen bazında matris çarpım
v = f * v Skalar bir değerle bileşen düzeyinde vektör çarpma
v = v * v Vektör değeriyle bileşen düzeyinde vektör çarpma
m = m + m Matris bileşeni bazında toplama
m = m - m Matriste bileşen düzeyinde çıkarma işlemi
m = m * m Doğrusal cebirsel çarpma

Bir işlenen, matrisimizin satır veya sütun boyutuyla eşleşen bir vektörse cebirsel satır ve sütun çarpımları yapmak için çarpma operatörü kullanılabilir.

İşlem Açıklama
m = v * m Satır vektörü * matris doğrusal cebirsel çarpım
m = m * v Matris * sütun vektörü doğrusal cebirsel çarpım

Vektör nokta çarpımı, çarpım ve bileşen bazında çarpma için yerleşik işlevleri kullanın:

İşlev Açıklama
f = dot(v, v) Vektör nokta çarpım
v = cross(v, v) Vektör çapraz çarpım
m = matrixCompMult(m, m) Bileşen bazında çarpma

Program kontrolü

İşlev çağrısı Değer getirisine göre arama
Yineleme for (<init>;<test>;<next>)
{ break, continue }
Seçim if ( ) { }
if ( ) { } else { }
switch () { break, case } - son varsayılan büyük/küçük harf
Atla break, continue, return
(silmeye izin verilmez)
Giriş half4 main(float2 fragCoord)

Döngü sınırlamaları için

GLSL ES 1.0'a benzer şekilde, "for" döngüleri oldukça sınırlıdır; derleyicinin döngüyü açabilmesi gerekir. Bu, her şeyin derleme zamanında hesaplanabilmesi için başlatıcının, test koşulunun ve next ifadesinin sabit değerler kullanması gerektiği anlamına gelir. next ifadesi ayrıca ++, --, +=, or -= kullanımıyla sınırlıdır.

Yerleşik işlevler

GT (genel tür): float, float2, float3, float4 veya half, half2, half3, half4.

Bu işlevlerin çoğu bileşen olarak çalışır (işlev, bileşen başına uygulanır). Böyle olmadığı unutulmamalıdır.

Açı ve trigonometrik fonksiyonlar

Açı olarak belirtilen işlev parametrelerinin radyan birimi cinsinden olduğu varsayılır. Hiçbir koşulda bu işlevlerin hiçbiri sıfıra bölme hatasına neden olmaz. Oranın böleni 0 ise sonuçlar tanımsız olur.

İşlev Açıklama
GT radians(GT degrees) Dereceleri radyana dönüştürür
GT degrees(GT radians) Radyanları dereceye dönüştürür
GT sin(GT angle) Standart sinüs
GT cos(GT angle) Standart kosinüs
GT tan(GT angle) Standart tanjant
GT asin(GT x) Sinüsü $ \left[-{\pi\over 2},{\pi\over 2}\right] aralığında olan bir açı döndürür
GT acos(GT x) Kosinüsü $ \left[0,\pi\right] $ aralığında x olan bir açı döndürür
GT atan(GT y, GT x) Trigonometrik arktanjantı $ \left[-\pi,\pi\right] $ aralığında $ \left[{y\over x}\right] $ olan bir açı döndürür.
GT atan(GT y_over_x) Trigonometrik arktanjantı y_over_x olan ve $ \left[-{\pi\over 2},{\pi\over 2}\right] $ aralığında olan bir açı döndürür.

Üstel işlevler

İşlev Açıklama
GT pow(GT x, GT y) $ x^y $ sonucunu döndürür
GT exp(GT x) $ e^x $ sonucunu döndürür
GT log(GT x) $ ln(x) $ döndürür
GT exp2(GT x) $ 2^x $ sonucunu döndürür
GT log2(GT x) $ log_2(x) $ değerini döndürür
GT sqrt(GT x) $ \sqrt{x} $ döndürür
GT inversesqrt(GT x) $ 1\over{\sqrt{x}} $ döndürür

Ortak işlevler

İşlev Açıklama
GT abs(GT x) Mutlak değer
GT sign(GT x) x işaretine göre -1,0, 0,0 veya 1,0 değerini döndürür
GT floor(GT x) En yakın tam sayı <= x
GT ceil(GT x) En yakın tam sayı >= x
GT fract(GT x) x'in kesirli kısmını döndürür
GT mod(GT x, GT y) x modülü y'nin değerini döndürür
GT mod(GT x, float y) x modülü y'nin değerini döndürür
GT min(GT x, GT y) Minimum x veya y değerini döndürür
GT min(GT x, float y) Minimum x veya y değerini döndürür
GT max(GT x, GT y) Maksimum x veya y değerini döndürür
GT max(GT x, float y) Maksimum x veya y değerini döndürür
GT clamp(GT x, GT minVal, GT maxVal) minVal ve maxVal arasına sabitlenmiş x değerini döndürür.
GT clamp(GT x, float minVal, float maxVal) minVal ve maxVal arasında sabitlenmiş x değerini döndürür
GT saturate(GT x) 0,0 ve 1,0 arasında sabitlenmiş x değerini döndürür
GT mix(GT x, GT y GT a) x ve y'nin doğrusal karışımını döndürür
GT mix(GT x, GT y, float a) x ve y'nin doğrusal karışımını döndürür
GT step(GT edge, GT x) x < kenarsa 0,0, aksi takdirde 1,0 sonucunu döndürür
GT step(float edge, GT x) x < kenarsa 0,0, aksi takdirde 1,0 sonucunu döndürür
GT smoothstep(GT edge0, GT edge1, GT x) Kenar0 < x < kenar1 olduğunda 0 ile 1 arasında Hermite interpolasyonu yapar
GT smoothstep(float edge0, float edge1, GT x) Kenar0 < x < kenar1 olduğunda 0 ile 1 arasında Hermite interpolasyonu yapar

Geometrik fonksiyonlar

Bu işlevler, bileşen olarak değil, vektör olarak vektörler üzerinde çalışır. GT, 2-4 boyutlarındaki kayan/yarım vektörlerdir.

İşlev Açıklama
float/half length (GT x) Vektörün uzunluğunu döndürür
float/half distance(GT p0, GT p1) Noktalar arasındaki mesafeyi döndürür
float/half dot(GT x, GT y) İade nokta çarpımı
float3/half3 cross(float3/half3 x, float3/half3 y) Çarpım arası iadeler
GT normalize(GT x) Vektörü 1 uzunluğa kadar normalleştirin
GT faceforward(GT N, GT I, GT Nref) nokta(Nref, I) < 0 ise N, aksi takdirde -N sonucunu döndürür.
GT reflect(GT I, GT N) Yansıtma yönü I - 2 * nokta(N,I) * N.
GT refract(GT I, GT N, float/half eta) Kırılma vektörünü döndürür

Matris işlevleri

Tip matris herhangi bir kare matris türüdür.

İşlev Açıklama
mat matrixCompMult(mat x, mat y) x'i y bileşeniyle çarpın
mat inverse(mat m) m'nin tersini döndürür

Vektör ilişkisel fonksiyonları

x ve y'yi bileşen bazında karşılaştırın. Belirli bir çağrıya ilişkin giriş ve dönüş vektörlerinin boyutları eşleşmelidir. T, tam sayı ile kayan nokta vektör türlerinin birleşimidir. BV, giriş vektörlerinin boyutuyla eşleşen bir boole vektörüdür.

İşlev Açıklama
BV lessThan(T x, T y) x < y
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > y
BV greaterThanEqual(T x, T y) x >= y
BV equal(T x, T y) x == y
BV equal(BV x, BV y) x == y
BV notEqual(T x, T y) x != y
BV notEqual(BV x, BV y) x != y
bool any(BV x) x'in herhangi bir bileşeni true ise true
bool all(BV x) x'in tüm bileşenleri true ise true.
BV not(BV x) x'in mantıksal tamamlanması

Renk işlevleri

İşlev Açıklama
vec4 unpremul(vec4 color) Renk değerini önceden çarpılmamış alfa değerine dönüştürür
half3 toLinearSrgb(half3 color) Renk alanını doğrusal SRGB'ye dönüştürme
half3 fromLinearSrgb(half3 color) Renk alanını dönüştürme

Gölgelendirici örnekleme (değerlendirme)

Örnekleyici türleri desteklenmez ancak diğer gölgelendiricileri değerlendirebilirsiniz. Bir doku örneğini almanız gerekirse BitmapShader nesnesi oluşturup bunu tek tip olarak ekleyebilirsiniz. Bunu herhangi bir gölgelendirici için yapabilirsiniz. Böylece, herhangi bir Android Gölgelendirici'yi, diğer RuntimeShader nesneleri de dahil olmak üzere önce Bitmap'e dönüştürmeden doğrudan değerlendirebilirsiniz. Bu, çok fazla esneklik sağlar ancak karmaşık gölgelendiricilerin değerlendirilmesi, özellikle de döngüde pahalı olabilir.

uniform shader image;

image.eval(coord).a   // The alpha channel from the evaluated image shader

Ham tampon örnekleme

Çoğu resim renkle yönetilmesi gereken renkler içerir ancak bazı resimler, normalleri, malzeme özelliklerini (ör. pürüzlülük), yükseklik haritalarını veya bir resimde depolanabilecek diğer tüm matematiksel verileri saklayan resimler de dahil olmak üzere aslında renk olmayan veriler içerir. AGSL'de bu tür görüntüleri kullanırken BitmapShader'ı RuntimeShader#setInputBuffer ile genel ham arabellek olarak kullanabilirsiniz. Bu işlem, renk alanı dönüştürmelerini ve filtrelemeyi önler.