Sự khác biệt giữa AGSL và GLSL

AGSL và GLSL có cú pháp rất giống nhau, cho phép đưa nhiều hiệu ứng chương trình đổ bóng mảnh GLSL sang Android với những thay đổi tối thiểu. AGSL sửa bộ tính năng GLSL được thiết lập tại GLSL ES 1.0 (ngôn ngữ tô bóng mà OpenGL ES 2.0 sử dụng) để cung cấp cho phạm vi tiếp cận tối đa của thiết bị.

Chương trình đổ bóng mảnh GLSL kiểm soát toàn bộ hành vi của GPU giữa trình tạo đường quét và phần cứng kết hợp. Chương trình đổ bóng đó thực hiện mọi công việc để tính toán màu sắc và màu mà chương trình này tạo ra chính xác là màu được cung cấp cho giai đoạn kết hợp của quy trình. Khi viết chương trình đổ bóng trong AGSL, bạn đang lập trình một giai đoạn của quy trình đồ hoạ Android. Nhiều khác biệt về ngôn ngữ bắt nguồn từ việc này.

Thực thi đổ bóng

Cũng giống như trong chương trình đổ bóng GLSL, chương trình đổ bóng AGSL bắt đầu thực thi trong một hàm chính. Không giống như GLSL, hàm này lấy vị trí của chương trình đổ bóng trong toạ độ "local" làm một tham số. Các toạ độ này tương tự như gl_FragCoord, nhưng thay vì các toạ độ vùng đệm khung, các toạ độ này có thể đã được dịch trước khi gọi chương trình đổ bóng. Sau đó, chương trình đổ bóng sẽ trả về màu pixel dưới dạng vec4 có độ chính xác trung bình hoặc cao (tương tự như out vec4 color hoặc gl_FragColor trong GLSL).

mediump vec4 main(in vec2 fragCoord)

Không gian toạ độ

Không gian toạ độ GLSL và AGSL

Chương trình đổ bóng được vẽ bằng GLSL so với Chương trình đổ bóng gần giống hệt nhau được vẽ bằng AGSL

Theo mặc định, AGSL và GLSL sử dụng các không gian toạ độ khác nhau. Trong GLSL, toạ độ mảnh (fragCoord) tương ứng với phía dưới bên trái. AGSL khớp với hệ thống toạ độ màn hình của Canvas, có nghĩa là trục Y bắt đầu từ góc trên bên trái. Nếu cần, bạn có thể chuyển đổi giữa hai không gian này bằng cách truyền độ phân giải dưới dạng một giá trị đồng nhất và sử dụng resolution.y - fragCoord.y cho giá trị trục Y. Ngoài ra, bạn có thể áp dụng một ma trận biến đổi cục bộ cho chương trình đổ bóng.

// AGSL to GLSL coordinate space transformation matrix
val localMatrix = Matrix()
localMatrix.postScale(1.0f, -1.0f)
localMatrix.postTranslate(0.0f, viewHeight)
gridShader.setLocalMatrix(localMatrix)

Độ chính xác và loại

Chúng tôi hỗ trợ các đối tượng sửa đổi độ chính xác tương thích với GLSL, nhưng AGSL ra mắt các kiểu halfshort cũng thể hiện độ chính xác trung bình.

Bạn có thể khai báo các loại vectơ dưới dạng <base type><columns>. Bạn có thể sử dụng float2 thay cho vec2bool4 thay vì bvec4. Bạn có thể khai báo các loại ma trận dưới dạng <base type><columns>x<rows>, tức là float3x3 thay vì mat3. AGSL cũng cho phép khai báo kiểu GLSL cho matvec, đồng thời các loại này được ánh xạ tới các kiểu tương đương số thực có độ chính xác đơn.

Bộ tiền xử lý

AGSL không hỗ trợ lệnh bộ tiền xử lý kiểu GLSL. Chuyển đổi câu lệnh #define thành biến const. Trình biên dịch của AGSL hỗ trợ tính năng gập hằng số và loại bỏ nhánh cho các biến cố định, vì vậy, các biến này sẽ hiệu quả.

Hệ màu

Ứng dụng Android được quản lý bằng màu sắc. Hệ màu của Canvas xác định không gian màu sử dụng cho bản vẽ. Nội dung nguồn (như chương trình đổ bóng, bao gồm cả BitmapShader) cũng có hệ màu.

Đối với một số hiệu ứng nhất định, chẳng hạn như ánh sáng chính xác về mặt vật lý, bạn nên thực hiện toán học trong hệ màu tuyến tính. Để giúp giải quyết vấn đề này, AGSL cung cấp các hàm nội tại sau:

half3 toLinearSrgb(half3 color)
half3 fromLinearSrgb(half3 color)

Các đối tượng này chuyển đổi màu giữa hệ màu đang hoạt động và hệ màu LINEAR_EXTENDED_SRGB của Android. Không gian đó sử dụng dải màu sơ cấp sRGB (gamut) và một hàm chuyển tuyến tính. Thuộc tính này biểu thị các giá trị bên ngoài gam màu sRGB bằng cách sử dụng các giá trị trong phạm vi mở rộng (dưới 0 và trên 1).

Đồng phục

Vì AGSL không biết liệu đồng phục có chứa màu hay không, nên AGSL sẽ không tự động áp dụng việc chuyển đổi màu cho các màu đó. Bạn có thể gắn nhãn half4/float4/vec4 bằng layout(color), cho Android biết rằng màu đồng nhất sẽ được dùng làm màu, cho phép Android chuyển đổi giá trị đồng nhất sang không gian màu hoạt động.

Trong AGSL, hãy khai báo trạng thái đồng nhất như sau:

layout(color) uniform half4 iColor;  // Input color
uniform float2 iResolution;          // Viewport resolution (pixels)

Trong mã Android, bạn có thể đặt đồng nhất như sau:

shader.setColorUniform("iColor", Color.GREEN)
shader.setFloatUniform("iResolution", canvas.width.toFloat(), canvas.height.toFloat())