Psychedelic Graphics 0: บทนำ
(benpence.com)- เป็นบทเริ่มต้นสำหรับการสร้างวิชวลแอนิเมชันและเกมแบบไซคีเดลิก โดยเริ่มจาก การคำนวณ UV และสี เพื่อให้ตามได้แม้ไม่มีพื้นฐานมาก่อน
- หัวใจของการลงสีให้โมเดล 3D คือการเข้าใจ UV mapping/texturing ซึ่งเชื่อมโยงพื้นที่ภาพ 2D เข้ากับพื้นผิว 3D
- พิกัด UV คือค่าคู่หนึ่งใน ช่วง 0.0~1.0 ที่ระบุตำแหน่งบนเท็กซ์เจอร์ โดย
(0.5, 1.0)หมายถึงจุดที่ 50% ในแนวนอนและ 100% ในแนวตั้ง - สีในกราฟิกส์มักแสดงด้วยค่า RGB สามค่า และถ้าแปลง X·Y ของ UV เป็นสีแดง·เขียว การเปลี่ยนแปลงของพิกัดจะมองเห็นเป็นไล่ระดับสี
- โค้ดตัวอย่างกำหนดสีด้วย การคำนวณแยกอิสระรายพิกเซล บนพื้นผิว 3D เดียวที่ครอบคลุมทั้งหน้าจอ จึงต้องใช้วิธีคิดที่ต่างจากการเขียนโปรแกรมทั่วไป
เป้าหมายและสมมติฐานของซีรีส์
- ซีรีส์ Psychedelic Graphics ว่าด้วยวิธีสร้าง วิชวลไซคีเดลิก ที่ใช้ได้กับแอนิเมชันและเกม
- ไม่จำเป็นต้องมีพื้นฐานด้านกราฟิกส์หรือการเขียนโปรแกรมมาก่อน แต่ถ้ามีประสบการณ์ด้านตรีโกณมิติและการเขียนโปรแกรมจะช่วยให้เข้าใจได้ง่ายขึ้น
- เป้าหมายคือการเรียนรู้หลักการพื้นฐานของกราฟิกส์ไซคีเดลิกที่ใช้ใน ตัวอย่างวิดีโอ
- วิดีโอส่วนใหญ่สร้างด้วย Blender แต่เทคนิคในซีรีส์นี้ย้ายไปใช้ในสภาพแวดล้อมอื่นได้ง่าย และจะพูดถึง Blender ใน part 3
- ตอน 0 และ part 1 จะเดินหน้าไปสู่ตัวอย่างที่รันบนเว็บ
โมเดล 3D และ UV mapping
-
โมเดล 3D คือพื้นผิวที่ประกอบด้วยจุดและหน้า
- คอมพิวเตอร์กราฟิกส์ดูเหมือนเป็น 3D แต่เมื่อเขียนโค้ดกราฟิกส์ มักมีหลายกรณีที่ต้อง คิดแบบ 2D
- เมื่อสร้างโมเดลในโปรแกรมแก้ไข 3D แท้จริงแล้วคือการสร้าง vertices ซึ่งเป็นจุดที่ลอยอยู่ในอวกาศ และ faces ซึ่งเป็นหน้าที่เชื่อมจุดเหล่านั้นเข้าด้วยกัน
- โมเดลเป็นพื้นผิวกลวง และสิ่งที่มองเห็นบนหน้าจอมีเพียงพื้นผิวเท่านั้น
- รูปทรง 3D แทบทั้งหมดในเกมและแอนิเมชันล้วนลดรูปลงมาเป็นจุดและหน้าแบบนี้
- แม้โมเดลที่ดูเรียบเนียนก็มักเป็นเพราะมีจุดและหน้ามากพอจนยากจะสังเกตเห็นขอบเขต
-
เท็กซ์เจอร์คือภาพ 2D ที่จะแปะบนพื้นผิว 3D
- วิธีมาตรฐานในการเพิ่มสีให้พื้นผิว 3D คือการใช้ UV mapping/texturing
- เช่นเดียวกับแผนที่ฉายโลกแบบ 2D ที่บางบริเวณดูถูกยืดหรือบิดเบี้ยว ภาพที่คลี่สีของโมเดล 3D ออกมาเป็น 2D ก็อาจเกิดการบิดเบี้ยวได้
- ภาพ 2D ที่คลี่ออกมาคือ texture ซึ่งเก็บสีที่จะนำไปใส่บนพื้นผิวโมเดล 3D ในภายหลัง
- วิธีหนึ่งในการสร้าง image texture คือสร้างไฟล์ภาพเปล่าขึ้นมา แล้วกำหนดว่าแต่ละหน้าของออบเจ็กต์ 3D จะใช้ส่วนใดของภาพนั้น
- หน้า 3D ต่างกันสามารถแชร์พื้นที่เท็กซ์เจอร์เดียวกันได้ และมักใช้วิธีระบายสีเพียงด้านเดียวแล้วกำหนดพื้นที่เดียวกันให้ทั้งสองด้าน เช่นในร่างกายที่สมมาตร
- พื้นที่เท็กซ์เจอร์ที่แต่ละหน้าใช้ไม่จำเป็นต้องมีขนาดหรือสัดส่วนเท่ากับหน้า 3D จริง
การเพนต์เท็กซ์เจอร์และพิกัด UV
-
เมื่อระบายสีบนเท็กซ์เจอร์ ก็จะปรากฏบนโมเดล
- ทุกอย่างที่ระบายบนเท็กซ์เจอร์จะแสดงบน โมเดล 3D
- ซอฟต์แวร์ส่วนใหญ่มีฟังก์ชันที่เมื่อระบายสีลงบนโมเดล 3D โดยตรง ก็จะไปลงสีใน image texture แทนให้
-
พิกัด UV คือตำแหน่ง 2D บนเท็กซ์เจอร์
- พื้นที่เท็กซ์เจอร์ที่จองไว้สำหรับแต่ละหน้าของโมเดล 3D คือ UV map และเป็นข้อมูลที่เชื่อมส่วนหนึ่งของ image texture เข้ากับโมเดล 3D
- UV สามารถมองเป็น พิกัด 2D ที่ระบุตำแหน่งบน image texture ได้
- หน้า 3D แต่ละหน้าถูกกำหนดด้วยจุดหลายจุด และเมื่อจุดเหล่านั้นถูกวางบน image texture แต่ละจุดก็จะมีพิกัด UV
- ใน
(0.5, 1.0)ค่าแรก0.5หมายถึงจุดกึ่งกลางในแนวซ้ายขวา และค่าที่สอง1.0หมายถึงด้านบนสุดในแนวตั้ง - ค่า UV ทั้งสองโดยปกติอยู่ระหว่าง 0.0 ถึง 1.0 และมักใช้พื้นที่พิกัดภายในสี่เหลี่ยมที่ล้อม
(0, 0)กับ(1, 1) - การใช้ 0 และ 1 แทนตำแหน่งพิกเซลช่วยแสดงได้ว่าเคลื่อนที่ไปทางซ้ายขวา·ขึ้นลงเป็นสัดส่วนเท่าใด และถ้าคูณด้วย 100 ก็เข้าใจได้เหมือนเปอร์เซ็นต์
- ชื่อของสองมิติจริง ๆ คือ U และ V และเพราะ X·Y·Z ถูกใช้กับตำแหน่ง 3D ไปแล้ว จึงใช้ชื่อว่า UV
สีและชนิดข้อมูลในกราฟิกส์
-
RGB แสดงสีด้วยค่าสามค่า
- สีในคอมพิวเตอร์กราฟิกส์มักแสดงด้วย RGB คือแดง·เขียว·น้ำเงิน
- ปริมาณสีแดง เขียว และน้ำเงินของสีหนึ่งสีโดยทั่วไปเป็นค่าระหว่าง 0.0 ถึง 1.0
- สีแดงแสดงเป็น
(1.0, 0.0, 0.0), สีดำเป็น(0.0, 0.0, 0.0), สีขาวเป็น(1.0, 1.0, 1.0) - การเขียนแบบเลขฐานสิบหกอย่าง
0xff0000ที่ใช้ในเว็บกราฟิกส์ก็แสดงข้อมูลเดียวกันในอีกรูปแบบหนึ่ง
-
เมื่อมอง UV เป็นสี ก็จะเห็นพิกัด
- เมื่อต้องการแสดงพิกัด UV ให้เห็นเป็นภาพ ตามธรรมเนียมจะใช้ค่าแรก X เป็นสีแดง ค่าที่สอง Y เป็นสีเขียว และตั้งสีน้ำเงินเป็น
0.0 - UV
(0, 1)จะกลายเป็นสี(0.0, 1.0, 0.0)จึงมองเห็นเป็นสีเขียว - UV
(1, 0)จะกลายเป็นสี(1.0, 0.0, 0.0)จึงมองเห็นเป็นสีแดง - เมื่อระบายสี่เหลี่ยมตามตำแหน่ง UV ยิ่งไปทางซ้ายบน สีเขียวจะยิ่งแรงขึ้น และด้านขวาล่างจะเป็นสีแดง
- มุมซ้ายล่างเป็นสีดำเพราะทั้งแดงและเขียวเป็น 0 ส่วนมุมขวาบนเป็นสีเหลืองเพราะมีทั้งแดงและเขียว
- เมื่อต้องการแสดงพิกัด UV ให้เห็นเป็นภาพ ตามธรรมเนียมจะใช้ค่าแรก X เป็นสีแดง ค่าที่สอง Y เป็นสีเขียว และตั้งสีน้ำเงินเป็น
-
float, vec2, vec3
floatคือ ตัวเลขทศนิยม หนึ่งค่า หรือจำนวนแบบ floating-pointvecหมายถึงเวกเตอร์ โดยvec2คือคู่ของตัวเลขทศนิยมสองค่า และvec3คือกลุ่มตัวเลขทศนิยมสามค่า- สี RGB มีค่าสามค่าคือแดง·เขียว·น้ำเงิน จึงแสดงด้วย
vec3 - UV มีสองค่าคือ X และ Y จึงสอดคล้องกับ
vec2
วิธีรันโค้ดกราฟิกส์ตัวอย่าง
- ตัวอย่างโค้ดในซีรีส์นี้ไม่ใช้โมเดล 3D แยกต่างหาก แต่ใช้ พื้นผิว 3D เพียงหน้าเดียว ที่ครอบคลุมทั้งหน้าจอ
- ไม่ได้เพิ่มสีด้วย image texture แต่โค้ดจะกำหนดสีบน image texture โดยตรง
- ลำดับการประมวลผลมีดังนี้
- กล้องในฉาก 3D คำนวณว่าพื้นผิว 3D หน้าใดมองเห็นได้
- ใช้พื้นที่เท็กซ์เจอร์ที่จองไว้ให้แต่ละหน้า หรือก็คือ UV mapping เพื่อคำนวณพิกัด UV
- ส่งข้อมูลอย่างพิกัด UV ที่คำนวณได้และตำแหน่ง 3D ให้โค้ด
- โค้ดกำหนดสีของตำแหน่งนั้น
- การประมวลผลลักษณะนี้สามารถเข้าใจได้ว่าเกิดขึ้นหลายล้านครั้งต่อวินาที
- โค้ดกราฟิกส์ไม่ได้วาดเส้นต่อเนื่องจากจุดหนึ่งบนหน้าจอไปยังอีกจุดหนึ่งโดยตรง แต่ใกล้เคียงกับการตอบว่าสีของตำแหน่งนั้นคืออะไรเมื่อแต่ละตำแหน่งถูกเลือกขึ้นมา
- โค้ดที่เขียนไม่ได้ถูกรันเพียงครั้งเดียวเพื่อสร้างสีทั้งหมด แต่จะรันกับ แต่ละพิกเซล ซึ่งเป็นส่วนเล็ก ๆ ของหน้าจอ
- เนื่องจากมีข้อจำกัดว่าไม่สามารถตรวจสอบสีของพื้นที่อื่นบนหน้าจอได้ การเขียนโปรแกรมกราฟิกส์จึงต้องใช้วิธีคิดที่แตกต่าง แม้จะมีประสบการณ์เขียนโปรแกรมทั่วไปก็ตาม
- part 1 จะต่อไปสู่วิธีสร้างวิชวลที่น่าสนใจภายใต้ข้อจำกัดเหล่านี้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
นี่คือ David Tristram เป็นหนึ่งในสมาชิกผู้ก่อตั้ง Raster Masters กลุ่มการแสดงคอมพิวเตอร์กราฟิกในยุค 1990 และอย่างที่ @hopkins บอกไว้ พวกเขาใช้ เวิร์กสเตชัน Silicon Graphics ระดับไฮเอนด์ สร้างวิดีโอสังเคราะห์ประกอบดนตรีสดของ Grateful Dead, Herbie Hancock, Graham Nash และคนอื่น ๆ
หลังจากผ่านการเปลี่ยนแปลงหลายครั้ง ตอนนี้ผมทำงานหลัก ๆ ใน Resolume Avenue และ TouchDesigner ซึ่งเป็นสภาพแวดล้อมประมวลผลวิดีโอ 2D นี่คือลิงก์บางส่วนที่ให้แรงบันดาลใจ
ทุกวันนี้แค่เสียบโปรเจกเตอร์เข้ากับโน้ตบุ๊กตอนพรีเซนต์ ก็ยังเครียดทุกครั้งเหมือนทอยลูกเต๋าว่าภาพจะขึ้นไหม เลยอยากรู้ด้วยว่าในสมัยนั้น ถ้าจะฉาย วิดีโอ SGI ความละเอียดสูงแบบสด บนจอเหนือวง ต้องใช้โปรเจกเตอร์แบบไหน การคาลิเบรต และการเตรียมตัวอะไรบ้าง
ถ้าอยากลองเล่นกับ กราฟิกไซเคเดลิก โดยไม่ต้องลงลึกระดับต่ำมาก hydra ก็ถือว่าใช้ได้ เป็นสภาพแวดล้อมไลฟ์โค้ดดิ้งบน JavaScript และเส้นทางการเรียนรู้ก็ไม่ชันมาก
พูดถึงเอกสารต้นฉบับและพิกัด UV เมื่อก่อนผมเคยสำรวจวิธีเลื่อน พิกัดเท็กซ์เจอร์ UV ของแต่ละจุดยอดในเมชสี่เหลี่ยมด้วยวิธีที่น่าสนใจอยู่มาก
ตอนนั้นใช้สีต่อจุดยอด แต่ถ้าเป็นสมัยนี้ก็คงใช้แฟรกเมนต์เชดเดอร์ (พิกเซลเชดเดอร์) แบบที่มีใน ShaderToy วิธีที่น่าสนใจเป็นพิเศษคือการพาพิกัดเท็กซ์เจอร์ไหลตามฟิลด์การไหล (flow field) ด้วยการพาไปตามการไหล (advection) จะใช้ฟิลด์เวกเตอร์ 2D อะไรก็ได้ แล้วใช้การเลื่อนซ้ำ ๆ กับแต่ละพิกัด วิธี explicit แบบไม่แม่นยำก็ให้ผลลัพธ์ดีแล้ว
เมื่อพิกัดถูกบิดเบือนไปไกล ภาพจะเริ่มจำไม่ได้ วิธีแก้แบบง่ายคือใส่แรง “คืนรูป” ให้พิกัดกลับไปยังตำแหน่งเดิม มันก็จะเด้งกลับเข้าที่เหมือนกางเศษฟอยล์กระจกให้เรียบ
ตอนนี้ผมใช้ฟีดแบ็กคู่กับเอฟเฟกต์เลื่อนพวกนี้อยู่ การใช้การเลื่อนขนาดเล็กมากซ้ำ ๆ จะให้การเคลื่อนไหวที่ค่อนข้างคล้าย การไหลของของไหล
ถ้าเลือกสี่เหลี่ยมแบบสุ่มแล้วคัดลอกด้วยออฟเซ็ตแบบสุ่มซ้ำ ๆ เอฟเฟกต์ที่ดิจิทัลมาก เป็นเหลี่ยม และคมจัด ก็จะเปลี่ยนเป็นเอฟเฟกต์ที่นุ่มและดูเป็นธรรมชาติผ่านความสุ่มเล็กน้อย (dithering) มันทำงานได้ดีแม้เป็นขาวดำ และท้ายที่สุดก็เป็นแค่ PostScript
https://www.donhopkins.com/home/archive/news-tape/fun/melt/m...
ยังมี “Big Brother” eye.ps ต้นฉบับของ Jeremy ด้วย เป็นเดโมคลาสสิกที่แสดงหน้าต่างลูกตากลม ๆ ของ NeWS
https://www.donhopkins.com/home/archive/news-tape/fun/eye/ey...
LGR: Kai's Power Goo – Classic 90s Funware for PC!
https://www.youtube.com/watch?v=xt06OSIQ0PE
ชอบตรงที่ใน HTML สามารถใช้ เชดเดอร์ กับรูปภาพได้ง่าย ฝีมือด้านนี้ของผมธรรมดา ๆ แต่สนุกที่ได้เห็นว่าคนอื่นผลักมันไปได้ไกลแค่ไหน
แค่ให้การประมาณ depth map ง่าย ๆ ผลลัพธ์ก็น่าสนใจขึ้นมากแล้ว เมื่อหลายปีก่อนผมเคยทำโปรเจกต์ที่ใช้เทคนิคคล้ายกันเพื่อครอสเฟดระหว่างภาพอย่างลื่นไหลพร้อม “เอฟเฟกต์ที่น่าสนใจ” มีทั้งบทความและเดโม
https://sheep.horse/2017/9/crossfading_photos_with_webgl_-_b...
พูดตามตรง บทความ Rolling Hills ที่มากับบทความนี้น่าสนใจกว่ามาก
โดยเฉพาะส่วนช่วงกลาง ๆ ที่นำโค้ดด้านล่างไปใช้กับภาพนิ่ง น่าประทับใจมาก
uv.x = uv.x + sin(time + uv.x * 30.0) * 0.02;uv.y = uv.y + sin(time + uv.y * 30.0) * 0.02;จากมุมมองของคนที่เคยมีประสบการณ์ไซเคเดลิกมาหลายครั้ง อย่างน้อยในขนาดต่ำที่ไม่ถึงขั้นวีรกรรม มันดูใกล้เคียงประสบการณ์ทางสายตาจริงที่สุดแล้ว ถ้าทำคลื่นให้ช้าลงหน่อยและลดช่วงการเคลื่อนไหวลงเล็กน้อย น่าจะเหมือนยิ่งขึ้น
ผมสนใจการจำลอง ภาพหลอนทางสายตาที่เกิดจากสารไซเคเดลิก มากกว่าเอฟเฟกต์ภาพสุดเท่สำหรับการแสดง แน่นอนว่าเคารพศิลปินทั้งสองฝั่ง
มีศิลปินคนหนึ่งที่สร้างวิดีโอไซเคเดลิกด้วยเครื่องมือสมัยใหม่ได้ยอดเยี่ยม แต่ผมนึกชื่อบัญชีไม่ออกเลย ถ้าหาเจอจะทิ้งไว้ด้านล่าง
เมื่อเทียบกับส่วนนี้ของบทความ Rolling Hills แล้ว ทำให้นึกถึงฉากชาจากเห็ดใน Midsommar โดยเฉพาะฉากเปลือกไม้ เอฟเฟกต์ที่สิ่งต่าง ๆ “หายใจ” และไหลนั้นเป็นประสบการณ์ทางสายตาที่พิเศษจริง ๆ และดีที่ได้เห็นการนำไปทำหลายแบบ
วิดีโอตอนมองธรรมชาติ วิธีที่แพตเทิร์นเรขาคณิตเริ่มก่อตัว และเอฟเฟกต์ “หายใจ” นั้นทรงพลังมาก ครอบคลุมสารหลายชนิด ตั้งแต่พื้นผิวที่เหมือนหายใจหรือเต้นเป็นจังหวะเล็กน้อย ไปจนถึง “โลก” เรขาคณิตเต็มรูปแบบที่พบในสารอย่าง DMT
https://www.youtube.com/@josikinz
ช่วงต้นยุค 90 Todd Rundgren ได้ออกแอป Mac ชื่อ Flowfazer แม้มันไม่ได้จำลองประสบการณ์นั้นโดยตรง แต่ช่วยเบี่ยงความสนใจไปทางอื่นเพื่อให้ภาวะลื่นไหลดำเนินต่อไปได้
บางคนก็ใช้เป็นแนวทางสำหรับงานสร้างสรรค์ของตัวเองด้วย
[1] https://grokware.com/
[2] https://m.youtube.com/watch?v=3Z4X4FmIhIw
ตอนนั้นเป็นยุคของสกรีนเซฟเวอร์และ palette animation
ถ้าชอบงานแนวนี้ และมีโอกาสได้ดู Fractaled Visions ทำภาพประกอบการแสดงของนักดนตรี Tipper น่าจะเป็นประสบการณ์ที่ยอดเยี่ยมมาก
เป็นการพรรณนาภาพของสิ่งตกค้างจากไซเคเดลิกที่แม่นยำที่สุดเท่าที่เคยเห็นมา ปีที่แล้วได้ดูการแสดงที่ทำร่วมกัน และเป็นประสบการณ์ทางศิลปะที่ดีที่สุดในชีวิต ภาพของ Fractaled Visions มีความหนาแน่นและซับซ้อนจนแทบไม่น่าเชื่อ
แม้จะรู้เรื่อง shader programming และอื่น ๆ อยู่พอสมควร เอฟเฟกต์บางอย่างก็ยังทำให้คิดว่า “นี่ทำได้ยังไงกันแน่” วิดีโอเซ็ตด้านล่างเก็บประสบการณ์ได้ไม่ครบถ้วน แต่พอถ่ายทอดบรรยากาศได้ การได้ดูแบบ 4K 60fps นั้นเป็นอีกระดับหนึ่งโดยสิ้นเชิง
https://youtu.be/qMcqw12-eSk?si=R5mCaIbR01w3Tbyv
ตรงนี้ควรมีลิงก์ ShaderToy: https://www.shadertoy.com
นึกถึงงานคลาสสิกเก่าแก่ยุค Flash ในสายนี้อย่าง Flashback.swf มีวิดีโอเรนเดอร์อยู่ที่นี่: https://m.youtube.com/watch?v=KaSqrx93rS0
แอนิเมชันนี้ใช้รีมิกซ์ของ Divine Moments of Truth และน่าจะเป็นเวอร์ชัน “Russian Bootleg” ก่อนหน้านั้นก็ฟังดนตรีอิเล็กทรอนิกส์อยู่บ้าง แต่ตอนฟังดนตรีอิเล็กทรอนิกส์แนวนี้ครั้งแรก รู้สึกเหมือนสมองระเบิดจริง ๆ
สัปดาห์นี้ระหว่างทำงานได้เขียน WebGL shader และปรับรายละเอียดให้ดูเหมือนเอฟเฟกต์ของกล้องจริง
แต่บางครั้งพอทำอะไรผิดพลาด ผลลัพธ์ก็ออกมาคล้ายกับที่พูดถึงในบทความนี้ ซึ่งพูดตรง ๆ ว่าสนุกกว่าเอฟเฟกต์ภาพมาตรฐานมาก
การนำไปใช้ด้านภาพอาจมีข้อจำกัด แต่การลองเล่นกับโมเดลที่เราสร้างขึ้นเกี่ยวกับวิธีทำงานของคอมพิวเตอร์กราฟิก เป็นวิธีที่ดีมากในการเรียนรู้แต่ละระบบ ไม่ใช่แค่กราฟิกเท่านั้น แต่ยังรวมถึงคณิตศาสตร์พื้นฐานของการเขียนโปรแกรม วิธีที่ GPU ทำงานและเชื่อมต่อกับหน่วยความจำกับ CPU วิธีที่ดวงตาทำงาน รวมถึงวิธีจัดการแอนิเมชันและเวลา