สำรวจ WebGL occlusion queries เพื่อการเรนเดอร์ที่ปรับให้เหมาะสม เรียนรู้วิธีใช้อย่างมีประสิทธิภาพสำหรับการทดสอบการมองเห็นและปรับปรุงประสิทธิภาพเว็บแอปพลิเคชันของคุณอย่างเห็นได้ชัด
WebGL Occlusion Queries: การทดสอบการมองเห็นและการเพิ่มประสิทธิภาพการทำงาน
ในแวดวงการพัฒนา WebGL ประสิทธิภาพคือสิ่งสำคัญที่สุด ฉากที่ซับซ้อนซึ่งมีวัตถุจำนวนมากสามารถสร้างภาระให้กับ GPU ได้อย่างรวดเร็ว ส่งผลให้เฟรมตกและประสบการณ์ผู้ใช้ที่ไม่ดี เทคนิคอันทรงพลังอย่างหนึ่งในการลดปัญหานี้คือ occlusion culling ซึ่งวัตถุที่ซ่อนอยู่หลังวัตถุอื่นจะไม่ถูกเรนเดอร์ ทำให้ประหยัดเวลาในการประมวลผลอันมีค่า WebGL occlusion queries เป็นกลไกที่ช่วยในการพิจารณาการมองเห็นของวัตถุอย่างมีประสิทธิภาพ ทำให้สามารถใช้ occlusion culling ได้อย่างเกิดผล
WebGL Occlusion Queries คืออะไร?
WebGL occlusion query คือฟีเจอร์ที่ช่วยให้คุณสามารถสอบถาม GPU ได้ว่ามีแฟรกเมนต์ (พิกเซล) จำนวนเท่าใดที่ถูกวาดโดยชุดคำสั่งการเรนเดอร์ที่ระบุ โดยพื้นฐานแล้ว คุณส่ง draw calls สำหรับวัตถุ และ GPU จะบอกคุณว่ามีแฟรกเมนต์ใดๆ ของวัตถุนั้นผ่านการทดสอบความลึก (depth test) และมองเห็นได้จริงหรือไม่ ข้อมูลนี้สามารถนำไปใช้เพื่อพิจารณาว่าวัตถุนั้นถูกบดบังโดยวัตถุอื่นในฉากหรือไม่ หาก query คืนค่าเป็นศูนย์ (หรือจำนวนน้อยมาก) หมายความว่าวัตถุนั้นถูกบดบังโดยสมบูรณ์ (หรือเกือบทั้งหมด) และไม่จำเป็นต้องเรนเดอร์ในเฟรมถัดๆ ไป เทคนิคนี้ช่วยลดภาระงานในการเรนเดอร์ได้อย่างมากและปรับปรุงประสิทธิภาพ โดยเฉพาะอย่างยิ่งในฉากที่ซับซ้อน
Occlusion Queries ทำงานอย่างไร: ภาพรวมแบบง่าย
- สร้าง Query Object: อันดับแรกคุณต้องสร้าง query object โดยใช้
gl.createQuery()อ็อบเจกต์นี้จะเก็บผลลัพธ์ของ occlusion query - เริ่ม Query: คุณเริ่ม query โดยใช้
gl.beginQuery(gl.ANY_SAMPLES_PASSED, query)เป้าหมายgl.ANY_SAMPLES_PASSEDระบุว่าเราสนใจว่ามี sample (แฟรกเมนต์) ใดๆ ผ่านการทดสอบความลึกหรือไม่ ยังมีเป้าหมายอื่น ๆ เช่นgl.ANY_SAMPLES_PASSED_CONSERVATIVE(ซึ่งให้ผลลัพธ์ที่อนุรักษ์นิยมกว่า อาจรวมถึงผลบวกลวงเพื่อประสิทธิภาพที่ดีขึ้น) และgl.SAMPLES_PASSED(ซึ่งนับจำนวน sample ที่ผ่านการทดสอบความลึก แต่เลิกใช้งานแล้วใน WebGL2) - เรนเดอร์วัตถุที่อาจถูกบดบัง: จากนั้นคุณออกคำสั่ง draw calls สำหรับวัตถุที่คุณต้องการทดสอบการมองเห็น โดยทั่วไปมักจะเป็น bounding box ที่เรียบง่ายหรือการแสดงผลแบบหยาบของวัตถุ การเรนเดอร์เวอร์ชันที่เรียบง่ายจะช่วยลดผลกระทบต่อประสิทธิภาพของ query เอง
- สิ้นสุด Query: คุณสิ้นสุด query โดยใช้
gl.endQuery(gl.ANY_SAMPLES_PASSED) - ดึงผลลัพธ์ Query: ผลลัพธ์ของ query จะยังไม่พร้อมใช้งานทันที GPU ต้องการเวลาในการประมวลผลคำสั่งการเรนเดอร์และพิจารณาจำนวนแฟรกเมนต์ที่ผ่าน คุณสามารถดึงผลลัพธ์ได้โดยใช้
gl.getQueryParameter(query, gl.QUERY_RESULT) - ตีความผลลัพธ์: หากผลลัพธ์ของ query มากกว่าศูนย์ หมายความว่ามีแฟรกเมนต์ของวัตถุอย่างน้อยหนึ่งชิ้นที่มองเห็นได้ หากผลลัพธ์เป็นศูนย์ หมายความว่าวัตถุนั้นถูกบดบังโดยสมบูรณ์
- ใช้ผลลัพธ์สำหรับ Occlusion Culling: จากผลลัพธ์ของ query คุณสามารถตัดสินใจได้ว่าจะเรนเดอร์วัตถุที่มีรายละเอียดครบถ้วนในเฟรมถัดไปหรือไม่
ประโยชน์ของการใช้ Occlusion Queries
- ปรับปรุงประสิทธิภาพการเรนเดอร์: ด้วยการหลีกเลี่ยงการเรนเดอร์วัตถุที่ถูกบดบัง occlusion queries สามารถลดภาระงานในการเรนเดอร์ได้อย่างมาก ส่งผลให้อัตราเฟรมสูงขึ้นและประสบการณ์ผู้ใช้ที่ราบรื่นขึ้น
- ลดภาระของ GPU: การเรนเดอร์ที่น้อยลงหมายถึงงานที่น้อยลงสำหรับ GPU ซึ่งสามารถช่วยยืดอายุการใช้งานแบตเตอรี่บนอุปกรณ์พกพาและลดการสร้างความร้อนบนคอมพิวเตอร์เดสก์ท็อป
- เพิ่มความสมจริงของภาพ: ด้วยการเพิ่มประสิทธิภาพการเรนเดอร์ คุณสามารถเรนเดอร์ฉากที่ซับซ้อนและมีรายละเอียดมากขึ้นได้โดยไม่กระทบต่ออัตราเฟรม
- ความสามารถในการขยายขนาด (Scalability): Occlusion queries มีประโยชน์อย่างยิ่งสำหรับฉากที่ซับซ้อนซึ่งมีวัตถุจำนวนมาก เนื่องจากประสิทธิภาพที่เพิ่มขึ้นจะมากขึ้นตามความซับซ้อนของฉาก
ความท้าทายและข้อควรพิจารณา
แม้ว่า occlusion queries จะมีประโยชน์อย่างมาก แต่ก็มีความท้าทายและข้อควรพิจารณาที่ต้องคำนึงถึงเช่นกัน:
- ความล่าช้า (Latency): Occlusion queries ทำให้เกิดความล่าช้าเนื่องจากผลลัพธ์ของ query ไม่พร้อมใช้งานทันที GPU ต้องการเวลาในการประมวลผลคำสั่งการเรนเดอร์และพิจารณาจำนวนแฟรกเมนต์ที่ผ่าน ความล่าช้านี้อาจนำไปสู่ความผิดเพี้ยนของภาพหากไม่ได้รับการจัดการอย่างระมัดระวัง
- ค่าใช้จ่ายในการทำ Query (Query Overhead): การทำ occlusion queries ยังมีค่าใช้จ่ายบางส่วน GPU ต้องติดตามสถานะของ query และนับแฟรกเมนต์ที่ผ่านการทดสอบความลึก ค่าใช้จ่ายนี้อาจลบล้างประโยชน์ด้านประสิทธิภาพหากไม่ได้ใช้ query อย่างรอบคอบ
- การบดบังแบบอนุรักษ์นิยม (Conservative Occlusion): เพื่อลดผลกระทบของความล่าช้า มักจะใช้การบดบังแบบอนุรักษ์นิยม ซึ่งวัตถุจะถูกพิจารณาว่ามองเห็นได้แม้ว่าจะมีแฟรกเมนต์เพียงเล็กน้อยที่มองเห็นได้ก็ตาม สิ่งนี้อาจนำไปสู่การเรนเดอร์วัตถุที่ถูกบดบังบางส่วน แต่มันช่วยหลีกเลี่ยงความผิดเพี้ยนของภาพที่อาจเกิดขึ้นกับการทำ occlusion culling แบบเข้มงวด
- การเลือก Bounding Volume: การเลือก bounding volume (เช่น bounding box, bounding sphere) สำหรับ occlusion query อาจส่งผลต่อประสิทธิภาพอย่างมาก Bounding volume ที่เรียบง่ายจะเรนเดอร์ได้เร็วกว่า แต่อาจส่งผลให้เกิดผลบวกลวงมากขึ้น (เช่น วัตถุที่ถูกพิจารณาว่ามองเห็นได้ทั้งที่ส่วนใหญ่ถูกบดบัง)
- การซิงโครไนซ์ (Synchronization): การดึงผลลัพธ์ของ query จำเป็นต้องมีการซิงโครไนซ์ระหว่าง CPU และ GPU การซิงโครไนซ์นี้อาจทำให้เกิดการหยุดชะงักในไปป์ไลน์การเรนเดอร์ ซึ่งอาจส่งผลเสียต่อประสิทธิภาพ
- ความเข้ากันได้ของเบราว์เซอร์และฮาร์ดแวร์: ตรวจสอบให้แน่ใจว่าเบราว์เซอร์และฮาร์ดแวร์เป้าหมายรองรับ occlusion queries แม้ว่าจะได้รับการสนับสนุนอย่างกว้างขวาง แต่ระบบรุ่นเก่าอาจไม่มีฟีเจอร์นี้ ซึ่งจำเป็นต้องมีกลไกสำรอง
แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ WebGL Occlusion Queries
เพื่อเพิ่มประโยชน์สูงสุดจาก occlusion queries และลดความท้าทายให้น้อยที่สุด ให้พิจารณาแนวทางปฏิบัติที่ดีที่สุดต่อไปนี้:
1. ใช้ Bounding Volumes แบบเรียบง่าย
แทนที่จะเรนเดอร์วัตถุที่มีรายละเอียดครบถ้วนสำหรับ occlusion query ให้เรนเดอร์ bounding volume แบบเรียบง่าย เช่น bounding box หรือ bounding sphere ซึ่งจะช่วยลดภาระงานในการเรนเดอร์และเร่งกระบวนการ query ให้เร็วขึ้น Bounding volume ควรครอบคลุมวัตถุอย่างพอดีเพื่อลดผลบวกลวง
ตัวอย่าง: ลองจินตนาการถึงโมเดล 3 มิติที่ซับซ้อนของรถยนต์ แทนที่จะเรนเดอร์โมเดลรถทั้งคันสำหรับ occlusion query คุณสามารถเรนเดอร์ bounding box แบบง่ายๆ ที่ครอบคลุมรถยนต์ Bounding box นี้จะเรนเดอร์ได้เร็วกว่าโมเดลรถทั้งคันมาก
2. ใช้ Hierarchical Occlusion Culling
สำหรับฉากที่ซับซ้อน ให้พิจารณาใช้ hierarchical occlusion culling โดยที่คุณจัดระเบียบวัตถุเป็นลำดับชั้นของ bounding volumes จากนั้นคุณสามารถทำ occlusion queries บน bounding volumes ระดับสูงก่อน หาก bounding volume ระดับสูงถูกบดบัง คุณสามารถหลีกเลี่ยงการทำ occlusion queries กับลูกๆ ของมันได้ ซึ่งจะช่วยลดจำนวน occlusion queries ที่ต้องทำลงได้อย่างมาก
ตัวอย่าง: พิจารณาฉากที่มีเมือง คุณสามารถจัดระเบียบอาคารต่างๆ เป็นบล็อก แล้วจัดระเบียบบล็อกเป็นเขตต่างๆ จากนั้นคุณสามารถทำ occlusion queries บนเขตต่างๆ ก่อน หากเขตใดเขตหนึ่งถูกบดบัง คุณสามารถหลีกเลี่ยงการทำ occlusion queries บนแต่ละบล็อกและอาคารภายในเขตนั้นได้
3. ใช้ Frame Coherency
Occlusion queries แสดงให้เห็นถึง frame coherency ซึ่งหมายความว่าการมองเห็นของวัตถุมีแนวโน้มที่จะคล้ายคลึงกันจากเฟรมหนึ่งไปยังอีกเฟรมหนึ่ง คุณสามารถใช้ประโยชน์จาก frame coherency นี้ได้โดยการแคชผลลัพธ์ของ query และใช้เพื่อคาดการณ์การมองเห็นของวัตถุในเฟรมถัดๆ ไป ซึ่งจะช่วยลดจำนวน occlusion queries ที่ต้องทำและปรับปรุงประสิทธิภาพ
ตัวอย่าง: หากวัตถุหนึ่งมองเห็นได้ในเฟรมก่อนหน้า คุณสามารถสันนิษฐานได้ว่ามันน่าจะมองเห็นได้ในเฟรมปัจจุบัน จากนั้นคุณสามารถชะลอการทำ occlusion query กับวัตถุนั้นไปจนกว่ามันจะมีแนวโน้มที่จะถูกบดบัง (เช่น หากมันเคลื่อนที่ไปอยู่หลังวัตถุอื่น)
4. พิจารณาใช้ Conservative Occlusion
เพื่อลดผลกระทบของความล่าช้า ให้พิจารณาใช้ conservative occlusion โดยที่วัตถุจะถูกพิจารณาว่ามองเห็นได้แม้ว่าจะมีแฟรกเมนต์เพียงเล็กน้อยที่มองเห็นได้ก็ตาม ซึ่งสามารถทำได้โดยการตั้งค่าเกณฑ์ (threshold) สำหรับผลลัพธ์ของ query หากผลลัพธ์ของ query สูงกว่าเกณฑ์ วัตถุจะถูกพิจารณาว่ามองเห็นได้ มิฉะนั้น จะถือว่าถูกบดบัง
ตัวอย่าง: คุณสามารถตั้งค่าเกณฑ์ไว้ที่ 10 แฟรกเมนต์ หากผลลัพธ์ของ query มากกว่า 10 วัตถุจะถูกพิจารณาว่ามองเห็นได้ มิฉะนั้น จะถือว่าถูกบดบัง เกณฑ์ที่เหมาะสมจะขึ้นอยู่กับขนาดและความซับซ้อนของวัตถุในฉากของคุณ
5. ใช้กลไกสำรอง (Fallback Mechanism)
ไม่ใช่ทุกเบราว์เซอร์และฮาร์ดแวร์ที่รองรับ occlusion queries สิ่งสำคัญคือต้องมีกลไกสำรองที่สามารถใช้ได้เมื่อ occlusion queries ไม่พร้อมใช้งาน ซึ่งอาจเป็นการใช้อัลกอริธึม occlusion culling ที่ง่ายกว่า หรือเพียงแค่ปิดการใช้งาน occlusion culling ไปเลย
ตัวอย่าง: คุณสามารถตรวจสอบว่าส่วนขยาย EXT_occlusion_query_boolean ได้รับการสนับสนุนหรือไม่ หากไม่รองรับ คุณสามารถเปลี่ยนไปใช้อัลกอริธึมการคัดกรองตามระยะทางแบบง่ายๆ โดยที่วัตถุที่อยู่ไกลจากกล้องเกินไปจะไม่ถูกเรนเดอร์
6. เพิ่มประสิทธิภาพไปป์ไลน์การเรนเดอร์
Occlusion queries เป็นเพียงส่วนหนึ่งของจิ๊กซอว์ในการเพิ่มประสิทธิภาพการเรนเดอร์ สิ่งสำคัญคือต้องเพิ่มประสิทธิภาพส่วนที่เหลือของไปป์ไลน์การเรนเดอร์ด้วย ซึ่งรวมถึง:
- การลดจำนวน draw calls: การรวม draw calls เป็นชุด (batching) สามารถลดค่าใช้จ่ายในการเรนเดอร์ได้อย่างมาก
- การใช้ shader ที่มีประสิทธิภาพ: การเพิ่มประสิทธิภาพ shader สามารถลดเวลาที่ใช้ในการประมวลผลแต่ละ vertex และ fragment
- การใช้ mipmapping: Mipmapping สามารถปรับปรุงประสิทธิภาพการกรองเท็กซ์เจอร์ (texture filtering)
- การลด overdraw: Overdraw เกิดขึ้นเมื่อแฟรกเมนต์ถูกวาดทับกัน ทำให้เสียเวลาในการประมวลผล
- การใช้ instancing: Instancing ช่วยให้คุณสามารถเรนเดอร์สำเนาของวัตถุเดียวกันหลายๆ ชิ้นได้ด้วย draw call เพียงครั้งเดียว
7. การดึงผลลัพธ์ Query แบบอะซิงโครนัส (Asynchronous)
การดึงผลลัพธ์ของ query อาจทำให้เกิดการหยุดชะงักหาก GPU ยังประมวลผล query ไม่เสร็จ การใช้กลไกการดึงข้อมูลแบบอะซิงโครนัส (หากมี) สามารถช่วยลดปัญหานี้ได้ เทคนิคอาจรวมถึงการรอสักสองสามเฟรมก่อนที่จะดึงผลลัพธ์ หรือใช้ worker thread เฉพาะเพื่อจัดการกระบวนการดึงผลลัพธ์ query เพื่อป้องกันการบล็อกเธรดการเรนเดอร์หลัก
ตัวอย่างโค้ด: การใช้งาน Occlusion Query ขั้นพื้นฐาน
นี่คือตัวอย่างแบบง่ายที่แสดงการใช้งานพื้นฐานของ occlusion queries ใน WebGL:
// สร้าง query object
const query = gl.createQuery();
// เริ่ม query
gl.beginQuery(gl.ANY_SAMPLES_PASSED, query);
// เรนเดอร์วัตถุ (เช่น bounding box)
gl.drawArrays(gl.TRIANGLES, 0, vertexCount);
// สิ้นสุด query
gl.endQuery(gl.ANY_SAMPLES_PASSED);
// ดึงผลลัพธ์ query แบบอะซิงโครนัส (ตัวอย่างโดยใช้ requestAnimationFrame)
function checkQueryResult() {
gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE, (available) => {
if (available) {
gl.getQueryParameter(query, gl.QUERY_RESULT, (result) => {
const isVisible = result > 0;
// ใช้ผลลัพธ์การมองเห็นเพื่อตัดสินใจว่าจะเรนเดอร์วัตถุเต็มรูปแบบหรือไม่
if (isVisible) {
renderFullObject();
}
});
} else {
requestAnimationFrame(checkQueryResult);
}
});
}
requestAnimationFrame(checkQueryResult);
หมายเหตุ: นี่เป็นตัวอย่างแบบง่ายและไม่รวมการจัดการข้อผิดพลาด การจัดการทรัพยากรที่เหมาะสม หรือเทคนิคการเพิ่มประสิทธิภาพขั้นสูง โปรดจำไว้ว่าต้องปรับใช้สิ่งนี้ให้เข้ากับฉากและข้อกำหนดเฉพาะของคุณ การจัดการข้อผิดพลาด โดยเฉพาะอย่างยิ่งเกี่ยวกับการสนับสนุนส่วนขยายและความพร้อมใช้งานของ query เป็นสิ่งสำคัญอย่างยิ่งในสภาพแวดล้อมการใช้งานจริง นอกจากนี้ยังต้องพิจารณาการปรับเปลี่ยนเพื่อรองรับสถานการณ์ต่างๆ ที่อาจเกิดขึ้นได้
Occlusion Queries ในการใช้งานจริง
Occlusion queries ถูกนำไปใช้ในแอปพลิเคชันจริงหลากหลายประเภท ได้แก่:
- การพัฒนาเกม: Occlusion culling เป็นเทคนิคที่สำคัญสำหรับการเพิ่มประสิทธิภาพการเรนเดอร์ในเกม โดยเฉพาะอย่างยิ่งในฉากที่ซับซ้อนซึ่งมีวัตถุจำนวนมาก ตัวอย่างเช่น เกมระดับ AAA ที่เรนเดอร์ในเบราว์เซอร์โดยใช้ WebAssembly และ WebGL รวมถึงเกมแคชชวลบนเว็บที่มีสภาพแวดล้อมที่มีรายละเอียดสูง
- การแสดงภาพทางสถาปัตยกรรม: สามารถใช้ Occlusion queries เพื่อปรับปรุงประสิทธิภาพของการแสดงภาพทางสถาปัตยกรรม ทำให้ผู้ใช้สามารถสำรวจโมเดลอาคารขนาดใหญ่และมีรายละเอียดได้แบบเรียลไทม์ ลองจินตนาการถึงการสำรวจพิพิธภัณฑ์เสมือนจริงที่มีนิทรรศการนับไม่ถ้วน - occlusion culling ช่วยให้การนำทางเป็นไปอย่างราบรื่น
- ระบบสารสนเทศภูมิศาสตร์ (GIS): สามารถใช้ Occlusion queries เพื่อเพิ่มประสิทธิภาพการเรนเดอร์ชุดข้อมูลทางภูมิศาสตร์ขนาดใหญ่และซับซ้อน เช่น เมืองและภูมิประเทศ ตัวอย่างเช่น การแสดงภาพโมเดล 3 มิติของทิวทัศน์เมืองภายในเว็บเบราว์เซอร์สำหรับการจำลองการวางผังเมืองสามารถได้รับประโยชน์อย่างมากจาก occlusion culling
- การถ่ายภาพทางการแพทย์: สามารถใช้ Occlusion queries เพื่อปรับปรุงประสิทธิภาพของแอปพลิเคชันการถ่ายภาพทางการแพทย์ ช่วยให้แพทย์สามารถมองเห็นโครงสร้างทางกายวิภาคที่ซับซ้อนได้แบบเรียลไทม์
- อีคอมเมิร์ซ: สำหรับเว็บไซต์ที่นำเสนอโมเดล 3 มิติของผลิตภัณฑ์ occlusion queries สามารถช่วยลดภาระของ GPU ทำให้มั่นใจได้ว่าประสบการณ์จะราบรื่นแม้ในอุปกรณ์ที่มีกำลังน้อยกว่า ลองพิจารณาการดูโมเดล 3 มิติของเฟอร์นิเจอร์ที่ซับซ้อนบนอุปกรณ์พกพา occlusion culling สามารถช่วยรักษาอัตราเฟรมที่เหมาะสมได้
สรุป
WebGL occlusion queries เป็นเครื่องมืออันทรงพลังสำหรับการเพิ่มประสิทธิภาพการเรนเดอร์และปรับปรุงประสบการณ์ผู้ใช้ในเว็บแอปพลิเคชัน ด้วยการคัดกรองวัตถุที่ถูกบดบังอย่างมีประสิทธิภาพ คุณสามารถลดภาระงานในการเรนเดอร์ ปรับปรุงอัตราเฟรม และทำให้สามารถสร้างฉากที่ซับซ้อนและมีรายละเอียดมากขึ้นได้ แม้ว่าจะมีความท้าทายที่ต้องพิจารณา เช่น ความล่าช้าและค่าใช้จ่ายในการทำ query แต่การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดและการพิจารณาความต้องการเฉพาะของแอปพลิเคชันของคุณอย่างรอบคอบจะสามารถปลดล็อกศักยภาพสูงสุดของ occlusion queries ได้ ด้วยการเรียนรู้เทคนิคเหล่านี้ นักพัฒนาทั่วโลกสามารถส่งมอบประสบการณ์ 3 มิติบนเว็บที่สมบูรณ์ ดื่มด่ำ และมีประสิทธิภาพมากยิ่งขึ้น
แหล่งข้อมูลเพิ่มเติม
- ข้อกำหนดของ WebGL (WebGL Specification): อ้างอิงข้อกำหนดอย่างเป็นทางการของ WebGL สำหรับข้อมูลล่าสุดเกี่ยวกับ occlusion queries
- Khronos Group: สำรวจเว็บไซต์ของ Khronos Group เพื่อหาแหล่งข้อมูลที่เกี่ยวข้องกับ WebGL และ OpenGL ES
- บทช่วยสอนและบทความออนไลน์: ค้นหาบทช่วยสอนและบทความออนไลน์เกี่ยวกับ WebGL occlusion queries เพื่อดูตัวอย่างการใช้งานจริงและเทคนิคขั้นสูง
- เดโม WebGL: ตรวจสอบเดโม WebGL ที่มีอยู่ที่ใช้ occlusion queries เพื่อเรียนรู้จากการนำไปใช้งานจริง