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, xem hàm tương đương trong Tài liệu về Ngôn ngữ tạo bóng OpenGL ES. Nếu có thể, tài liệu này sẽ cố gắng nêu rõ những điểm 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 diễn vectơ và ma trận. AGSL hỗ trợ thêm các loại shorthalf để thể hiện có độ chính xác trung bình.

Các kiểu cơ bản

Loại Mô tả
void Không có giá trị trả về của hàm hoặc tham số trống danh sách. Không giống như trong GLSL, các hàm không có khoảng trống loại dữ liệu trả về 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ơ có dấu
float, vec2, vec3, vec4
(float2, float3, float4)
Dấu phẩy động highp (độ chính xác đơn) vô hướng/vectơ
short, short2, short3, short4 tương đương với mediump int đã ký số nguyên/vectơ
half, half2, half3, half4 tương đương với mediump float đại lượng vô hướng/vectơ
mat2, mat3, mat4
(float2x2, float3x3, float4x4)
Ma trận float 2x2, 3x3, 4x4
half2x2, half3x3, half4x4 Tương đương với mediump float loại ma trận

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

Đây là độ chính xác tối thiểu được đảm bảo và phạm vi được liên kết với mỗi dựa trên thông số kỹ thuật OpenGL ES 2.0. Vì hầu hết thiết bị hỗ trợ ES 3.0, nên chúng sẽ có độ chính xác/phạm vi highp được đảm bảo nhiều hơn và Phạm vi int mediump. Bạn có thể áp dụng các đối tượng sửa đổi độ chính xác cho đại lượng vô hướng, vectơ và biến và tham số của ma trận. Chúng tôi chỉ đảm bảo các mức tối thiểu được liệt kê dưới đây; 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 đang chuyển đổi lowp vào mediump trong kết quả cuối cùng.

Ký tự bổ trợ "float" phạm vi "float" phạm vi cường độ "float" độ chính xác "int" phạm vi
đỉnh cao \(\left\{-2^{62},2^{62}\right\}\) \(\left\{2^{-62},2^{62}\right\}\) Họ hàng: \(2^{-16}\) \(\left\{-2^{16},2^{16}\right\}\)
trung bình \(\left\{-2^{14},2^{14}\right\}\) \(\left\{2^{-14},2^{14}\right\}\) Họ hàng: \(2^{-10}\) \(\left\{-2^{10},2^{10}\right\}\)
âm trầm \(\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ố 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ơ biểu thị điểm/pháp chuẩn

vect.rgba – Sử dụng khi truy cập vào các vectơ biểu thị màu

vect.LTRB – Sử dụng khi vectơ biểu thị 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 một 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ấu trúc 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, sử dụng cú pháp kiểu C hoặc GLSL:

Tên biến <base type>[<array size>] – ví dụ: half[10] x;

<loại cơ sở> tên biến[<array size>] – ví dụ: half x[10];

Không thể trả về mảng từ một hàm, sao chép, chỉ định hoặc so sánh. Các hạn chế về mảng sẽ lan truyền đến các cấu trúc chứa mảng. Mảng có thể chỉ đượ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 Mô tả
const Hằng số thời gian biên dịch hoặc hàm chỉ đọc .
uniform Giá trị không thay đổi trong dữ liệu gốc đang được xử lý. Đồng phục được chuyển từ Android bằng cách sử dụng 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 có cùng độ chính xác như định nghĩa hàm.
inout Đối với những thông số được truyền cả vào và ra của hàm. Phải có độ chính xác tương tự 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 được ngoặc nhọn rõ ràng. 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 xây dựng bằng một giá trị duy nhất, tất cả các giá trị cùng với đường chéo được gán giá trị đó, trong khi các giá trị còn lại cho giá trị 0. float2x2(1.0) sẽ do đó tạo ma trận đơn vị 2x2.

Khi một ma trận được xây dựng 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, hàm khởi tạo làm giảm số lượng thành phần của một vectơ truyền vào không được hỗ trợ, nhưng bạn có thể sử dụng swizzling để có cùng hiệu ứng. Để tạo vec3 từ vec4 trong AGSL có hành vi tương tự như GLSL, 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ử 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 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. Quan hệ và đẳng thức toán tử > < <= >= == != cho kết quả là một Boolean. Để so sánh vectơ thành phần, sử dụng các hàm như lessThan(), equal(), v.v.

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

Ma trận và phép toán vectơ

Khi áp dụng cho giá trị vô hướng, các toán tử số học sẽ cho ra một đại lượng vô hướng. Cho nếu một toán hạng là đại lượng vô hướng và toán hạng còn lại là một toán tử vectơ hoặc ma trận, phép toán được thực hiện theo từng thành phần và dẫn đến kết quả cùng một kiểu vectơ hoặc ma trận. Nếu cả hai phép tính đều là vectơ có cùng kích thước, thì đượ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 Mô tả
m = f * m Phép nhân ma trận thành phần thông minh theo một giá trị vô hướng
v = f * v Nhân vectơ chỉ có thành phần với một giá trị vô hướng
v = v * v Nhân vectơ chỉ trên thành phần với một giá trị vectơ
m = m + m Phép cộng thành phần của 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 Mô tả
m = v * m Vectơ hàng * phép nhân đại số tuyến tính của ma trận
m = m * v Ma trận * vectơ nhân đại số tuyến tính cột

Sử dụng các hàm tích hợp cho tích vectơ, tích chéo và phép nhân trên hệ số thành phần:

Chức năng Mô tả
f = dot(v, v) Tích vectơ chấm
v = cross(v, v) Tích chéo vectơ
m = matrixCompMult(m, m) Nhân nhiều 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 } – cách viết hoa mặc định cuối cùng
Nhảy break, continue, return
(không được phép huỷ)
Mục nhập half4 main(float2 fragCoord)

