AGSL และ GLSL มีรูปแบบไวยากรณ์ที่คล้ายกันมาก ซึ่งทำให้สามารถใช้ Fragment ของ GLSL หลายตัวได้ ที่จะนำมาใช้ใน Android โดยแทบไม่มีการเปลี่ยนแปลง AGSL แก้ไข GLSL ชุดคุณลักษณะที่ GLSL ES 1.0 (ภาษาแรเงาที่ OpenGL ES 2.0 ใช้) เป็น ให้การเข้าถึงอุปกรณ์สูงสุด
ตัวปรับแสงเงา Fragment ของ GLSL จะควบคุมลักษณะการทำงานทั้งหมดของ GPU ระหว่าง โปรแกรมแรสเตอร์และฮาร์ดแวร์การรวม ตัวปรับแสงเงานี้จะทำงานทุกอย่างในการคำนวณ และสีที่สร้างจะเหมือนกับที่ป้อนเข้าสู่ขั้นตอนการผสม ของไปป์ไลน์ เมื่อคุณเขียนตัวปรับแสงเงาใน AGSL คุณจะได้เขียนโปรแกรมเป็นขั้นตอน ไปป์ไลน์กราฟิกของ Android ความแตกต่างด้านภาษาหลายๆ อย่างเกิดจากเรื่องนี้
การเรียกใช้ Shader
เช่นเดียวกับในตัวปรับแสงเงา GLSL ตัวปรับแสงเงา AGSL จะเริ่มดำเนินการในฟังก์ชันหลัก
ฟังก์ชันนี้ต่างจาก GLSL ที่ฟังก์ชันจะใช้ตำแหน่งตัวปรับแสงเงาใน "local" พิกัดเป็น
พารามิเตอร์ ค่านี้คล้ายกับ gl_FragCoord
แต่ไม่ใช่เฟรมบัฟเฟอร์
พิกัดเหล่านี้ พิกัดเหล่านี้อาจถูกแปลไปแล้วก่อนที่จะเรียก
ตัวปรับแสงเงา จากนั้นตัวปรับเฉดสีจะแสดงสีพิกเซลเป็น vec4
ในระดับปานกลางหรือ
ความแม่นยำสูง (คล้ายกับ out vec4 color
หรือ gl_FragColor
ใน GLSL)
mediump vec4 main(in vec2 fragCoord)
พื้นที่ในพิกัด
Shader ที่วาดโดยใช้ GLSL เทียบกับ Near Visual Shader ที่วาดโดยใช้ AGSL
AGSL และ GLSL ใช้พื้นที่พิกัดที่แตกต่างกันโดยค่าเริ่มต้น ใน GLSL ส่วนย่อย
พิกัด (fragCoord) จะสัมพัทธ์กับค่าด้านล่างซ้าย AGSL จับคู่กับหน้าจอ
ระบบพิกัดของ Canvas
ซึ่งหมายความว่าแกน Y จะเริ่มต้นจากมุมซ้ายบน หากจำเป็น คุณ
สามารถแปลงช่องว่างทั้งสองนี้ได้โดยการส่งผ่านความละเอียดเป็นค่าเดียวกัน
และใช้ resolution.y - fragCoord.y
สำหรับค่าแกน Y หรือคุณอาจเลือก
สามารถใช้เมทริกซ์การเปลี่ยนรูปแบบเฉพาะที่กับตัวปรับแสงเงาได้
// AGSL to GLSL coordinate space transformation matrix
val localMatrix = Matrix()
localMatrix.postScale(1.0f, -1.0f)
localMatrix.postTranslate(0.0f, viewHeight)
gridShader.setLocalMatrix(localMatrix)
ความแม่นยำและประเภท
ระบบรองรับตัวปรับแต่งความแม่นยำที่ใช้ร่วมกับ GLSL ได้ แต่ AGSL เปิดตัว
half
และ short
ประเภทซึ่งแสดงถึงความแม่นยำปานกลางเช่นกัน
คุณสามารถประกาศประเภทเวกเตอร์เป็นชื่อว่า <base type><columns> คุณสามารถใช้
float2
จาก vec2
และ bool4
แทน bvec4
คุณสามารถประกาศประเภทเมทริกซ์เป็น <base type><columns>x<rows>
float3x3
จากราคาเต็ม mat3
AGSL ยังอนุญาตให้ใช้การประกาศแบบ GLSL ด้วย
สำหรับ mat
และ vec
และประเภทเหล่านี้แมปกับแบบลอยแล้ว
ที่เทียบเท่ากัน
ผู้ประมวลผลข้อมูลล่วงหน้า
AGSL ไม่รองรับรูปแบบ GLSL ตัวประมวลผลล่วงหน้า คำสั่ง แปลงคำสั่ง #define เป็นตัวแปร Const คอมไพเลอร์ของ AGSL จะรองรับการพับคงที่และการกำจัดกิ่งไม้สำหรับตัวแปรคงที่ ดังนั้นค่าเหล่านี้ จะมีประสิทธิภาพมากขึ้น
พื้นที่สี
แอปพลิเคชัน Android มีการจัดการสี พื้นที่สีของ Canvas เป็นตัวกำหนด พื้นที่สีที่ใช้งานได้สำหรับการวาดภาพ เนื้อหาต้นฉบับ (เช่น ตัวปรับแสงเงา รวมถึง BitmapShader) ให้มีพื้นที่สีด้วย
สำหรับผลกระทบบางอย่าง เช่น การให้แสงที่แม่นยำ จะต้องมีการคำนวณทางคณิตศาสตร์ด้วย ในพื้นที่สีแบบเส้นตรง ด้วยเหตุนี้ AGSL จึงได้นำเสนอลักษณะเฉพาะเหล่านี้ ฟังก์ชัน:
half3 toLinearSrgb(half3 color)
half3 fromLinearSrgb(half3 color)
สิ่งเหล่านี้จะแปลงสีระหว่างพื้นที่สีที่ใช้งานได้และ
LINEAR_EXTENDED_SRGB
พื้นที่สี พื้นที่ดังกล่าวใช้แม่สี sRGB (gamut) และแบบเชิงเส้น
ฟังก์ชันการโอน แสดงค่าที่อยู่นอกขอบเขต sRGB โดยใช้ส่วนขยาย
ค่าช่วง (ต่ำกว่า 0.0 และสูงกว่า 1.0)
เครื่องแบบ
เนื่องจาก AGSL ไม่ทราบว่าเครื่องแบบมีสีหรือไม่ จึงจะไม่ใช้โดยอัตโนมัติ
แล้วแปลงสีเป็นสี คุณสามารถติดป้ายกำกับ half4
/float4
/vec4
ด้วย
layout(color)
ซึ่งช่วยให้ Android ทราบว่าจะใช้เครื่องแบบนี้เป็น
สี ซึ่งทำให้ Android เปลี่ยนค่าที่เหมือนกันให้เป็นสีที่ใช้งานได้
พื้นที่ทำงาน
ใน AGSL ให้ประกาศแบบเดียวกันนี้
layout(color) uniform half4 iColor; // Input color
uniform float2 iResolution; // Viewport resolution (pixels)
ในโค้ด Android คุณจะกำหนดแบบเดียวกันได้ดังนี้
shader.setColorUniform("iColor", Color.GREEN)
shader.setFloatUniform("iResolution", canvas.width.toFloat(), canvas.height.toFloat())