ฉันจะสร้างพื้นหลังของพื้นที่ขนาดใหญ่ที่เกิดขึ้นซ้ำได้อย่างไม่อาจสังเกตได้


14

ฉันจะสร้างพื้นหลังพื้นที่ขนาดใหญ่ที่ทำซ้ำสำหรับเกม rts ได้อย่างไร ฉันต้องการมีเนบิวลาที่ซับซ้อนและทุ่งฝุ่นด้วยเช่นกัน แต่เนื่องจากหน่วยจะมีพื้นที่มากมายในการสำรวจฉันจึงไม่สามารถมี 120000px คูณ 1200000px jpeg ดังนั้นฉันจึงต้องการให้มีการทำซ้ำภาพ แต่ไม่มีการเปลี่ยนเส้นระหว่างเซ็กเมนต์

ฉันใช้สิ่งนี้กับกรอบ Babylon โดย Microsoft สำหรับเว็บผ้าใบ GL


8
คุณคิดว่าจะใช้ shader เชิงกระบวนการณ์แทนภาพใด ๆ หรือไม่? การค้นหาเว็บแบบง่ายนำสิ่งนี้ขึ้นมาซึ่งมีลักษณะที่น่าประทับใจมาก ๆ : casual-effects.blogspot.com.au/2013/08/starfield-shader.html
LeFauve

@ LeFauve จริงๆแล้วฉันชอบความคิดนี้มาก เกมจำสิ่งที่ผ่านมาได้หรือไม่เมื่อคุณเดินทางกลับ ฉันจะจัดการสิ่งนี้ในหน่วยความจำของเบราว์เซอร์ได้อย่างไร
SuperUberDuper

@ SuperUberDuper: ไม่จำเป็นต้อง "จดจำ" สิ่งใด ๆ ตราบใดที่มันถูกสร้างขึ้นในลักษณะที่กำหนดและท้องถิ่น เพียงสร้างข้อมูลใหม่ทุกครั้งที่จำเป็น
.. GitHub หยุดช่วยน้ำแข็ง

@ LeFauve: นั่นควรจะเป็นคำตอบจริงๆ มันดีกว่าคำตอบที่ได้รับ
. GitHub หยุดช่วยน้ำแข็ง

@R .. ฉันเห็นด้วยก็คงจะดีที่มีรหัสสำหรับมันใน webGL;)
SuperUberDuper

คำตอบ:


19
  1. ใช้การเลื่อนแบบพารัลแลกซ์ มีเลเยอร์พื้นหลังหลายชั้นที่เลื่อนด้วยเศษส่วนที่แตกต่างกันของความเร็วของจุดชมวิวหลัก เลเยอร์ที่ต่ำกว่าจะเลื่อนช้าลง นี่ไม่ใช่วิธีที่ยอดเยี่ยมในการให้ภาพลวงตาของความลึก แต่ยังทำให้พื้นหลังดูซ้ำซ้อนน้อยลงเนื่องจากวัตถุบนเลเยอร์ที่แตกต่างกันจะปรากฏในองค์ประกอบต่าง ๆ เนื่องจากเลเยอร์ที่ไม่ซิงค์กัน

  2. สร้างพื้นหลังของคุณเป็นขั้นตอน แทนที่จะเป็นกราฟิกพื้นหลังขนาดใหญ่หนึ่งชิ้นมีองค์ประกอบขนาดเล็กที่แตกต่างกันหลายอย่างและวางองค์ประกอบทั้งหมดเหล่านั้นหลายครั้งโดยการสุ่มทั่วโลกของเกม

