เชดเดอร์ (makingsoftware.com) 1 คะแนน โดย GN⁺ 2025-11-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp บทความที่เกี่ยวข้อง (sim) การเขียนเชดเดอร์สำหรับ Vegas Sphere 1 คะแนน · 0 ความคิดเห็น · 2023-12-01 บทนำเชิงโต้ตอบเกี่ยวกับ Shader 2 คะแนน · 1 ความคิดเห็น · 2023-10-27 หนังสือเชดเดอร์ (ยังไม่เสร็จสมบูรณ์) 9 คะแนน · 0 ความคิดเห็น · 2025-02-06 พื้นฐาน WebGL2 - ตั้งแต่ต้นจนจบ [ภาษาเกาหลี] 35 คะแนน · 0 ความคิดเห็น · 2023-02-28 1 ความคิดเห็น GN⁺ 2025-11-24 ความคิดเห็นจาก Hacker News บทความน่าสนใจ แต่ส่วนที่แผนภาพแสดงให้เห็นว่า OpenGL / WebGL / WebGPU ถูกสร้างอยู่บน Vulkan นั้นอธิบายผิด WebGL และ WebGPU ทำงานอยู่บน D3D และ Metal โดยตรง ไม่ได้ผ่าน Vulkan อีกทั้ง Vulkan ไม่ใช่โอเพนซอร์ส แต่เป็นมาตรฐาน WebGPU ไม่ได้จำกัดอยู่แค่ในเบราว์เซอร์ และยังมีไลบรารี Dawn สำหรับ C++ และ WGPU สำหรับ Rust จึงรันได้บน Windows, macOS, Linux, iOS, Android เป็นต้น Vulkan ทำงานได้บนแพลตฟอร์มมากกว่า DirectX เล็กน้อย แต่ไม่ได้รวมมากับ Windows โดยค่าเริ่มต้น และรันบน macOS หรือ iOS ไม่ได้ อยากเสริมว่า Vulkan ไม่ใช่โอเพนซอร์ส แต่เป็น มาตรฐานเปิด ตัว implementation จริงเป็นหน้าที่ของผู้ผลิตฮาร์ดแวร์แต่ละราย และ Vulkan เองก็เป็นเพียงไฟล์ header เท่านั้น นอกจากนี้ยังทำงานได้ดีบนแพลตฟอร์มของ Apple ผ่านชั้นแปลง Vulkan-to-Metal อย่าง MoltenVK หรือ KosmicKrisp แม้ Vulkan จะไม่ใช่ cross-platform แบบสมบูรณ์ แต่ก็รองรับได้กว้างกว่า DirectX มาก DirectX ใช้กับ Windows และ Xbox ส่วน Vulkan ใช้ได้กับ Linux, Android, Windows, Nintendo Switch, Switch 2 เป็นต้น ควรกล่าวด้วยว่า WebGPU เป็น API แบบรวมศูนย์ ที่อยู่เหนือ native API ของแต่ละแพลตฟอร์มอย่าง DirectX, Vulkan, Metal API ของ Khronos มี ส่วนขยาย อยู่จำนวนมาก แต่บางส่วนเป็นแบบปิดเฉพาะค่าย ทำให้พกพาได้ไม่ดี PlayStation ไม่รองรับ Vulkan และบน Switch ก็มักใช้ NVN มากกว่า OpenGL/Vulkan แค่ Vulkan รันบน Windows ได้ก็มองว่ามีความเป็นอเนกประสงค์กว่า DirectX แล้ว การที่ Vulkan ใช้ไม่ได้ในบางสภาพแวดล้อม Linux VNC ไม่ใช่กรณีทั่วไป ผู้ใช้ส่วนใหญ่รองรับ Vulkan ผ่านไดรเวอร์ GPU อยู่แล้ว คุณภาพของคอร์ส ในเว็บไซต์นี้น่าทึ่งมาก ถ้าหนังสือเปิดขายแม้จะเป็นแบบพรีออร์เดอร์ก็อยากสนับสนุนโปรเจกต์นี้ ติดตามมาตั้งแต่บทความแรก และแต่ละบทความก็น่าประทับใจขึ้นเรื่อย ๆ ถ้าอยากลองเล่นกับเชดเดอร์ ขอแนะนำ IDE ต่อไปนี้ shadertoy – ใช้ง่ายและนิยมที่สุด เพราะทำงานบนเบราว์เซอร์ Shadron – ใช้งานสะดวก เลยชอบเป็นการส่วนตัว แต่ค่อนข้าง niche SHADERed – ต้องใช้เวลาทำความคุ้นเคยกับ UX แต่ฟีเจอร์ครบพอสมควร KodeLife – เคยได้ยินชื่อ แต่ยังไม่เคยลองใช้เอง Cables(cables.gl) ก็เจ๋งมากเช่นกัน มีผลงานที่น่าประทับใจของ Kirell Benzi เจอ wgshadertoy ใน software manager ของ Mint รองรับหลายแพลตฟอร์มทั้ง flatpak, AUR, macports, Windows บน macOS หรือ iPadOS สามารถเริ่มต้นกับ Metal shader ได้ง่าย ๆ ผ่าน Playgrounds ยังมี Bonzomatic ที่ใช้ในการแข่งขัน live coding เชดเดอร์ของเดโมซีนด้วย การเขียนโปรแกรมก็คือกระบวนการแปลงสิ่งที่มนุษย์เข้าใจให้คอมพิวเตอร์เข้าใจ แต่ การเขียนโปรแกรม GPU นั้นยากกว่ามาก มีทั้งกับดักมากมาย ความไม่สอดคล้องกันระหว่างฮาร์ดแวร์/ซอฟต์แวร์ และเครื่องมือดีบักที่ขาดแคลน ทำให้ประสบการณ์พัฒนาแย่มาก น่าเสียดายที่ชุมชนเองก็เหมือนไม่ค่อยตั้งใจแก้ปัญหานี้ OpenGL และ DirectX เวอร์ชันก่อน 12 เป็นความพยายามที่จะ abstraction รายละเอียดของฮาร์ดแวร์ แต่สุดท้าย abstraction กลับให้ผลเสียมากกว่า เวลาจะเขียน fragment shader ส่วนที่ ไม่เป็นธรรมชาติที่สุด คือแนวคิดที่รับพิกัดเข้ามาแล้วส่งสีออกไป ต่างจากการวาดรูปด้วยปากกา เชดเดอร์จะคำนวณตำแหน่งของแต่ละพิกเซลแล้วตัดสินใจเลือกสี แทนที่จะขยับวัตถุ คุณต้องคิดในแบบ จัดการกับอวกาศ/พื้นที่ vertex shader จะส่งออกตำแหน่งของสามเหลี่ยม จึงรู้สึกเป็นธรรมชาติมากกว่า จะรู้สึกไม่เป็นธรรมชาติก็ต่อเมื่อใช้ fragment shader เกินความเหมาะสมเท่านั้น ในความเป็นจริงมันมีหน้าที่ดูแล ขั้นตอนสุดท้ายของ rendering pipeline อย่างการ sample texture และคำนวณแสง ในงาน PBR หรือ deferred rendering ส่วนใหญ่จะใช้เชดเดอร์ร่วมกัน และคัสตอมเฉพาะเอฟเฟกต์พิเศษ นี่ไม่ใช่ปัญหาของตัวเชดเดอร์เอง แต่ควรมองว่าเป็นความต่างระหว่าง raster กับ vector graphics การ shading ไม่ใช่การวาดเส้นขอบ แต่เป็นกระบวนการแสดงวัสดุแบบอิงฟิสิกส์ งานจิตรกรรมใกล้เคียงกับ shading มากกว่า แต่ภาพวาดด้วยปากกาไม่ใช่ การใช้ fragment shader เพื่อวาดสี่เหลี่ยมเป็นแนวทางที่ผิด เชดเดอร์มีไว้เพื่อ ทำ shading ให้กับสี่เหลี่ยม ในทางปฏิบัติ vertex shader เป็นตัวกำหนดขอบเขต และ fragment shader เป็นตัวเติมด้านใน สำหรับการสอน บางครั้งก็ละ vertex shader ออกไป แล้วใช้ fragment shader เติมทั้งหน้าจอแทน ตอนเรียนรู้โค้ด GPU สิ่งที่ยากที่สุดคือ การตั้งค่าเริ่มต้นที่ซับซ้อนและเข้าใจยาก ทั้งฟอร์แมตข้อมูล ลำดับการแปลง ขอบเขตระหว่าง CPU-GPU ล้วนเป็นแนวคิดที่ยาก และเอกสารก็มีไม่มาก ระบบตัวแปร global ของ GPU ก็ชวนสับสนเช่นกัน ฉันเองก็มีคำถามแบบเดียวกันเยอะมาก เลยเขียนบทความบล็อกไว้สำหรับเรียน WebGL Barebones WebGL in 75 lines, Barebones 3D rendering with WebGL Vulkan ต้องใช้ boilerplate code มากกว่า WebGL อีกเยอะ คำถามบางส่วนไม่ได้เกี่ยวกับตัว GPU โดยตรง แต่เกี่ยวกับ การออกแบบ API GPU ใช้โครงสร้างแบบ SIMT ดังนั้นความสม่ำเสมอของการเข้าถึงข้อมูลจึงสำคัญ การแปลงจะถูกใช้แบบลำดับภายในแต่ละเธรด และขอบเขตระหว่าง CPU-GPU สามารถข้ามไปมาได้หลายครั้งตามงบประมาณด้านประสิทธิภาพ ตัวแปร global มีลักษณะเป็นค่าคงที่ที่ส่งเหมือนกันให้ทุกเธรด เช่น uniform ใน CUDA สามารถเข้าถึง global ได้ด้วยการทำ atomic operation แต่ประสิทธิภาพจะลดลงมาก คอร์สเริ่มต้น WebGL น่าจะเป็นจุดเริ่มต้นที่ดี เว็บไซต์นี้มีความสมบูรณ์สูงจนน่าทึ่ง ทั้งแผนภาพ แถบเลื่อน และสไตล์ ล้วนยอดเยี่ยม เชดเดอร์เกิดขึ้นก่อน GPU และสามารถรันบน CPU ได้เช่นกัน แก่นสำคัญของ GPU คือ โมเดลการทำงานแบบ SIMT/SIMD และเชดเดอร์โดยเนื้อแท้แล้วมีแนวคิดแบบ callback function ผมคิดว่าการที่มันเขียนได้ด้วยวิธีคิดเชิงลำดับแบบเดียวกับ CPU คือสิ่งที่ทำให้เชดเดอร์ทั้งเรียบง่ายและสง่างาม สิ่งที่น่าประทับใจเป็นพิเศษคือภาพประกอบทั้งหมดทำด้วย Figma ตอบกลับไปว่าฟีดแบ็กยอดเยี่ยมมาก ผลงานสวยงามมากและเก็บรายละเอียดได้ดีมาก เห็นด้วย 100% สงสัยว่าเว็บไซต์นี้เป็นแอปคัสตอมที่สร้างด้วย Next.js หรือเปล่า งานยอดเยี่ยม ดูเพลินมากตลอดทั้งชิ้น ขอแนะนำวิดีโอของ Iñigo Quilez ชื่อ “This painting is a mathematical formula” มันอธิบายแนวคิดของเชดเดอร์ที่แทนพิกเซลแต่ละจุดด้วยฟังก์ชันของพิกัด x, y ได้ดีมาก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
WebGL และ WebGPU ทำงานอยู่บน D3D และ Metal โดยตรง ไม่ได้ผ่าน Vulkan
อีกทั้ง Vulkan ไม่ใช่โอเพนซอร์ส แต่เป็นมาตรฐาน
WebGPU ไม่ได้จำกัดอยู่แค่ในเบราว์เซอร์ และยังมีไลบรารี Dawn สำหรับ C++ และ WGPU สำหรับ Rust จึงรันได้บน Windows, macOS, Linux, iOS, Android เป็นต้น
Vulkan ทำงานได้บนแพลตฟอร์มมากกว่า DirectX เล็กน้อย แต่ไม่ได้รวมมากับ Windows โดยค่าเริ่มต้น และรันบน macOS หรือ iOS ไม่ได้
ตัว implementation จริงเป็นหน้าที่ของผู้ผลิตฮาร์ดแวร์แต่ละราย และ Vulkan เองก็เป็นเพียงไฟล์ header เท่านั้น
นอกจากนี้ยังทำงานได้ดีบนแพลตฟอร์มของ Apple ผ่านชั้นแปลง Vulkan-to-Metal อย่าง MoltenVK หรือ KosmicKrisp
DirectX ใช้กับ Windows และ Xbox ส่วน Vulkan ใช้ได้กับ Linux, Android, Windows, Nintendo Switch, Switch 2 เป็นต้น
PlayStation ไม่รองรับ Vulkan และบน Switch ก็มักใช้ NVN มากกว่า OpenGL/Vulkan
การที่ Vulkan ใช้ไม่ได้ในบางสภาพแวดล้อม Linux VNC ไม่ใช่กรณีทั่วไป
ผู้ใช้ส่วนใหญ่รองรับ Vulkan ผ่านไดรเวอร์ GPU อยู่แล้ว
ถ้าหนังสือเปิดขายแม้จะเป็นแบบพรีออร์เดอร์ก็อยากสนับสนุนโปรเจกต์นี้
ติดตามมาตั้งแต่บทความแรก และแต่ละบทความก็น่าประทับใจขึ้นเรื่อย ๆ
มีผลงานที่น่าประทับใจของ Kirell Benzi
รองรับหลายแพลตฟอร์มทั้ง flatpak, AUR, macports, Windows
แต่ การเขียนโปรแกรม GPU นั้นยากกว่ามาก
มีทั้งกับดักมากมาย ความไม่สอดคล้องกันระหว่างฮาร์ดแวร์/ซอฟต์แวร์ และเครื่องมือดีบักที่ขาดแคลน ทำให้ประสบการณ์พัฒนาแย่มาก
น่าเสียดายที่ชุมชนเองก็เหมือนไม่ค่อยตั้งใจแก้ปัญหานี้
ต่างจากการวาดรูปด้วยปากกา เชดเดอร์จะคำนวณตำแหน่งของแต่ละพิกเซลแล้วตัดสินใจเลือกสี
แทนที่จะขยับวัตถุ คุณต้องคิดในแบบ จัดการกับอวกาศ/พื้นที่
vertex shader จะส่งออกตำแหน่งของสามเหลี่ยม จึงรู้สึกเป็นธรรมชาติมากกว่า
ในความเป็นจริงมันมีหน้าที่ดูแล ขั้นตอนสุดท้ายของ rendering pipeline อย่างการ sample texture และคำนวณแสง
ในงาน PBR หรือ deferred rendering ส่วนใหญ่จะใช้เชดเดอร์ร่วมกัน และคัสตอมเฉพาะเอฟเฟกต์พิเศษ
การ shading ไม่ใช่การวาดเส้นขอบ แต่เป็นกระบวนการแสดงวัสดุแบบอิงฟิสิกส์
งานจิตรกรรมใกล้เคียงกับ shading มากกว่า แต่ภาพวาดด้วยปากกาไม่ใช่
เชดเดอร์มีไว้เพื่อ ทำ shading ให้กับสี่เหลี่ยม
สำหรับการสอน บางครั้งก็ละ vertex shader ออกไป แล้วใช้ fragment shader เติมทั้งหน้าจอแทน
ทั้งฟอร์แมตข้อมูล ลำดับการแปลง ขอบเขตระหว่าง CPU-GPU ล้วนเป็นแนวคิดที่ยาก และเอกสารก็มีไม่มาก
ระบบตัวแปร global ของ GPU ก็ชวนสับสนเช่นกัน
Barebones WebGL in 75 lines,
Barebones 3D rendering with WebGL
Vulkan ต้องใช้ boilerplate code มากกว่า WebGL อีกเยอะ
GPU ใช้โครงสร้างแบบ SIMT ดังนั้นความสม่ำเสมอของการเข้าถึงข้อมูลจึงสำคัญ
การแปลงจะถูกใช้แบบลำดับภายในแต่ละเธรด และขอบเขตระหว่าง CPU-GPU สามารถข้ามไปมาได้หลายครั้งตามงบประมาณด้านประสิทธิภาพ
ตัวแปร global มีลักษณะเป็นค่าคงที่ที่ส่งเหมือนกันให้ทุกเธรด เช่น uniform
ใน CUDA สามารถเข้าถึง global ได้ด้วยการทำ atomic operation แต่ประสิทธิภาพจะลดลงมาก
คอร์สเริ่มต้น WebGL น่าจะเป็นจุดเริ่มต้นที่ดี
ทั้งแผนภาพ แถบเลื่อน และสไตล์ ล้วนยอดเยี่ยม
เชดเดอร์เกิดขึ้นก่อน GPU และสามารถรันบน CPU ได้เช่นกัน
แก่นสำคัญของ GPU คือ โมเดลการทำงานแบบ SIMT/SIMD และเชดเดอร์โดยเนื้อแท้แล้วมีแนวคิดแบบ callback function
ผมคิดว่าการที่มันเขียนได้ด้วยวิธีคิดเชิงลำดับแบบเดียวกับ CPU คือสิ่งที่ทำให้เชดเดอร์ทั้งเรียบง่ายและสง่างาม
มันอธิบายแนวคิดของเชดเดอร์ที่แทนพิกเซลแต่ละจุดด้วยฟังก์ชันของพิกัด x, y ได้ดีมาก