ความแตกต่างระหว่าง AGSL และ GLSL

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)

พื้นที่ในพิกัด

พื้นที่พิกัด GLSL เทียบกับ AGSL

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())