และโดยวิธีการ: อย่าใช้ JPEG เมื่อคุณสามารถหลีกเลี่ยงได้ เป็นรูปแบบการสูญเสียที่สูญเสียคุณภาพมากขึ้นทุกครั้งที่คุณแก้ไขและบันทึกมันได้รับการปรับแต่งอย่างมากสำหรับการถ่ายภาพและไม่สนับสนุนความโปร่งใส ใช้รูปแบบ lossless กับช่องอัลฟาเช่น PNG เหตุผลที่ดีเพียงอย่างเดียวคือเมื่อภาพต้นฉบับของคุณมีเฉพาะใน JPEG (NASA เผยแพร่ภาพดาราศาสตร์ที่น่าสนใจมากมายซึ่งเป็นสาธารณสมบัติ) และคุณไม่ต้องการทำการดัดแปลงใด ๆ


7

วิธีสร้างพื้นหลังที่ไม่มีที่สิ้นสุดสำหรับเกม 2D มีดังต่อไปนี้:

  1. การใช้ซอฟต์แวร์ตัวแก้ไขกราฟิก (เช่น iDraw สำหรับ Mac) สร้างรูปภาพAที่แสดงถึงส่วนของพื้นหลังของคุณ ภาพนี้ควรมีขนาด จำกัด
  2. ทำสำเนา A และทำสำเนาบนแกน Y นี่คือB
  3. ตอนนี้วาง (แนวนอน) togheter A และ B นี้เป็นAB
  4. ในที่สุดนำเข้าภาพABในเกมของคุณและทำซ้ำในแนวนอนผ่านรหัสหลาย ๆ ครั้งตามที่คุณต้องการ

หวังว่านี่จะช่วยได้


2
ขนาด จำกัด แต่ไม่จำกัดเกินไป ยิ่งกระเบื้องมีขนาดเล็กเท่าใดการทำซ้ำก็จะยิ่งชัดเจนมากขึ้นเท่านั้น
cHao

1
หรือแทนการทำมิเรอร์ให้ใช้ตัวกรองออฟเซ็ตใน Photoshop และทำการโคลนนิ่งข้ามเขตแดนหรือใช้ฟิลเตอร์ "Make Seamless" ของ GIMP (Filter → Map → Make Seamless)
wchargin

5

เลเยอร์ทำงานได้ดี

นี่คือคณิตศาสตร์บางส่วน:

สมมติว่าคุณมีรางรถไฟซึ่งทำมาไม่ดีอย่างเช่นที่__ __สังเกตเห็นช่องว่างระหว่างพวกเขา เมื่อล้อหมุนไปมันจะทำรอยบากเล็ก ๆ (รอยบากเล็ก ๆ )

หากความยาวของแทร็กเป็นlวงล้อและรัศมีrนั้นก็2pi rคือเส้นรอบวงของล้อration=l/(2pi r)หากอัตราส่วนพูดว่า 10.25 จากนั้นล้อจะได้รับรอยบากในทุก ๆ ไตรมาสขณะที่ขับรถเป็นเวลานาน

นี่เป็นวิธีที่ง่ายที่สุดที่ฉันสามารถอธิบายเพื่ออธิบายการครอบคลุมพื้นที่

สมมติว่าคุณมีภาพสองภาพถ้ามีอัตราส่วนไตรมาสนี้คุณจะได้รูปแบบ 4 เฟสมันจะทำซ้ำหลังจาก 4 แผ่น สมมติว่าคุณมีพื้นหลัง 1 ภาพและภาพซ้อนทับ 2 ภาพโดยมีเฟส m และ n จากนั้นรูปแบบจะทำซ้ำหลังจากแผ่น m * n

ในขณะที่มันไม่สำคัญมากนักรูปแบบจะดูดีที่สุดถ้าตัวเลขนั้นเป็นแบบ co-prime นั่นคือตัวหารร่วมมากที่ยิ่งใหญ่ที่สุดคือ 1 ตัวอย่างเช่นสมมติว่าเรามีบางอย่างของเฟส 6 และบางส่วนของเฟส 4 เฟสอื่น ๆ ทั้งหมดเหล่านี้จะ "เข้าแถว " ในความรู้สึก.

