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ữ đổ bóng OpenGL ES. Khi có thể, tài liệu này sẽ cố gắng nêu 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 bổ sung để biểu thị các loại vectơ và ma trận. AGSL hỗ trợ các loại shorthalf bổ sung để biểu thị độ chính xác trung bình.

Các loại cơ bản

Loại 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ó loại dữ liệu trả về rỗng phải trả về một giá trị.
bool, bvec2, bvec3, bvec4
(bool2, bool3, bool4).
Vectơ/vô hướng boolean
int, ivec2, ivec3, ivec4
(int2, int3, int4)
Số nguyên/vectơ đã ký highp
float, vec2, vec3, vec4
(float2, float3, float4)
Vectơ/vô hướng dấu phẩy động highp (độ chính xác đơn)
short, short2, short3, short4 tương đương với số nguyên/vectơ có dấu mediump int
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 float 2x2, 3x3, 4x4
half2x2, half3x3, half4x4 Tương đương với các loại ma trận mediump float

Độ chính xác và giá trị tối thiểu của phạm vi

Đây là độ chính xác và phạm vi 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ị này sẽ có độ chính xác/dải highp và dải int mediump được đảm bảo hơn. Bạn có thể áp dụng hệ số sửa đổi độ chính xác cho các biến và tham số vô hướng, vectơ và ma trận. Chỉ đảm bảo các giá trị tối thiểu được liệt kê bên dưới; lowp không nhất thiết có độ chính xác thấp hơn mediumpmediump không nhất thiết 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.

Ký tự bổ trợ Phạm vi "float" Phạm vi độ lớn "float" Độ chính xác của "float" Phạm vi "int"
highp \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Tương đối: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
mediump \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Tương đối: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
lowp \(\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 các điểm/phương pháp

vect.rgba – Dùng khi truy cập vào các vectơ đại diện cho màu sắc

vect.LTRB – Dùng khi vectơ biểu thị hình chữ nhật (không có trong GLSL)

Trong AGSL, bạn có thể sử dụng 0 và 1 để tạo 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ục.

struct type-name {
 members
} struct-name; // optional variable declaration.

Chỉ hỗ trợ các mảng 1 chiều có kích thước mảng rõ ràng, sử dụng cú pháp kiểu C hoặc GLSL:

<loại cơ sở>[<kích thước mảng>] tên biến – ví dụ: half[10] x;

<loại cơ sở> tên biến[<kích thước mảng>] – ví dụ: half x[10];

Bạn không thể trả về, sao chép, gán hoặc so sánh mảng từ một hàm. Các quy định hạn chế về mảng sẽ áp dụng cho các cấu trúc chứa mảng. Bạn chỉ có thể lập chỉ mục mảng bằng hằng số hoặc biến vòng lặp.

Vòng loại

Loại Mô tả
const Hằng số thời gian biên dịch hoặc tham số hàm chỉ có thể đọc.
uniform Giá trị không thay đổi trên dữ liệu gốc đang được xử lý. Các bộ đồng phục được truyền từ Android bằng cách sử dụng các phương thức RuntimeShader cho setColorUniform, setFloatUniform, setIntUniform, setInputBuffersetInputShader.
in Đối với các tham số hàm được truyền vào. Đây là lựa chọn mặc định.
out Đối với các tham số hàm đã truyền. Phải sử dụng độ chính xác giống như định nghĩa hàm.
inout Đối với các tham số được truyền vào và ra khỏi hàm. Phải sử dụng độ chính xác giống như định nghĩa hàm.

Khai báo biến

Nội dung khai báo phải nằm trong phạm vi rõ ràng được đóng dấu ngoặc nhọn. Không được phép khai báo y trong mẫu sau:

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 một ma trận được tạo bằng một giá trị duy nhất, tất cả các giá trị dọc theo đường chéo sẽ được cung cấp giá trị đó, còn các giá trị còn lại sẽ được cung cấp giá trị 0. Do đó, float2x2(1.0) sẽ tạo một ma trận nhận dạng 2x2.

Khi một ma trận được tạo bằng nhiều giá trị, các cột sẽ được điền trước (theo thứ tự chính cột).

Xin lưu ý rằng, không giống như GLSL, các hàm khởi tạo làm giảm số thành phần của một vectơ được truyền vào sẽ không được hỗ trợ, nhưng bạn có thể sử dụng tính năng hoán đổi để có cùng hiệu ứng. Để tạo vec3 từ vec4 trong AGSL có cùng hành vi 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 vào các thành phần của một ma trận bằng cú pháp chỉ số dưới của 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

Cấu trúc trường

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ử Mô tả
. bộ chọn trường
==, != bình đẳng
= chỉ định

Phần tử mảng

Các phần tử mảng được truy cập bằng toán tử chỉ số dưới mảng [ ]. Ví dụ:

diffuseColor += lightIntensity[3] * NdotL;

Toán tử

Được đánh số theo thứ tự ưu tiên. Toán tử quy chiếu và toán tử bằng > < <= >= == != đá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ử Mô tả Tính liên kết
1 () nhóm trong dấu ngoặc đơn Không áp dụng
2 [] () . ++ -- lệnh gọi hàm chỉ số dưới của mảng và bộ chọn trường hoặc phương thức cấu trúc hàm khởi tạo, tăng và giảm hậu tố swizzle Trái sang Phải
3 ++ -- + - ! tiền tố tăng và giảm unary 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 == != đẳng thức/bất đẳng thức Trái sang Phải
12 && dấu AND logic Trái sang Phải
13 ^^ XOR logic Trái sang Phải
14 || dấu logic OR Trái sang Phải
15 ?\: phần tử lựa chọn (một toán hạng toàn bộ) Trái sang Phải
16 = += -= *= /= toán tử gán toán tử số học toán tử gán toán tử số học toán tử gán Trái sang Phải
17 , trình tự Trái sang Phải

Các phép toán trên ma trận và vectơ

Khi áp dụng cho các giá trị vô hướng, toán tử số học sẽ trả về một giá trị vô hướng. Đối với các toán tử khác ngoài toán tử mô-đun, nếu một toán hạng là vô hướng và toán hạng còn lại là vectơ hoặc ma trận, thì phép toán sẽ được thực hiện theo thành phần và kết quả sẽ có cùng kiểu vectơ hoặc ma trận. Nếu cả hai phép toán đều là vectơ có cùng kích thước, thì phép toán sẽ được thực hiện theo thành phần (và trả về cùng một loại vectơ).

Hoạt động Mô tả
m = f * m Nhân ma trận theo thành phần với một giá trị vô hướng
v = f * v Nhân vectơ theo thành phần với một 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 theo thành phần của ma trận
m = m - m Trừ theo 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ể sử 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 Mô tả
m = v * m Vectơ hàng * nhân đại số tuyến tính của ma trận
m = m * v Ma trận * vectơ cột nhân đại số tuyến tính

Sử dụng các hàm tích hợp sẵn cho tích vô hướng, tích có hướng và nhân theo thành phần:

Chức năng Mô tả
f = dot(v, v) Tích vô hướng của vectơ
v = cross(v, v) Tích véctơ
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 } - trường hợp mặc định cuối cùng
Nhảy break, continue, return
(không được phép loại bỏ)
Mục nhập half4 main(float2 fragCoord)

