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 Shading Language belgeleri bölümündeki eşdeğer işleve bakın. Mümkün olduğunda bu dokümanda AGSL ile GLSL arasındaki farklar belirtilmeye çalışılmıştır.

Türler

AGSL, vektör ve matris türlerini temsil etmenin ek bir yolu ile birlikte GLSL ES 1.0 türlerini destekler. AGSL, orta hassasiyeti temsil etmek için ek short ve half türlerini destekler.

Temel türler

Tür Açıklama
void İşlev döndürülen değer yok veya boş parametre listesi. GLSL'den farklı olarak, 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ğer
half, half2, half3, half4 mediump float skaler/vektöre eşdeğer
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
2x2, 3x3, 4x4 float matrisi
half2x2, half3x3, half4x4 mediump float matris türlerine eşdeğer

Hassasiyet ve minimum aralık

Bunlar, OpenGL ES 2.0 spesifikasyonuna göre her değiştiriciyle ilişkili minimum garanti edilen hassasiyet ve aralıktır. Çoğu cihaz ES 3.0'ı desteklediğinden daha garantili highp hassasiyet/aralık ve int mediump aralığına sahiptir. 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'ten daha düşük hassasiyete sahip olmayabilir ve mediump, highp'den daha düşük hassasiyete sahip olmayabilir. AGSL şu anda nihai çıkışta lowp değerini mediump olarak dönüştürüyor.

Değiştirici "float" aralığı "float" büyüklük aralığı "float" hassasiyeti "int" aralığı
highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Göreli: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
mediump \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Göreli: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
lowp \(\left\{-2,2\right\}\) \(\left\{2^{-8},2\right\}\) Mutlak: \(2^{-8}\) \(\left\{-2^{8},2^{8}\right\}\)