คุณสามารถใช้เทคนิคนี้ (โดยเฉพาะกับอนุภาคและสิ่งของ) เพื่อสร้างสิ่งที่ "ไม่เหมือนใคร" มากมายด้วยความพยายามเพียงเล็กน้อย

กลับไปที่วงล้อรถไฟถ้าอัตราส่วนไม่มีเหตุผลแล้วร่องจะครอบคลุมล้อ! แต่มันก็ไม่สำคัญ


5

นี่คือแนวคิดอื่นที่ดูเหมือนว่าจะหายไป:

ในกรณีที่มีพื้นหลังทางไกลเช่นกล่องฟ้าเลเยอร์ Parallax ไม่ค่อยรู้สึกดี ลองนึกถึงดวงดาวต่าง ๆ เช่นเมื่อเดินบนโลกหรือดีกว่าตลอดคืนดวงดาวทุกดวงเคลื่อนที่ไปด้วยกันแม้ว่าเราจะรู้ว่ามันมีอยู่หลายร้อยดวงหรือปีแสงซึ่งอยู่ห่างจากกันและกัน สิ่งที่พวกเขาอยู่ไกลเกินไปสำหรับเราที่จะสังเกตเห็นระยะทางของพวกเขา ทั้งหมดที่กล่าวมานั้นเรายังต้องการพื้นผิวที่ใหญ่มาก (พูดถึง 120k * 120k) เพื่อวาดด้วยพลังการคำนวณที่ จำกัด ของเรา (ซึ่งสามารถจัดการได้สูงสุด 8k * 8k) เช่นเดียวกับการใช้เลเยอร์พารัลแลกซ์หลายชั้นคุณควรสร้างพื้นผิวที่แตกต่างกันโดยมีรายละเอียดแตกต่างกัน ตัวอย่างหนึ่งแสดงถึงกาแลคซีอีกแห่งหนึ่งเป็นดาวฤกษ์เป็นต้น แต่คราวนี้แทนที่จะเคลื่อนที่ด้วยความเร็วที่แตกต่างกันพวกมันควรมีขนาดต่างกัน นี่คือตัวอย่าง: พิจารณาใช้ 3 พื้นผิว อันที่หนึ่งคือ 2048 * 2048 อีกอันหนึ่งคือ 729 * 729 และอันที่สามคือ 625 * 625 เนื่องจากตัวเลขเหล่านี้เป็น coprime ซึ่งกันและกันเมื่อรวม 3 พื้นผิวเหล่านี้ใน 3 เลเยอร์หนึ่งควรย้าย lcm (2048,729,625) = 764M พิกเซลจากแหล่งกำเนิดเพื่อดูสิ่งเดียวกันที่วาดซึ่งรู้สึกเหมือนไม่มีที่สิ้นสุด ในความเป็นจริงคุณสามารถเพิ่มเลเยอร์อื่น ๆ หรือเปลี่ยนขนาดของแต่ละพื้นผิวและคุณจะได้ผลลัพธ์ที่ยิ่งใหญ่หลายอย่างน้อยสามัญของขนาดพื้นผิว


2
นี้และคำตอบ @ AlecTeal อธิบายเทคนิคที่เรียกว่าจักจั่นหลักการ มันเป็นวิธีที่ง่ายในการสร้างพื้นหลังที่ไม่มีการทำซ้ำขนาดใหญ่มากและไม่ซ้ำพร้อมทรัพยากรน้อยมาก
โกหกที่

4

ดูเหมือนว่านี่จะเป็นงานสำหรับพิกเซลที่ใช้ในกระบวนการ