Giới hạn của vòng lặp for

Tương tự như GLSL ES 1.0, các vòng lặp "for" khá hạn chế; trình biên dịch phải có thể mở vòng lặp. Điều này có nghĩa là trình khởi chạy, điều kiện kiểm thử và câu lệnh next phải sử dụng hằng số để mọi thứ có thể được tính toán tại thời điểm biên dịch. Câu lệnh next bị hạn chế hơn nữa khi chỉ 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 thành phần (hàm được áp dụng cho mỗi thành phần). Chúng tôi sẽ lưu ý khi không phải như vậy.

Góc và hàm lượng giác

Các tham số hàm được chỉ định dưới dạng góc được giả định là theo đơn vị radian. Trong mọi trường hợp, các hàm này sẽ không gây ra lỗi chia cho 0. Nếu hệ số chia của một tỷ lệ là 0, thì kết quả sẽ không xác định.

Chức năng Mô tả
GT radians(GT degrees) Chuyển đổi độ sang radian
GT degrees(GT radians) Chuyển đổi radian sang độ
GT sin(GT angle) Sin tiêu chuẩn
GT cos(GT angle) Côsin chuẩn
GT tan(GT angle) Tiếp tuyến 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ó arctang lượng 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ó arctang lượng giác là y_over_x trong phạm vi $ \left[-{\pi\over 2},{\pi\over 2}\right] $

Hàm số mũ

Chức năng 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 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 của 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 theo mô-đun y
GT mod(GT x, float y) Trả về giá trị của x theo 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 đến 1
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ì trả về 1.0
GT step(float edge, GT x) Trả về 0.0 nếu x < cạnh, nếu không thì trả về 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ơ, chứ không phải theo thành phần. GT là vectơ float/half có kích thước từ 2 đến 4.

Chức năng 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ề tích vô hướng
float3/half3 cross(float3/half3 x, float3/half3 y) Trả về tích véctơ
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 dot(Nref, I) < 0, nếu không thì trả về -N.
GT reflect(GT I, GT N) Hướng phản chiếu I – 2 * dot(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

Type mat là bất kỳ loại ma trận vuông nào.

Chức năng Mô tả
mat matrixCompMult(mat x, mat y) Nhân x với y theo từng thành phần
mat inverse(mat m) Trả về phép nghịch đảo của m

Hàm quy chiếu 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à tập hợp hợp nhất của các loại 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 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ần bổ trợ logic của x

Hàm màu

Chức năng 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) Biến đổi không gian màu thành SRGB tuyến tính
half3 fromLinearSrgb(half3 color) Biến đổi không gian màu

Lấy mẫu chương trình đổ bóng (đánh giá)

Các loại bộ 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 hoạ tiết, bạn có thể tạo đối tượng BitmapShader và thêm đối tượng đó dưới dạng đồng nhất. Bạn có thể thực hiện việc này cho bất kỳ chương trình đổ bóng nào, tức là bạn có thể trực tiếp đánh giá bất kỳ chương trình đổ bóng Android nào mà không cần chuyển chương trình đổ bóng đó thành Bitmap trước, bao gồm cả các đối tượng RuntimeShader khác. Điều này cho phép bạn có được sự linh hoạt rất lớn, nhưng các chương trình đổ bóng phức tạp có thể tốn kém để đá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 đều chứa màu cần được quản lý màu, nhưng một số hình ảnh lại chứa dữ liệu không phải là màu, bao gồm cả hình ảnh lưu trữ pháp tuyến, thuộc tính chấ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 tình 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ể sử 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.