Dizi sayısal alt dizesi söz dizimine ek olarak (ör. 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ılır.

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

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

AGSL'de, ilgili kanalda sabit bir 0 veya 1 oluşturmak için 0 ve 1 kullanılabilir. Örnek: vect.rgb1 == vec4(vect.rgb,1)

Yapılar ve diziler

Yapılar, GLSL ile aynı söz diziminde tanımlanır ancak AGSL yalnızca global kapsamdaki yapıları destekler.

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

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

<base type>[<array size>] değişken adı (ör. half[10] x;)

<base type> değişken adı[<array size>] - Örn: half x[10];

Diziler bir 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 bir sabit veya döngü değişkeni kullanılarak dizine eklenebilir.

Eleme maçları

Tür Açıklama
const Derleme zamanı sabit veya salt okunur işlev parametresi.
uniform Değer, işlenen ilkel boyunca değişmez. Üniformalar, setColorUniform, setFloatUniform, setIntUniform, setInputBuffer ve setInputShader için RuntimeShader yöntemleri kullanılarak Android'den aktarılır.
in İletilen işlev parametreleri için. Bu varsayılan ayardır.
out İletilen işlev parametreleri için. İşlev tanımı ile aynı hassasiyeti kullanmalıdır.
inout Hem işleve aktarılan hem de işlevden aktarılan parametreler için. İşlev tanımı ile aynı hassasiyeti kullanmalıdır.

Değişken beyanı

Tanımlamalar açık parantez içinde bir kapsamda olmalıdır. Aşağıdaki örnekte y beyanına izin verilmez:

if (condition)
    int y = 0;

Matris/yapı/diziyle ilgili temel bilgiler

Matris oluşturucu örnekleri

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

Bir matris birden fazla değerle oluşturulduğunda önce sütunlar doldurulur (sütun ağırlıklı düzen).

GLSL'den farklı olarak, iletilen bir vektörün bileşen sayısını azaltan kurucuların desteklenmediğini ancak aynı etkiyi elde etmek için karıştırmayı kullanabileceğinizi unutmayın. AGSL'de bir vec4'ten GLSL ile aynı davranışa sahip bir vec3 oluşturmak için vec3 nv = quadVec.xyz'yi 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 dizesi söz dizimini kullanarak bir matrisin bileşenlerine erişme.

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 şunlardır:

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

Dizi öğeleri

Dizi öğelerine dizi alt dizesi operatörü [ ] kullanılarak erişilir. Örnek:

diffuseColor += lightIntensity[3] * NdotL;

Operatörler

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

Operatör Açıklama Birleştirici
1 () parantez içinde gruplandırma Yok
2 [] () . ++ -- dizi alt dizesi, işlev çağrısı ve oluşturucu yapısı, alan veya yöntem seçici, swizzle, son ek artma ve azalma Soldan Sağa
3 ++ -- + - ! ön ek artışı ve azalması tek adımlı Sağdan Sola
4 * / çarpma ve bölme Soldan Sağa
5 + - toplama ve çıkarma 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 ÇOKEĞER Soldan Sağa
14 || mantıksal VEYA Soldan Sağa
15 ?\: seçim (tek bir tam operatör) Soldan Sağa
16 = += -= *= /= atama aritmetik atama aritmetik atama Soldan Sağa
17 , sequence Soldan Sağa

Matris ve vektör işlemleri

Aritmetik operatörler, skaler değerlere uygulandığında skaler sonuç verir. Modülo dışındaki operatörler için bir operand skaler, diğeri ise vektör veya matris ise işlem bileşen bazında gerçekleştirilir ve aynı vektör veya matris türünde sonuç verir. Her iki işlem de aynı boyutta vektörlerse işlem bileşen bazında gerçekleştirilir (ve aynı vektör türünü döndürür).

İşlem Açıklama
m = f * m Skaler değere göre bileşen bazında matris çarpımı
v = f * v Skaler değerle bileşen bazında vektör çarpımı
v = v * v Bir vektör değerine göre bileşen bazında vektör çarpımı
m = m + m Matris bileşenlerine göre toplama
m = m - m Matris bileşenlerine göre çıkarma
m = m * m Doğrusal cebirsel çarpma

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

İşlem Açıklama
m = v * m Satır vektörü * matris lineer cebirsel çarpma
m = m * v Matris * sütun vektörü lineer cebirsel çarpma

Vektör nokta çarpımı, çapraz ç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ğere göre arama-döndürme
Yineleme for (<init>;<test>;<next>)
{ break, continue }
Seçim if ( ) { }
if ( ) { } else { }
switch () { break, case } - varsayılan durum son
Atla break, continue, return
(atılmasına izin verilmez)
Giriş half4 main(float2 fragCoord)

For döngüsü sınırlamaları

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 sırasında hesaplanabilmesi için başlatıcının, test koşulunun ve next ifadesinin sabit 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 olabilir.

Bu işlevlerin çoğu bileşen bazında çalışır (işlev bileşen başına uygulanır). Bu durum söz konusu değilse bu durum belirtilir.

Açı ve trigonometrik fonksiyonlar

Açı olarak belirtilen işlev parametrelerinin radyan cinsinden olduğu varsayılır. Bu işlevlerden hiçbiri hiçbir durumda sıfıra bölme hatasına neden olmaz. Bir oranın böleni 0 ise sonuçlar tanımlanmaz.

İş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 teğet
GT asin(GT x) $ \left[-{\pi\over 2},{\pi\over 2}\right] $ aralığında sinüsü x olan bir açı döndürür.
GT acos(GT x) $ \left[0,\pi\right] $ aralığında kosinüsü 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) $ \left[-{\pi\over 2},{\pi\over 2}\right] $ aralığında trigonometrik arktanjantı y_over_x olan bir açı döndürür.

Üssel fonksiyonlar

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

