AGSL dirancang agar sebagian besar kompatibel dengan GLSL ES 1.0. Untuk mengetahui informasi selengkapnya, lihat fungsi yang setara dalam dokumentasi Bahasa Shading OpenGL ES. Jika memungkinkan, dokumentasi ini mencoba menjelaskan perbedaan antara AGSL dan GLSL.
Jenis
AGSL mendukung jenis GLSL ES 1.0 beserta cara lain untuk merepresentasikan jenis vektor
dan matriks. AGSL mendukung jenis short
dan half
tambahan untuk merepresentasikan
presisi sedang.
Jenis dasar
Jenis | Deskripsi |
---|---|
void
|
Tidak ada nilai yang ditampilkan fungsi atau daftar parameter kosong. Tidak seperti di GLSL, fungsi tanpa jenis nilai yang ditampilkan void harus menampilkan nilai. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) . |
Skalar/vektor Boolean |
int, ivec2, ivec3, ivec4 (int2, int3, int4) |
highp bilangan bulat/vektor bertanda tangan
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
Skalar/vektor/skalar floating point highp (presisi tunggal) |
short, short2, short3, short4
|
setara dengan bilangan bulat/vektor
bertanda mediump int |
half, half2, half3, half4 |
ekuivalen dengan skalar/vektor mediump float |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) |
Matriks float 2x2, 3x3, 4x4
|
half2x2, half3x3, half4x4 |
Setara dengan mediump float jenis matriks |
Presisi dan rentang minimum
Ini adalah presisi dan rentang minimum yang dijamin terkait dengan setiap
pengubah berdasarkan spesifikasi OpenGL ES 2.0. Karena sebagian besar perangkat
mendukung ES 3.0, perangkat tersebut akan memiliki presisi/rentang highp
dan
rentang int mediump
yang lebih terjamin. Pengubah presisi dapat diterapkan pada variabel serta parameter skalar, vektor, dan matriks. Hanya nilai minimum yang tercantum di bawah yang dijamin;
lowp
tidak selalu memiliki presisi yang lebih rendah daripada mediump
, dan mediump
tidak selalu memiliki presisi yang lebih rendah daripada highp
. AGSL saat ini mengonversi lowp
menjadi mediump
di output akhir.
Pengubah | rentang 'float' | rentang magnitudo 'float' | presisi 'float' | rentang 'int' |
---|---|---|---|---|
tinggi | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | Kerabat: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
Medium | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | Kerabat: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
Lowp | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | Absolut: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
Selain sintaksis subskrip numerik array, misalnya: 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
- Gunakan saat mengakses vektor yang merepresentasikan titik/normal
vect.rgba
- Gunakan saat mengakses vektor yang merepresentasikan warna
vect.LTRB
- Gunakan saat vektor merepresentasikan persegi panjang (bukan dalam GLSL)
Dalam AGSL, 0 dan 1 dapat digunakan untuk menghasilkan konstanta 0 atau 1 di saluran itu.
Contoh: vect.rgb1 == vec4(vect.rgb,1)
Struktur dan array
Struktur dideklarasikan dengan sintaksis yang sama seperti GLSL, tetapi AGSL hanya mendukung struktur pada cakupan global.
struct type-name {
members
} struct-name; // optional variable declaration.
Hanya array 1 dimensi yang didukung dengan ukuran array eksplisit, menggunakan sintaksis gaya C atau GLSL:
<jenis dasar>[<array size>] nama variabel - misalnya: half[10] x;
<jenis dasar> nama variabel[<array size>] - mis: half x[10];
Array tidak dapat dikembalikan dari fungsi, disalin, ditugaskan, atau dibandingkan. Pembatasan array menyebar ke struktur yang berisi array. Array hanya dapat diindeks menggunakan konstanta atau variabel loop.
Kualifikasi
Jenis | Deskripsi |
---|---|
const
|
Konstanta waktu kompilasi, atau parameter fungsi hanya-baca. |
uniform
|
Nilai tidak berubah di seluruh primitif yang diproses.
Seragam diteruskan dari Android menggunakan
metode RuntimeShader
untuk setColorUniform , setFloatUniform ,
setIntUniform , setInputBuffer , dan
setInputShader . |
in
|
Untuk parameter fungsi yang diteruskan. Ini adalah defaultnya. |
out
|
Untuk parameter fungsi yang diteruskan. Harus menggunakan presisi yang sama seperti definisi fungsi. |
inout
|
Untuk parameter yang diteruskan dan dikeluarkan dari fungsi. Harus menggunakan presisi yang sama seperti definisi fungsi. |
Deklarasi variabel
Pernyataan harus berada dalam cakupan kurung kurawal yang eksplisit. Deklarasi y
dalam
contoh berikut tidak diizinkan:
if (condition)
int y = 0;
Dasar-dasar matriks/struktur/array
Contoh konstruktor matriks
Jika matriks dibuat dengan satu nilai, semua nilai di sepanjang diagonal diberi nilai tersebut, sedangkan nilai lainnya diberi nol. Oleh karena itu, float2x2(1.0)
akan membuat matriks identitas 2x2.
Jika matriks dibuat dengan beberapa nilai, kolom akan diisi terlebih dahulu (urutan utama kolom).
Perlu diperhatikan bahwa, tidak seperti GLSL, konstruktor yang mengurangi jumlah komponen vektor yang diteruskan tidak didukung, tetapi Anda dapat menggunakan swizzling untuk memiliki efek yang sama. Untuk membuat vec3
dari vec4
di AGSL dengan perilaku yang sama seperti
GLSL, tentukan vec3 nv = quadVec.xyz
.
Contoh konstruktor struktur
struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));
Komponen matriks
Mengakses komponen matriks dengan sintaksis subskrip array.
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
Kolom struktur
Pilih kolom struktur menggunakan operator periode .
. Operator meliputi:
Operator | Deskripsi |
---|---|
. |
pemilih kolom |
==, != |
kesetaraan |
= |
penetapan |
Elemen array
Elemen array diakses menggunakan operator subskrip array [ ]
. Contoh:
diffuseColor += lightIntensity[3] * NdotL;
Operator
Dinomori sesuai urutan prioritas. Operator relasional dan kesetaraan > < <= >= == != dievaluasi ke Boolean. Untuk membandingkan vektor
berdasarkan komponen, gunakan fungsi seperti lessThan()
, equal()
, dll.
Operator | Deskripsi | Asosiativitas | |
---|---|---|---|
1 | () |
pengelompokan tanda kurung | T/A |
2 | [] () . ++ --
|
array subskrip panggilan fungsi & kolom struktur konstruktor atau pemilih metode, penambahan dan pengurangan swizzle postfix | Kiri ke Kanan |
3 | ++ -- + - !
|
penambahan awalan dan pengurangan unary | Kanan ke Kiri |
4 | * / |
mengalikan dan membagi | Kiri ke Kanan |
5 | + - |
tambah dan kurangi | Kiri ke Kanan |
7 | < > <= >= |
relasional | Kiri ke Kanan |
8 | == != |
kesetaraan/ketidaksetaraan | Kiri ke Kanan |
12 | && |
logika AND | Kiri ke Kanan |
13 | ^^ |
XOR logis | Kiri ke Kanan |
14 | || |
logika OR | Kiri ke Kanan |
15 | ?\:
|
pilihan (satu keseluruhan operand) | Kiri ke Kanan |
16 | = += -= *= /=
|
aritmatika tugas aritmatika tugas assignment aritmatika assignment aritmatika | Kiri ke Kanan |
17 | , |
urutan | Kiri ke Kanan |
Operasi matriks dan vektor
Ketika diterapkan pada nilai skalar, operator aritmatika menghasilkan skalar. Untuk operator selain modulo, jika satu operand adalah skalar dan yang lainnya adalah vektor atau matriks, operasi akan dilakukan secara componentwise dan menghasilkan jenis vektor atau matriks yang sama. Jika kedua operasi adalah vektor dengan ukuran yang sama, operasi akan dilakukan secara componentwise (dan menampilkan jenis vektor yang sama).
Operasi | Deskripsi |
---|---|
m = f * m |
Perkalian matriks komponen-{i>wise<i} dengan nilai skalar |
v = f * v |
Perkalian vektor komponen-{i>wise<i} dengan nilai skalar |
v = v * v |
Perkalian vektor komponen-{i>wise<i} dengan nilai vektor |
m = m + m |
Penjumlahan komponen matriks |
m = m - m |
Pengurangan komponen matriks |
m = m * m |
Perkalian aljabar linear |
Jika satu operand adalah vektor yang cocok dengan ukuran baris atau kolom matriks, operator perkalian dapat digunakan untuk melakukan perkalian baris dan kolom aljabar.
Operasi | Deskripsi |
---|---|
m = v * m |
Vektor baris * perkalian aljabar linear matriks |
m = m * v |
Perkalian aljabar linear vektor matriks * kolom |
Gunakan fungsi bawaan untuk perkalian titik vektor, perkalian silang, dan perkalian berbasis komponen:
Fungsi | Deskripsi |
---|---|
f = dot(v, v) |
Produk titik vektor |
v = cross(v, v) |
Perkalian silang vektor |
m = matrixCompMult(m, m) |
Pengali komponen-{i>wise<i} |
Kontrol program
Panggilan fungsi | Memanggil dengan value-return |
---|---|
Iterasi/Pengulangan | for (<init>;<test>;<next>) { break, continue } |
Pilihan | if ( ) { } if ( ) { } else { } switch () { break, case }
- kasus default terakhir |
Lompat | break, continue, return (buang tidak diizinkan) |
Entri | half4 main(float2 fragCoord) |
Batasan loop for
Serupa dengan GLSL ES 1.0, loop 'for' cukup terbatas; compiler harus dapat
membongkar loop. Artinya, penginisialisasi, kondisi pengujian, dan
pernyataan next
harus menggunakan konstanta agar semuanya dapat dihitung pada waktu
kompilasi. Pernyataan next
lebih lanjut dibatasi untuk menggunakan ++, --, +=, or -=
.
Fungsi bawaan
GT
(jenis umum) adalah float
, float2
, float3
, float4
atau
half
, half2
, half3
, half4
.
Sebagian besar fungsi ini beroperasi berdasarkan komponen (fungsi diterapkan per komponen). Perlu dicatat jika hal tersebut tidak terjadi.
Fungsi sudut & trigonometri
Parameter fungsi yang ditentukan sebagai sudut diasumsikan dalam satuan radian. Dalam situasi apa pun, fungsi ini tidak akan menghasilkan error pembagian dengan nol. Jika pembagi rasio adalah 0, maka hasilnya tidak akan terdefinisi.
Fungsi | Deskripsi |
---|---|
GT radians(GT degrees) |
Mengubah derajat menjadi radian |
GT degrees(GT radians) |
Mengubah radian ke derajat |
GT sin(GT angle) |
Sinus standar |
GT cos(GT angle) |
Kosinus standar |
GT tan(GT angle) |
Tangen standar |
GT asin(GT x)
|
Menampilkan sudut dengan sinus x dalam rentang $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
GT acos(GT x)
|
Menampilkan sudut yang kosinusnya adalah x dalam rentang $ \left[0,\pi\right] $ |
GT atan(GT y, GT x)
|
Menampilkan sudut yang arctangen trigonometrinya adalah $ \left[{y\over x}\right] $ dalam rentang $ \left[-\pi,\pi\right] $ |
GT atan(GT y_over_x)
|
Menampilkan sudut dengan garis bujur
trigonometrinya adalah y_over_x dalam rentang $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
Fungsi eksponensial
Fungsi | Deskripsi |
---|---|
GT pow(GT x, GT y) |
Menampilkan $ x^y $ |
GT exp(GT x) |
Menampilkan $ e^x $ |
GT log(GT x) |
Mengembalikan $ ln(x) $ |
GT exp2(GT x) |
Menampilkan $ 2^x $ |
GT log2(GT x) |
Menampilkan $ log_2(x) $ |
GT sqrt(GT x) |
Menampilkan $ \sqrt{x} $ |
GT inversesqrt(GT x) |
Mengembalikan $ 1\over{\sqrt{x}} $ |
Fungsi umum
Fungsi | Deskripsi |
---|---|
GT abs(GT x) |
Nilai mutlak |
GT sign(GT x) |
Menampilkan -1,0, 0,0, atau 1,0 berdasarkan tanda x |
GT floor(GT x) |
Bilangan bulat terdekat <= x |
GT ceil(GT x) |
Bilangan bulat terdekat >= x |
GT fract(GT x) |
Menampilkan bagian pecahan dari x |
GT mod(GT x, GT y) |
Menampilkan nilai x modulo y |
GT mod(GT x, float y) |
Menampilkan nilai x modulo y |
GT min(GT x, GT y) |
Menampilkan nilai minimum x atau y |
GT min(GT x, float y) |
Menampilkan nilai minimum x atau y |
GT max(GT x, GT y) |
Menampilkan nilai maksimum x atau y |
GT max(GT x, float y) |
Menampilkan nilai maksimum x atau y |
GT clamp(GT x, GT
minVal, GT maxVal) |
Menampilkan x yang dikunci antara minVal dan maxVal. |
GT clamp(GT x, float
minVal, float maxVal) |
Menampilkan x yang dijepit antara minVal dan maxVal |
GT saturate(GT x) |
Menampilkan x yang dijepit antara 0,0 dan 1,0 |
GT mix(GT x, GT y
GT a) |
Menampilkan gabungan linear x dan y |
GT mix(GT x, GT y,
float a) |
Menampilkan gabungan linear x dan y |
GT step(GT edge, GT x) |
Menampilkan 0,0 jika x < edge, jika tidak 1,0 |
GT step(float edge,
GT x) |
Menampilkan 0,0 jika x < edge, jika tidak 1,0 |
GT smoothstep(GT edge0,
GT edge1, GT x) |
Melakukan interpolasi Hermite antara 0 dan 1 saat edge0 < x < edge1 |
GT smoothstep(float
edge0, float edge1,
GT x) |
Melakukan interpolasi Hermite antara 0 dan 1 saat edge0 < x < edge1 |
Fungsi geometri
Fungsi-fungsi ini beroperasi pada vektor sebagai vektor, bukan {i>component-wise<i}. GT adalah vektor float/setengah dalam ukuran 2-4.
Fungsi | Deskripsi |
---|---|
float/half length
(GT x) |
Menampilkan panjang vektor |
float/half distance(GT
p0, GT p1) |
Menampilkan jarak antartitik |
float/half dot(GT x,
GT y) |
Menampilkan produk titik |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
Menampilkan lintas produk |
GT normalize(GT x) |
Normalisasi vektor ke panjang 1 |
GT faceforward(GT N,
GT I, GT Nref) |
Menampilkan N jika dot(Nref, I) < 0, else -N. |
GT reflect(GT I, GT N) |
Arah pantulan I - 2 * titik(N,I) * N. |
GT refract(GT I, GT N,
float/half eta) |
Menampilkan vektor refraksi |
Fungsi matriks
Jenis mat adalah jenis matriks persegi.
Fungsi | Deskripsi |
---|---|
mat matrixCompMult(mat
x, mat y) |
Kalikan x dengan y berdasarkan komponen |
mat inverse(mat m) |
Menampilkan invers dari m |
Fungsi relasional vektor
Bandingkan komponen x dan y. Ukuran vektor input dan return untuk panggilan tertentu harus cocok. T adalah gabungan jenis vektor integer dan floating point. BV adalah vektor boolean yang mencocokkan ukuran vektor input.
Fungsi | Deskripsi |
---|---|
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) |
true jika salah satu komponen x adalah true |
bool all(BV x) |
true jika semua komponen x adalah true . |
BV not(BV x) |
komplemen logis dari x |
Fungsi warna
Fungsi | Deskripsi |
---|---|
vec4 unpremul(vec4
color) |
Mengonversi nilai warna ke alfa non-premultiplied |
half3 toLinearSrgb(half3
color) |
Transformasi ruang warna ke SRGB linear |
half3 fromLinearSrgb(half3
color) |
Transformasi ruang warna |
Pengambilan sampel shader (evaluasi)
Jenis sampler tidak didukung, tetapi Anda dapat mengevaluasi shader lainnya. Jika perlu mengambil sampel tekstur, Anda dapat membuat objek BitmapShader, dan menambahkannya sebagai seragam. Anda dapat melakukannya untuk shader apa pun, yang berarti Anda dapat langsung mengevaluasi Android Shader apa pun tanpa mengubahnya menjadi Bitmap terlebih dahulu, termasuk objek RuntimeShader lainnya. Hal ini memungkinkan jumlah fleksibilitas yang sangat besar, tetapi shader yang kompleks bisa jadi mahal untuk dievaluasi, terutama dalam loop.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
Sampling buffer mentah
Meskipun sebagian besar gambar berisi warna yang harus diatur warnanya, beberapa gambar berisi data yang sebenarnya bukan warna, termasuk gambar yang menyimpan warna normal, properti material (misalnya kekasaran), peta ketinggian, atau data matematika murni lainnya yang disimpan dalam gambar. Saat menggunakan jenis gambar ini di AGSL, Anda dapat menggunakan BitmapShader sebagai buffer mentah generik menggunakan RuntimeShader#setInputBuffer. Ini akan menghindari transformasi dan pemfilteran ruang warna.