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 short
và half
để 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 mediump
và mediump
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 , setInputBuffer và
setInputShader . |
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.