AGSL được thiết kế để tương thích phần lớn với GLSL ES 1.0. Để biết thêm thông tin, hãy xem hàm tương đương trong tài liệu về Ngôn ngữ tạo bóng OpenGL ES. Khi có thể, tài liệu này sẽ chỉ ra sự khác biệt giữa AGSL và GLSL.
Loại
AGSL hỗ trợ các loại GLSL ES 1.0 cùng với một cách khác để biểu thị các kiểu vectơ và ma trận. AGSL hỗ trợ thêm các loại short
và half
để thể hiện độ chính xác trung bình.
Các kiểu cơ bản
Loại | Nội dung mô tả |
---|---|
void
|
Không có giá trị trả về của hàm hoặc danh sách tham số trống. Không giống như trong GLSL, các hàm không có kiểu dữ liệu trả về rỗng phải trả về một giá trị. |
bool, bvec2, bvec3, bvec4 (bool2, bool3, bool4) . |
Đại lượng vô hướng/vectơ Boolean |
int, ivec2, ivec3, ivec4 (int2, int3, int4) |
highp số nguyên/vectơ đã ký
|
float, vec2, vec3, vec4 (float2, float3, float4)
|
Dấu phẩy động vô hướng/vectơ highp (độ chính xác đơn) |
short, short2, short3, short4
|
tương đương với mediump int số nguyên/vectơ đã ký |
half, half2, half3, half4 |
tương đương với đại lượng vô hướng/vectơ mediump float |
mat2, mat3, mat4 (float2x2, float3x3, float4x4) |
Ma trận 2x2, 3x3, 4x4 float
|
half2x2, half3x3, half4x4 |
Tương đương với các loại ma trận mediump float |
Độ chính xác và phạm vi tối thiểu
Đây là phạm vi và độ chính xác tối thiểu được đảm bảo liên kết với từng đối tượng sửa đổi dựa trên thông số kỹ thuật OpenGL ES 2.0. Vì hầu hết các thiết bị đều hỗ trợ ES 3.0, nên các thiết bị đó sẽ có độ chính xác/phạm vi highp
và phạm vi int mediump
được đảm bảo hơn. Bạn có thể áp dụng đối tượng sửa đổi độ chính xác cho các biến và tham số vô hướng, vectơ và ma trận. Chỉ các giá trị nhỏ nhất liệt kê dưới đây mới được đảm bảo; lowp
không nhất thiết thực sự có độ chính xác thấp hơn mediump
và mediump
không hẳn là có độ chính xác thấp hơn highp
. AGSL hiện chuyển đổi lowp
thành mediump
trong kết quả cuối cùng.
Phương thức sửa đổi (modifier) | Phạm vi "float" | Phạm vi cường độ "float" | Độ chính xác "float" | phạm vi "int" |
---|---|---|---|---|
cao nhất | \(\left\{-2^{62},2^{62}\right\}\) | \(\left\{2^{-62},2^{62}\right\}\) | Tương đối: \(2^{-16}\) | \(\left\{-2^{16},2^{16}\right\}\) |
trung bình | \(\left\{-2^{14},2^{14}\right\}\) | \(\left\{2^{-14},2^{14}\right\}\) | Tương đối: \(2^{-10}\) | \(\left\{-2^{10},2^{10}\right\}\) |
thấp | \(\left\{-2,2\right\}\) | \(\left\{2^{-8},2\right\}\) | Tuyệt đối: \(2^{-8}\) | \(\left\{-2^{8},2^{8}\right\}\) |
Ngoài cú pháp chỉ số dưới dạng số của mảng, ví dụ: 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
– Sử dụng khi truy cập vào các vectơ đại diện cho điểm/pháp tuyến
vect.rgba
– Sử dụng khi truy cập vào các vectơ biểu diễn màu sắc
vect.LTRB
– Sử dụng khi vectơ đại diện cho một hình chữ nhật (không phải trong GLSL)
Trong AGSL, 0 và 1 có thể được sử dụng để tạo ra hằng số 0 hoặc 1 trong kênh đó.
Ví dụ: vect.rgb1 == vec4(vect.rgb,1)
Cấu trúc và mảng
Các cấu trúc được khai báo bằng cú pháp giống như GLSL, nhưng AGSL chỉ hỗ trợ các cấu trúc ở phạm vi toàn cầu.
struct type-name {
members
} struct-name; // optional variable declaration.
Chỉ các mảng 1 chiều mới được hỗ trợ với kích thước mảng rõ ràng, bằng cách sử dụng cú pháp kiểu C hoặc kiểu GLSL:
tên biến <loại cơ sở>[<mảng kích thước>] – ví dụ: half[10] x;
Tên biến <kiểu cơ sở> [<kích thước mảng>] – ví dụ: half x[10];
Không thể trả về mảng qua một hàm, đã được sao chép, được chỉ định hoặc so sánh. Các quy tắc hạn chế của mảng lan truyền đến các cấu trúc chứa mảng. Mảng chỉ có thể được lập chỉ mục bằng cách sử dụng hằng số hoặc biến vòng lặp.
Vòng loại
Loại | Nội dung mô tả |
---|---|
const
|
Hằng số thời gian biên dịch hoặc tham số hàm chỉ đọc. |
uniform
|
Giá trị không thay đổi trong quá trình xử lý gốc.
Đồng nhất được truyền từ Android bằng phương thức RuntimeShader cho setColorUniform , setFloatUniform , setIntUniform , setInputBuffer và setInputShader . |
in
|
Đối với các tham số của hàm được truyền vào. Đây là lựa chọn mặc định. |
out
|
Đối với các tham số của hàm đã bị truyền ra. Phải sử dụng độ chính xác tương tự như định nghĩa hàm. |
inout
|
Đối với các tham số được truyền vào và ra khỏi một hàm. Phải sử dụng độ chính xác tương tự như định nghĩa hàm. |
Khai báo biến
Thông tin khai báo phải nằm trong phạm vi được thiết lập rõ ràng. Phần khai báo y
trong mẫu sau không được phép:
if (condition)
int y = 0;
Kiến thức cơ bản về ma trận/cấu trúc/mảng
Ví dụ về hàm khởi tạo ma trận
Khi ma trận được tạo bằng một giá trị duy nhất, tất cả giá trị dọc theo đường chéo đều được cấp giá trị đó, còn các giá trị còn lại sẽ được cấp số 0. Do đó, float2x2(1.0)
sẽ tạo một ma trận nhận dạng 2x2.
Khi ma trận được tạo bằng nhiều giá trị, các cột sẽ được điền trước (thứ tự chính của cột).
Lưu ý rằng, không giống như GLSL, các hàm khởi tạo làm giảm số lượng thành phần của một vectơ đã truyền không được hỗ trợ, nhưng bạn có thể sử dụng swizzling để có cùng một hiệu ứng. Để tạo vec3
từ vec4
trong AGSL có hành vi tương tự như GLSL, hãy chỉ định vec3 nv = quadVec.xyz
.
Ví dụ về hàm khởi tạo cấu trúc
struct light { float intensity; float3 pos; };
// literal integer constants auto-converted to floating point
light lightVar = light(3, float3(1, 2, 3.0));
Thành phần ma trận
Truy cập các thành phần của ma trận bằng cú pháp chỉ số dưới mảng.
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
Trường cấu trúc
Chọn các trường cấu trúc bằng toán tử dấu chấm .
. Các toán tử bao gồm:
Toán tử | Nội dung mô tả |
---|---|
. |
bộ chọn trường |
==, != |
đẳng thức |
= |
bài tập |
Phần tử mảng
Các phần tử mảng được truy cập bằng cách sử dụng toán tử chỉ số dưới của mảng [ ]
. Ví dụ:
diffuseColor += lightIntensity[3] * NdotL;
Toán tử
Được đánh số theo thứ tự ưu tiên. Các toán tử quy chiếu và bằng > < <= >= == != sẽ đánh giá thành Boolean. Để so sánh các vectơ theo thành phần, hãy sử dụng các hàm như lessThan()
, equal()
, v.v.
Toán tử | Nội dung mô tả | Kết hợp | |
---|---|---|---|
1 | () |
nhóm dấu ngoặc đơn | Không áp dụng |
2 | [] () . ++ --
|
chỉ số dưới mảng | Trái sang Phải |
3 | ++ -- + - !
|
tăng tiền tố và giảm đơn nguyên | Phải sang Trái |
4 | * / |
nhân và chia | Trái sang Phải |
5 | + - |
cộng và trừ | Trái sang Phải |
7 | < > <= >= |
quan hệ | Trái sang Phải |
8 | == != |
bất đẳng thức/bất đẳng thức | Trái sang Phải |
12 | && |
hàm logic AND | Trái sang Phải |
13 | ^^ |
logic XOR | Trái sang Phải |
14 | || |
logic HOẶC | Trái sang Phải |
15 | ?\:
|
lựa chọn (toàn bộ toán hạng) | Trái sang Phải |
16 | = += -= *= /=
|
số học bài tập bài tập số học bài tập số học | Trái sang Phải |
17 | , |
trình tự | Trái sang Phải |
Ma trận và các phép toán vectơ
Khi áp dụng cho giá trị vô hướng, toán tử số học sẽ cho ra đại lượng vô hướng. Đối với các toán tử không phải modulo, nếu một toán hạng là đại lượng vô hướng và toán tử còn lại là vectơ hoặc ma trận, thì toán tử được thực hiện thành phần và dẫn đến cùng một loại vectơ hoặc ma trận. Nếu cả hai toán tử đều là các vectơ có cùng kích thước, thì thao tác sẽ được thực hiện theo từng thành phần (và trả về cùng một kiểu vectơ).
Hoạt động | Nội dung mô tả |
---|---|
m = f * m |
Phép nhân ma trận của thành phần theo giá trị vô hướng |
v = f * v |
Phép nhân vectơ theo thành phần theo thành phần với giá trị vô hướng |
v = v * v |
Nhân vectơ theo thành phần với một giá trị vectơ |
m = m + m |
Cộng thêm theo thành phần ma trận |
m = m - m |
Phép trừ thành phần của ma trận |
m = m * m |
Nhân đại số tuyến tính |
Nếu một toán hạng là một vectơ khớp với kích thước hàng hoặc cột của ma trận, thì bạn có thể dùng toán tử nhân để thực hiện phép nhân hàng và cột đại số.
Hoạt động | Nội dung mô tả |
---|---|
m = v * m |
Vectơ hàng * nhân đại số tuyến tính ma trận |
m = m * v |
Ma trận * đại số tuyến tính vectơ của cột |
Sử dụng các hàm tích hợp sẵn cho tích, tích chéo và phép nhân theo thành phần:
Chức năng | Nội dung mô tả |
---|---|
f = dot(v, v) |
Tích chấm vectơ |
v = cross(v, v) |
Tích chéo vectơ |
m = matrixCompMult(m, m) |
Nhân theo thành phần |
Kiểm soát chương trình
Lệnh gọi hàm | Gọi theo giá trị trả về |
---|---|
Lặp lại | for (<init>;<test>;<next>) { break, continue } |
Lựa chọn | if ( ) { } if ( ) { } else { } switch () { break, case }
- viết hoa chữ cái đầu tiên của từ khoá mặc định |
Chuyển | break, continue, return (không được phép loại bỏ) |
Mục nhập | half4 main(float2 fragCoord) |
Đối với các giới hạn của vòng lặp
Tương tự như GLSL ES 1.0, vòng lặp "for" khá hạn chế; trình biên dịch phải có khả năng huỷ cuộn vòng lặp. Điều này có nghĩa là trình khởi động, điều kiện kiểm thử và câu lệnh next
phải sử dụng các hằng số để có thể tính toán mọi thứ tại thời gian biên dịch. Câu lệnh next
cũng bị giới hạn ở việc sử dụng ++, --, +=, or -=
.
Hàm tích hợp
GT
(loại chung) là float
, float2
, float3
, float4
hoặc
half
, half2
, half3
, half4
.
Hầu hết các hàm này hoạt động theo từng thành phần (hàm được áp dụng theo từng thành phần). Được ghi chú trong trường hợp không phải như vậy.
Hàm góc và hàm lượng giác
Tham số hàm được chỉ định dưới dạng một góc được giả định bằng đơn vị radian. Trong mọi trường hợp, bất kỳ hàm nào trong số này đều không dẫn đến lỗi chia cho 0. Nếu số chia của một tỷ lệ là 0, thì kết quả sẽ là không xác định.
Chức năng | Nội dung mô tả |
---|---|
GT radians(GT degrees) |
Chuyển đổi độ thành radian |
GT degrees(GT radians) |
Chuyển đổi radian thành độ |
GT sin(GT angle) |
Sin chuẩn |
GT cos(GT angle) |
Cosin tiêu chuẩn |
GT tan(GT angle) |
Tang chuẩn |
GT asin(GT x)
|
Trả về một góc có sin là x trong khoảng $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
GT acos(GT x)
|
Trả về một góc có cosin là x trong khoảng $ \left[0,\pi\right] $ |
GT atan(GT y, GT x)
|
Trả về một góc có cung cung lượng giác là $ \left[{y\over x}\right] $ trong khoảng $ \left[-\pi,\pi\right] $ |
GT atan(GT y_over_x)
|
Trả về một góc có khoảng lượng giác là y_over_x trong phạm vi $ \left[-{\pi\over 2},{\pi\over 2}\right] $ |
Hàm mũ
Chức năng | Nội dung mô tả |
---|---|
GT pow(GT x, GT y) |
Trả về $ x^y $ |
GT exp(GT x) |
Trả về $ e^x $ |
GT log(GT x) |
Trả về $ ln(x) $ |
GT exp2(GT x) |
Trả về $ 2^x $ |
GT log2(GT x) |
Trả về $ log_2(x) $ |
GT sqrt(GT x) |
Trả về $ \sqrt{x} $ |
GT inversesqrt(GT x) |
Trả về $ 1\over{\sqrt{x}} $ |
Hàm phổ biến
Chức năng | Nội dung mô tả |
---|---|
GT abs(GT x) |
Giá trị tuyệt đối |
GT sign(GT x) |
Trả về -1.0, 0.0 hoặc 1.0 dựa trên dấu x |
GT floor(GT x) |
Số nguyên gần nhất <= x |
GT ceil(GT x) |
Số nguyên gần nhất >= x |
GT fract(GT x) |
Trả về phần thập phân của x |
GT mod(GT x, GT y) |
Trả về giá trị của x mô-đun y |
GT mod(GT x, float y) |
Trả về giá trị của x mô-đun y |
GT min(GT x, GT y) |
Trả về giá trị nhỏ nhất của x hoặc y |
GT min(GT x, float y) |
Trả về giá trị nhỏ nhất của x hoặc y |
GT max(GT x, GT y) |
Trả về giá trị lớn nhất của x hoặc y |
GT max(GT x, float y) |
Trả về giá trị lớn nhất của x hoặc y |
GT clamp(GT x, GT
minVal, GT maxVal) |
Trả về x được kẹp giữa minVal và maxVal. |
GT clamp(GT x, float
minVal, float maxVal) |
Trả về x được kẹp giữa minVal và maxVal |
GT saturate(GT x) |
Trả về x được kẹp trong khoảng từ 0,0 đến 1,0 |
GT mix(GT x, GT y
GT a) |
Trả về kết hợp tuyến tính của x và y |
GT mix(GT x, GT y,
float a) |
Trả về kết hợp tuyến tính của x và y |
GT step(GT edge, GT x) |
Trả về 0,0 nếu x < cạnh, nếu không thì 1,0 |
GT step(float edge,
GT x) |
Trả về 0,0 nếu x < cạnh, nếu không thì 1,0 |
GT smoothstep(GT edge0,
GT edge1, GT x) |
Thực hiện nội suy Hermite trong khoảng từ 0 đến 1 khi Edge0 < x < Edge1 |
GT smoothstep(float
edge0, float edge1,
GT x) |
Thực hiện nội suy Hermite trong khoảng từ 0 đến 1 khi Edge0 < x < Edge1 |
Hàm hình học
Các hàm này hoạt động trên vectơ dưới dạng vectơ, không phải theo thành phần. GT là các vectơ nổi/nửa vectơ có các kích thước từ 2 đến 4.
Chức năng | Nội dung mô tả |
---|---|
float/half length
(GT x) |
Trả về độ dài của vectơ |
float/half distance(GT
p0, GT p1) |
Trả về khoảng cách giữa các điểm |
float/half dot(GT x,
GT y) |
Trả về sản phẩm chấm |
float3/half3
cross(float3/half3 x,
float3/half3 y) |
Trả về sản phẩm chéo |
GT normalize(GT x) |
Chuẩn hoá vectơ thành độ dài 1 |
GT faceforward(GT N,
GT I, GT Nref) |
Trả về N nếu dấu chấm(Nref, I) < 0, nếu không thì -N. |
GT reflect(GT I, GT N) |
Hướng phản chiếu I – 2 * chấm(N,I) * N. |
GT refract(GT I, GT N,
float/half eta) |
Trả về vectơ khúc xạ |
Các hàm ma trận
Loại thảm là bất kỳ loại ma trận vuông nào.
Chức năng | Nội dung mô tả |
---|---|
mat matrixCompMult(mat
x, mat y) |
Nhân x với y theo thành phần |
mat inverse(mat m) |
Trả về nghịch đảo của m |
Hàm quan hệ vectơ
So sánh x và y theo thành phần. Kích thước của vectơ đầu vào và vectơ trả về cho một lệnh gọi cụ thể phải khớp nhau. T là hợp nhất giữa các kiểu vectơ số nguyên và dấu phẩy động. BV là một vectơ boolean khớp với kích thước của các vectơ đầu vào.
Chức năng | Nội dung mô tả |
---|---|
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 nếu bất kỳ thành phần nào của x là true |
bool all(BV x) |
true nếu tất cả các thành phần của x đều là true . |
BV not(BV x) |
phép cộng logic của x |
Hàm màu
Chức năng | Nội dung mô tả |
---|---|
vec4 unpremul(vec4
color) |
Chuyển đổi giá trị màu thành alpha không nhân trước |
half3 toLinearSrgb(half3
color) |
Chuyển đổi không gian màu thành SRGB tuyến tính |
half3 fromLinearSrgb(half3
color) |
Chuyển đổi không gian màu |
Lấy mẫu chương trình đổ bóng (đánh giá)
Các loại trình lấy mẫu không được hỗ trợ, nhưng bạn có thể đánh giá các chương trình đổ bóng khác. Nếu cần lấy mẫu một hoạ tiết, bạn có thể tạo đối tượng BitmapShader và thêm đối tượng đó dưới dạng một đối tượng đồng nhất. Bạn có thể thực hiện việc này đối với bất kỳ chương trình đổ bóng nào, nghĩa là bạn có thể đánh giá trực tiếp mọi Chương trình đổ bóng Android mà không cần chuyển thành Bitmap trước, bao gồm cả các đối tượng RuntimeShader khác. Điều này mang lại rất nhiều tính linh hoạt, nhưng các chương trình đổ bóng phức tạp có thể tốn kém khi đánh giá, đặc biệt là trong một vòng lặp.
uniform shader image;
image.eval(coord).a // The alpha channel from the evaluated image shader
Lấy mẫu vùng đệm thô
Mặc dù hầu hết hình ảnh chứa màu cần được quản lý bằng màu sắc, nhưng một số hình ảnh chứa dữ liệu không thực sự là màu sắc, bao gồm cả hình ảnh lưu trữ các pháp tuyến, thuộc tính vật liệu (ví dụ: độ nhám), bản đồ độ cao hoặc bất kỳ dữ liệu toán học thuần tuý nào khác được lưu trữ trong hình ảnh. Khi sử dụng các loại hình ảnh này trong AGSL, bạn có thể dùng BitmapShader làm vùng đệm thô chung bằng cách sử dụng RuntimeShader#setInputBuffer. Điều này sẽ tránh được việc chuyển đổi và lọc không gian màu.