Tài liệu tham khảo nhanh về AGSL

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 shorthalf để 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 mediumpmediump 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, setInputBuffersetInputShader.
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.