Sık kullanılan 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 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 değerinin kesirli kısmını döndürür
GT mod(GT x, GT y) x modülü y değerini döndürür
GT mod(GT x, float y) x modülü y değerini döndürür
GT min(GT x, GT y) x veya y değerinin minimum değerini döndürür
GT min(GT x, float y) x veya y değerinin minimum değerini döndürür
GT max(GT x, GT y) x veya y değerinin maksimum değerini döndürür
GT max(GT x, float y) x veya y değerinin maksimum değerini döndürür
GT clamp(GT x, GT minVal, GT maxVal) x değerini minVal ile maxVal arasında sarmalayarak döndürür.
GT clamp(GT x, float minVal, float maxVal) x değerini minVal ile maxVal arasında sabitlenmiş olarak döndürür
GT saturate(GT x) x değerini 0,0 ile 1,0 arasında sabitlenmiş olarak döndürür
GT mix(GT x, GT y, GT a) x ve y değerlerinin doğrusal karışımını döndürür
GT mix(GT x, GT y, float a) x ve y değerlerinin doğrusal karışımını döndürür
GT step(GT edge, GT x) x < kenar ise 0,0, aksi takdirde 1,0 değerini döndürür
GT step(float edge, GT x) x < kenar ise 0,0, aksi takdirde 1,0 değerini döndürür
GT smoothstep(GT edge0, GT edge1, GT x) edge0 < x < edge1 olduğunda 0 ile 1 arasında Hermite enterpolasyonu gerçekleştirir
GT smoothstep(float edge0, float edge1, GT x) edge0 < x < edge1 olduğunda 0 ile 1 arasında Hermite enterpolasyonu gerçekleştirir

Geometrik işlevler

Bu işlevler, bileşen bazında değil, vektör olarak çalışır. GT, 2-4 boyutlarında 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) Nokta çarpımını döndürme
float3/half3 cross(float3/half3 x, float3/half3 y) İade çapraz çarpımı
GT normalize(GT x) Vektörü 1 uzunluğunda olacak şekilde normalleştirme
GT faceforward(GT N, GT I, GT Nref) dot(Nref, I) < 0 ise N, aksi takdirde -N değerini döndürür.
GT reflect(GT I, GT N) Yansıma yönü I - 2 * dot(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

mat türü, herhangi bir kare matris türüdür.

İşlev Açıklama
mat matrixCompMult(mat x, mat y) x'i y ile bileşen bazında çarpma
mat inverse(mat m) m değerinin tersini döndürür

Vektör ilişkisel işlevleri

x ve y değerlerini bileşen bazında karşılaştırın. Belirli bir çağrı için giriş ve döndürülen vektörlerin boyutları eşleşmelidir. T, tam sayı ve 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 bileşenlerinden herhangi biri true ise true
bool all(BV x) x'in tüm bileşenleri true ise true.
BV not(BV x) x'in mantıksal tamamlayıcısı

Renk işlevleri

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

Gölgelendirici örnekleme (değerlendirme)

Örnekleyici türleri desteklenmez ancak diğer gölgelendiricileri değerlendirebilirsiniz. Bir dokudan örnek almanız gerekiyorsa BitmapShader nesnesi oluşturabilir ve bunu üniforma olarak ekleyebilirsiniz. Bunu herhangi bir gölgelendirici için yapabilirsiniz. Diğer RuntimeShader nesneleri dahil olmak üzere herhangi bir Android gölgelendiriciyi önce Bitmap'e dönüştürmeden doğrudan değerlendirebilirsiniz. Bu, çok fazla esneklik sağlar ancak karmaşık gölgelendiricilerin, özellikle döngüde değerlendirilmesi pahalı olabilir.

uniform shader image;

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

Ham tampon örnekleme

Çoğu resim, renk yönetimi yapılması gereken renkler içerir.Ancak bazı resimler, normalleri, malzeme özelliklerini (ör. pürüzlülük), yükseklik haritalarını veya bir resimde depolanmış olan tamamen matematiksel verileri depolayan resimler de dahil olmak üzere aslında renk olmayan veriler içerir. AGSL'de bu tür resimleri kullanırken RuntimeShader#setInputBuffer'ı kullanarak genel bir ham arabellek olarak BitmapShader kullanabilirsiniz. Bu sayede renk alanı dönüşümleri ve filtreleme önlenir.