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.