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.