ข้อดีของการใช้ภาพคือ:

  • คุณไม่จำเป็นต้องให้บิตแมปขนาดใหญ่
  • มันเป็นขั้นตอนดังนั้นจึงไม่จำเป็นต้องทำซ้ำภาพคงที่ (อาจแตกต่างกันไปเรื่อย ๆ )
  • หากคุณต้องการเอฟเฟกต์พาราลิกซ์คุณสามารถจำลองเครื่องบินนับพันซึ่งจะใช้ภาพไม่ได้
  • คุณสามารถสร้างเอฟเฟ็กต์ล่วงหน้าเช่นแสงแบบไดนามิก
  • การประมวลผลส่วนใหญ่ทำโดย GPU ของคุณปล่อยให้ CPU ฟรีสำหรับส่วนอื่น ๆ ของเกม

การค้นหาเว็บอย่างง่ายนำส่วนนี้ขึ้นมาhttp://casual-effects.blogspot.com.au/2013/08/starfield-shader.htmlซึ่งดูเหมือนสิ่งที่คุณกำลังมองหา

ฉันไม่ใช่ผู้เชี่ยวชาญใน WebGL แต่ตามหน้านี้ดูเหมือนว่าจะใช้ภาษา GLSL ปกติ (นี่คือภาษา C-Like ที่ใช้โดยการ์ดกราฟิกไปยังโปรแกรมเฉดสี) ซึ่งหมายความว่าคุณอาจมีการเปลี่ยนแปลงเล็กน้อยเพื่อไม่ให้ทำงาน

อย่างไรก็ตามคุณอาจลองเริ่มต้นด้วย shader พื้นฐานเพิ่มเติมเพื่อทำความเข้าใจวิธีการทำงาน

หน้าบล็อกนี้แสดงขั้นตอนทั้งหมดในการนำ shader ใน WebGL นั่นเป็นจุดเริ่มต้นที่ดี

อีกสถานที่ที่ดีในการค้นหาตัวอย่างที่น่าอัศจรรย์คือhttps://www.shadertoy.com/


ยอดเยี่ยมหนึ่งขอบคุณ !!! ตอนนี้ฉันมีเวลายากในการเลือกคำตอบ!
SuperUberDuper

2
ถ้าคุณมีโอกาสลอง shaders นั่นเป็นสิ่งที่จะเป็นประโยชน์ในระยะยาวหากคุณต้องการทำเกมที่ดูดี ขั้นตอนแรกนั้นค่อนข้างสูง (ฉันใช้เวลา 2 สัปดาห์เพื่อให้ shader แรกดูตามที่ฉันต้องการ) แต่มันก็คุ้มค่าในระยะยาว
LeFauve

2

คุณสามารถตัด jpeg ขนาดใหญ่ของคุณในส่วนเล็ก ๆ และวาง (ส่วนที่มองเห็นได้) คุณไม่จำเป็นต้องเก็บไว้ในหน่วยความจำตลอดเวลา

และเช่นเดียวกับเกมเก่า ๆ บางแผ่นที่สามารถเล่นซ้ำได้ นั่นเป็นวิธีการแก้ปัญหาทั่วไปสำหรับคอนโซล NES ที่ได้รับการสนับสนุนโดยแม้กระทั่งฮาร์ดแวร์


1
มันยากมากถ้าไม่เป็นไปไม่ได้ที่จะตัด JPEG เป็น JPEG ที่เล็กกว่าซึ่งจะต่อประสานกันโดยไม่มีข้อบกพร่องทางสายตาเนื่องจากการบีบอัดที่สูญเสียไป ถ้าคุณไปหาไทล์คุณจะต้องใช้รูปแบบไฟล์บีบอัดแบบไม่สูญเสียเช่น PNG
LeFauve

1
ฉันยอมรับว่า PNG อาจจะดีกว่าในทางกลับกันพื้นผิว JPEG เป็นเรื่องธรรมดาในกราฟิก 3 มิติและ JPEG ที่สำคัญกว่าใช้บล็อกขนาด 16x16 สำหรับการเข้ารหัสen.wikipedia.org/wiki/ การตัดขวาของPacroblockไม่สามารถสังเกตได้หากไม่ทำรหัสต่ำสุด ประเมินค่า.
Alexsey Shestacov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.