AGSL, GLSL ES 1.0 ile büyük ölçüde uyumlu olacak şekilde tasarlanmıştır. Daha fazla bilgi için eşdeğer fonksiyonu OpenGL ES Gölgelendirme Dili dokümanları. Bu belgede, mümkün olduğunda AGSL arasındaki farklılıklar vurgulanmaya çalışılır. ve GLSL.
Türler
AGSL, vektörü göstermenin ek bir yöntemiyle birlikte GLSL ES 1.0 türlerini destekler.
ve matris türleri. AGSL, temsil edilen ek short
ve half
türlerini destekler
hassastır.
Temel türler
Tür | Açıklama |
---|---|
void
|
Hiçbir işlev değeri döndürmüyor veya boş parametre yok liste'ye dokunun. GLSL'nin aksine, boşluk içermeyen işlevler dönüş türü bir değer döndürmelidir. |
bool, bvec2, bvec3, bvec4 yerine . (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 duyarlıklı) kayan nokta
skaler/vektör |
short, short2, short3, short4
|
mediump int imzalı
tam sayı/vektör |
half, half2, half3, half4 |
mediump float skaler/vektöre eşdeğerdir |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) |
2x2, 3x3, 4x4 float matrisi
|
half2x2, half3x3, half4x4 |
mediump float matris türüne eşdeğer |
Hassasiyet ve aralık minimum değerleri
Bunlar, her bir öğeyle ilişkili minimum kesinlik ve aralıktır
değiştiricisi olarak tanımlanmıştır. Çoğu cihazdan
destekleri ES 3.0'ı desteklediğinde daha fazla garanti edilen highp
hassasiyet/aralık ve
int mediump
aralık. Hassasiyet değiştiriciler skaler, vektör ve
ve matris değişkenlerini ve parametrelerini kullanır. Yalnızca aşağıda listelenen minimum şartlar garanti edilir;
lowp
öğesinin, mediump
ve mediump
ile karşılaştırıldığında daha düşük hassasiyet olması gerekmez.
highp
değerinden daha düşük hassasiyetli olması gerekmez. AGSL şu anda lowp
dönüştürüyor
son çıkışta mediump
olarak değişecektir.
Değiştirici | "kayan" aralık | "kayan" büyüklük aralığı | "kayan" kesinlik | "int" aralık |
---|---|---|---|---|
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 simge 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ı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, ilgili kanalda sabit bir 0 veya 1 değeri üretmek için kullanılabilir.
Örnek: vect.rgb1 == vec4(vect.rgb,1)
Yapılar ve diziler
Yapılar, GLSL ile aynı söz dizimiyle beyan edilir ancak AGSL yalnızca şunları destekler: projeler üzerinde çalıştım.
struct type-name {
members
} struct-name; // optional variable declaration.
Yalnızca 1 boyutlu diziler, aşağıdakileri içeren açık bir dizi boyutuyla desteklenir: C stili veya GLSL stili söz dizimi:
<base type>[<dizi boyutu>] değişken adı - ör: half[10] x;
<temel türü> değişken adı[<dizi boyutu>] - ör. 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 dizine yalnızca sabit değer veya döngü değişkeni kullanılarak eklenebilir.
Eleme maçları
Tür | Açıklama |
---|---|
const
|
Derleme süresi sabiti veya salt okunur işlev parametresinden sonra bir değer girin. |
uniform
|
Değer, temel öğe genelinde değişmez
bir şablondur.
Üniformalar Android'den
Çalışma Zamanı Gölgelendirici
setColorUniform , setFloatUniform için yöntemler,
setIntUniform , setInputBuffer ve
setInputShader . |
in
|
Aktarılan işlev parametreleri için. Bu, varsayılandır. |
out
|
Dışa aktarılan işlev parametreleri için. Kullanılmalı fonksiyon tanımıyla aynı hassasiyete sahiptir. |
inout
|
Hem içeri hem de aktarılan parametreler için bir fonksiyonun tanımıdır. ile aynı hassasiyet kullanılmalıdır. irdeleyelim. |
Değişken bildirimi
Beyanlar açık bir desteklenmiş kapsamda olmalıdır. Şu dokümandaki y
beyanı:
şu örneğe izin verilmiyor:
if (condition)
int y = 0;
Matris/yapı/dizi ile ilgili temel bilgiler
Matris kurucu örnekleri
Bir matris tek bir değerle oluşturulduğunda,
köşegene bu değer verilirken geri kalanına sıfır verilir. float2x2(1.0)
bu nedenle 2x2'lik bir özdeş matrisi oluşturun.
Bir matris birden fazla değerle oluşturulduğunda, önce sütunlar doldurulur (sütun-ana sıra).
GLSL'den farklı olarak, bir
aktarılan vektör desteklenmez ancak aynı
etkisi. AGSL'de vec4
etiketinden aynı davranışa sahip bir vec3
oluşturmak için
GLSL, 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 dizimiyle birlikte bir 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 şunları içerir:
Operatör | Açıklama |
---|---|
. |
alan seçici |
==, != |
eşitlik |
= |
atama |
Dizi öğeleri
Dizi öğelerine, [ ]
dizi alt simge operatörü kullanılarak erişilir. Örnek:
diffuseColor += lightIntensity[3] * NdotL;
Operatörler
Öncelik sırasına göre numaralandırılır. İlişkisel ve eşitlik
operatörler > < <= >= == != Boole olarak değerlendirin. Vektörleri karşılaştırmak için
bileşen olarak lessThan()
, equal()
vb. işlevleri kullanın.
Operatör | Açıklama | İlişki | |
---|---|---|---|
1 | () |
parantez içinde gruplandırma | Yok |
2 | [] () . ++ --
|
dizi alt simgesi işlev çağrısı & kurucu yapı alan veya yöntem seçici, swizzle sonek artımı ve azalt | Soldan Sağa |
3 | ++ -- + - !
|
önek artışı ve birli azalma | Sağdan Sola |
4 | * / |
çarp ve böl | 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 ÖZELVEYA | Soldan Sağa |
14 | || |
mantıksal VEYA | Soldan Sağa |
15 | ?\:
|
seçim (tüm bir işlenen) | Soldan Sağa |
16 | = += -= *= /=
|
atama aritmetiği atama aritmetiği atama | Soldan Sağa |
17 | , |
sequence | Soldan Sağa |
Matris ve vektör işlemleri
Skaler değerlere uygulandığında aritmetik operatörler skaler sonucunu verir. Örneğin, işleçlerinden biri skaler ise diğeri ise bir bileşen olarak gerçekleştirilir ve veya matris türünde olması gerekir. Her iki işlem de aynı boyuttaki vektörlerse, 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 |
Skaler bir değerle bileşen tabanlı matris çarpımı |
v = f * v |
Skaler bir değerle bileşen tabanlı vektör çarpma |
v = v * v |
Bir vektör değeriyle bileşen tabanlı vektör çarpma |
m = m + m |
Matris bileşeni bazında toplama |
m = m - m |
Matris bileşeni bazında çıkarma |
m = m * m |
Doğrusal cebirsel çarpım |
İşlem görenlerden biri, matrisimizin satır veya sütun boyutuyla eşleşen bir vektörse çarpma operatörü, cebirsel satır ve sütun çarpma işlemleri için 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örel doğrusal cebirsel çarpım |
Vektör nokta çarpımı, çapraz çarpım ve bileşen tabanlı çarpma:
İş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 tabanlı çarpma |
Program denetimi
İşlev çağrısı | Değer-getiri esasına göre arama |
---|---|
İterasyon | for (<init>;<test>;<next>) { break, continue } |
Seçim | if ( ) { } if ( ) { } else { } switch () { break, case }
- varsayılan destek kaydı sonuncu |
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, "for" döngüler çok sınırlıdır. derleyicinin bunu yapabilmesi gerekir:
döngüyü açar. Bu, başlatıcı, test koşulu ve
Her şeyin derleme sırasında hesaplanabilmesi için next
ifadesi sabit değerler kullanmalıdır
gerekir. next
ifadesi, ++, --, +=, or -=
kullanımıyla daha da 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 (fonksiyon başına bileşen). Bu mümkün değilse buna dikkat edin.
Açı ve trigonometrik fonksiyonlar
Açı olarak belirtilen işlev parametrelerinin radyan cinsinden olduğu varsayılır. Bu işlevlerden hiçbiri, hiçbir koşulda sıfıra bölünme hatasına yol açmaz. Öğe bir oranın böleni 0 ise sonuçlar tanımsız olur.
İşlev | Açıklama |
---|---|
GT radians(GT degrees) |
Dereceyi radyana dönüştürür |
GT degrees(GT radians) |
Radyanı 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ü aralık içinde x olan bir açı döndürür $ \left[-{\pi\over 2},{\pi\over 2}\tight] $ |
GT acos(GT x)
|
Kosinüsü x olan bir açı döndürür $ \left[0,\pi\tight] $ aralığı |
GT atan(GT y, GT x)
|
Aşağıdaki açıyı döndüren: trigonometrik arktanjant $ \left[{y\over x}\tight] $ $ \left[-\pi,\pi\tight] $ aralığı |
GT atan(GT y_over_x)
|
Trigonometrik açıyı döndürür
arktanjant, aralıkta y_over_x değerine sahip
$ \left[-{\pi\over 2},{\pi\over 2}\tight] $ |
Üstel fonksiyonlar
İşlev | Açıklama |
---|---|
GT pow(GT x, GT y) |
x^y $ değerini döndürür |
GT exp(GT x) |
$ e^x $ döndürür. |
GT log(GT x) |
$ ln(x) $ döndürür |
GT exp2(GT x) |
$2^x $ 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 |
Sık kullanılan işlevler
İşlev | Açıklama |
---|---|
GT abs(GT x) |
Mutlak değer |
GT sign(GT x) |
x işaretine bağlı olarak -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 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) |
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ında 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 ile 1,0 arasında sınırlandırılmış 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 < ise 0,0 döndürür kenar, aksi takdirde 1.0 |
GT step(float edge,
GT x) |
x < ise 0,0 döndürür kenar, aksi takdirde 1.0 |
GT smoothstep(GT edge0,
GT edge1, GT x) |
Hermite interpolasyonu gerçekleştirir kenar0 < olduğunda 0 ile 1 arasında x < kenar1 |
GT smoothstep(float
edge0, float edge1,
GT x) |
Hermite interpolasyonu gerçekleştirir kenar0 < olduğunda 0 ile 1 arasında x < kenar1 |
Geometrik fonksiyonlar
Bu fonksiyonlar, vektörler üzerinde bileşen değil, vektör olarak çalışır. GT, 2-4 arasındaki boyutlardaki kayan/yarı vektörlerdir.
İşlev | Açıklama |
---|---|
float/half length
(GT x) |
Vektör 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ürür |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
Çapraz ürün iadesi |
GT normalize(GT x) |
Vektörü 1. uzunlukta normalleştir |
GT faceforward(GT N,
GT I, GT Nref) |
Nokta(Nref, I) < ise N sonucunu döndürür 0, aksi takdirde -N. |
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) |
Bileşen olarak x'i y ile çarpın |
mat inverse(mat m) |
m'nin tersini döndürür |
Vektör ilişkisel fonksiyonları
x ve y'yi bileşenlere göre 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 tamamlaması |
Renk işlevleri
İşlev | Açıklama |
---|---|
vec4 unpremul(vec4
color) |
Renk değerini önceden çarpılmayan değerine dönüştürür alfa |
half3 toLinearSrgb(half3
color) |
Renk alanını doğrusal SRGB'ye dönüştürme |
half3 fromLinearSrgb(half3
color) |
Renk alanı dönüştürme |
Gölgelendirici örnekleme (değerlendirme)
Örnekleyici türleri desteklenmez ancak diğer gölgelendiricileri değerlendirebilirsiniz. İhtiyacınız varsa örneklendirmek için tablodaki BitmapShader nesnesini tanımlayıp olduğunu lütfen unutmayın. Bunu herhangi bir gölgelendirici için yapabilirsiniz. Böylece, herhangi bir Android Shader'ı İlk olarak bit eşleme, RuntimeShader nesneleri. Bu da büyük ölçüde esneklik sağlar, ancak karmaşık gölgelendiriciler bir döngü içinde değerlendirilebilir.
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çeriyor olsa da bazı resimler normal değerleri depolayan resimler, malzeme özellikleri (ör. pürüzlülük), yükseklik haritaları veya tamamen başka herhangi bir depolanan matematiksel verileri ifade eder. Bu türler kullanılırken bir BitmapShader'ı genel bir ham arabellek olarak kullanabilirsiniz. RuntimeShader#setInputBuffer. Böylece renk alanı dönüştürmeleri ve filtrelemeden kaçınmış olursunuz.