Đối với các hạn chế về vòng lặp

Tương tự như GLSL ES 1.0, 'for' vòng lặp 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 tạo, điều kiện kiểm thử và Câu lệnh next phải dùng hằng số để mọi thứ đều có thể được tính toán khi biên dịch bất cứ lúc nào. Câu lệnh next bị giới hạn nhiều hơn trong việc sử dụng ++, --, +=, or -=.

Các hàm tích hợp sẵn

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 mỗi thành phần). Chúng tôi ghi nhận khi không phải như vậy.

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

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

Chức năng 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) Hình sin chuẩn
GT cos(GT angle) Cosin chuẩn
GT tan(GT angle) Tang chuẩn
GT asin(GT x) Trả về một góc có sin là x trong dải ô trong $ \left[-{\pi\over 2},{\pi\over 2}\tight] $
GT acos(GT x) Trả về một góc có cosin là x trong phạm vi $ \left[0,\pi\right] $
GT atan(GT y, GT x) Trả về một góc có cung lượng giác $ \left[{y\over x}\right] $ trong phạm vi $ \left[-\pi,\pi\right] $
GT atan(GT y_over_x) Trả về một góc có lượng giác arctang là y_over_x trong dải ô trong $ \left[-{\pi\over 2},{\pi\over 2}\tight] $

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 phân số của x
GT mod(GT x, GT y) Giá trị trả về của x modulo y
GT mod(GT x, float y) Giá trị trả về của x modulo 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 đặt trong khoảng từ 0,0 đến 1,0
GT mix(GT x, GT y GT a) Trả về tổ hợp tuyến tính của x và y
GT mix(GT x, GT y, float a) Trả về 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, khác 1.0
GT step(float edge, GT x) Trả về 0,0 nếu x < cạnh, khác 1.0
GT smoothstep(GT edge0, GT edge1, GT x) Thực hiện nội suy Hermite giữa 0 và 1 khi cạnh0 < x < cạnh 1
GT smoothstep(float edge0, float edge1, GT x) Thực hiện nội suy Hermite giữa 0 và 1 khi cạnh0 < x < cạnh 1

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 theo thành phần. GT là vectơ thực/nửa có kích thước từ 2-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ề sản phẩm dạng dấu 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ơ theo độ 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 * dấu 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

Thảm loại là loại ma trận vuông bất kỳ.

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

Hàm quan hệ vectơ

So sánh x và y theo từng 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 củ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 Mô tả
BV lessThan(T x, T y) x < năm
BV lessThanEqual(T x, T y) x <= y
BV greaterThan(T x, T y) x > năm
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ả thành phần của x là true.
BV not(BV x) phần bổ sung 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 không nhân trước alpha
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 chương 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 bạn cần để lấy mẫu một kết cấu, bạn có thể tạo một và thêm đối tượng BitmapShader và thêm đối tượng đó dưới dạng một đồng nhất. Bạn có thể thực hiện điều này với bất kỳ chương trình đổ bóng nào, có nghĩa 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 chuyển chương trình đó thành một Bitmap, bao gồm cả các Đối tượng RuntimeShader. Điều này cho phép mang lại tính linh hoạt cao, nhưng các chương trình đổ bóng phức tạp có thể gây 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 các 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, các thuộc tính của vật liệu (ví dụ: độ nhám), bản đồ độ cao hoặc bất kỳ thuộc tính nào khác thuần tuý dữ liệu toán học xảy ra được lưu trữ trong một hình ảnh. Khi sử dụng các loại này hình ảnh trong AGSL, bạn có thể sử dụng BitmapShader làm bộ đệm thô chung bằng cách sử dụng RuntimeShader#setInputBuffer. Điều này sẽ giúp tránh hiện tượng lọc và biến đổi hệ màu.