รูปแบบรูปภาพที่ดีที่สุด (เป็นที่นิยมที่สุด)


13

โอเคดังนั้นฉันใช้ C ++ กับ OpenGL และฉันจะสร้างตัวโหลดเพื่อโหลดพื้นผิวสำหรับเกม 3 มิติของฉัน (แต่พื้นผิวเป็นแบบ 2D) ฉันต้องการตัวเลือกของความโปร่งใสแม้ว่าฉันจะตัดสินใจไม่ใช้ก็ตาม ฉันต้องการคุณภาพที่ดีแม้ว่ามันจะไม่ได้เป็นสิ่งที่ดีที่สุด พวกคุณแนะนำอะไรสำหรับการจัดรูปแบบ (PNG, TGA และอื่น ๆ ) นอกจากนี้อาจทำให้เป็นสิ่งที่ง่ายต่อการสร้างตัวโหลดสำหรับ (ฉันจะไม่ใช้ตัวสร้างที่สร้างไว้แล้ว) และถ้าคุณมีลิงค์ / คำแนะนำเพื่อช่วยในการโหลดมันจะได้รับการชื่นชม

คำตอบ:


15

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

เนื่องจากความต้องการที่ค่อนข้างผิดปกติTGAอาจเป็นทางออกที่ดีที่สุดของคุณ TGA 2.0 มีช่องอัลฟาและค่อนข้างง่ายเมื่อเทียบกับ PNG


3
+1 สำหรับ TGA ถ้า OP ต้องการเขียนของเขาเอง ฉันเขียนตัวโหลด TGA ของฉันเองหนึ่งครั้ง รวดเร็วและไม่เจ็บปวด
พรรคคอมมิวนิสต์ Duck

4
@Duck: ไม่เจ็บปวดตราบใดที่คุณกำลังทำ TGA ง่าย ๆ โดยไม่ต้องบีบอัดหรือมีฟีเจอร์แฟนซี หากคุณต้องการตัวโหลด TGA ที่เข้ากันได้อย่างสมบูรณ์ฉันพบว่ามันค่อนข้างเจ็บปวด มันเป็นรูปแบบแปลก ๆ
ZorbaTHut

1
@ Zorba อัดง่ายพอ ไม่ว่าคุณจะสนใจส่วนขยายหรือไม่ก็ตาม
decaviatedcaviar

10

รูปแบบพื้นผิวภาพเป็นตัวเลือกประสิทธิภาพเช่นกัน ฉันแนะนำให้คุณใช้พื้นผิวที่บีบอัดมากที่สุด บนแพลตฟอร์มมือถือสามารถปรับปรุงประสิทธิภาพอย่างมาก (40% หรือมากกว่า) การใช้หน่วยความจำและการโหลดเวลา

พิจารณาพื้นผิว 1024 * 1024:

  • RGB หรือ RGBA (16 บิต): 2Mo (.5s เพื่อโหลดกับ SGS)
  • RGBA (32 บิต): 4Mo (1s เพื่อโหลดกับ SGS)
  • PVRT (4bpp): 512ko (.125s เพื่อโหลดกับ SGS)
  • ETC1 + อัลฟ่า: 1.5Mo (.4s เพื่อโหลดกับ SGS)

ในเกมของเราเรามีเนื้อหา (พื้นผิว) ในหลายรูปแบบ:

  • รูปแบบ DDS สำหรับพื้นผิว DXTC (แพลตฟอร์มเดสก์ท็อป: OS X, Linux, Windows และ Tegra)
  • รูปแบบ DDS สำหรับพื้นผิว ATC (Andreno GPUs)
  • รูปแบบ PVR สำหรับรูปแบบ PVRT (PowerVR GPUs)
  • รูปแบบ PKM สำหรับพื้นผิว ETC1 (อุปกรณ์ที่รองรับ OGLES 2.0 ทั้งหมด)

ในที่สุดเราใช้รูปแบบ raw สำหรับความเข้ากันได้ แต่สำหรับความเข้ากันได้หรือองค์ประกอบ GUI

  • รูปแบบ PNG สำหรับพื้นผิวดิบ มันมีไว้สำหรับพื้นผิว RGBA 16, 24 หรือ 32 บิต (เราใช้ตัวโหลดที่ได้รับอนุญาตของ MIT) มันเป็นพื้นผิวที่ไม่บีบอัด

พื้นผิว ETC1 ไม่มีช่องอัลฟาดังนั้นเราจึงใช้ shader พิเศษที่มีสองพื้นผิว (พื้นผิว rgb และพื้นผิวอัลฟา) รูปแบบการบีบอัดนั้นง่ายต่อการโหลด (100 หรือ 200 loc)

บนเดสก์ท็อป DXTC (S3TC) มีอยู่บนการ์ดหลายใบ ดังนั้นคุณจึงใช้มัน

พื้นผิวที่ถูกบีบอัด

มือโปร

  • การปรับปรุงพื้นผิว
  • การโหลดพื้นผิว (4x หรือมากกว่า)
  • ง่ายต่อการโหลด

แย้ง

  • ไม่รองรับทุกแพลตฟอร์ม
  • สิ่งประดิษฐ์

6
มีความแตกต่างอย่างมากระหว่างพื้นผิวที่ถูกบีบอัดบน videocard (เช่น DXTC) และพื้นผิวที่ถูกบีบอัดในขณะที่จัดเก็บเท่านั้นและจะต้องคลายการบีบอัดในระหว่างการโหลด (เช่น PNG) PNG จะโหลดช้ากว่าพื้นผิวที่ไม่ได้บีบอัดเพราะจะต้องทำการคลายก่อน มันเป็นขนาดไฟล์ที่เล็กกว่าใช่ แต่ปริมาณหน่วยความจำกราฟิกที่ใช้เหมือนกัน
jhocking

8

พื้นผิวเป็นชุดของภาพอย่างน้อยหนึ่งภาพ ซึ่งหมายความว่าพื้นผิวสามารถถูกแสดงด้วย TGA หรือ PNG แต่รูปแบบที่ไม่สามารถแสดงถึงคุณลักษณะที่เป็นไปได้ทั้งหมดของพื้นผิว ทำไม?

เพราะแต่ละคนสามารถถือภาพเดียวเท่านั้น ไม่มี mipmaps ไม่มีพื้นผิว 3 มิติที่เป็นไปได้ ไม่มีพื้นผิวของอาร์เรย์ ไม่มี cubemaps แต่ละไฟล์เหล่านั้นเป็นเพียงภาพ 2D เดียว พวกเขาสามารถเป็นส่วนหนึ่งของพื้นผิว แต่ถ้าคุณไม่ได้ใช้การทำแผนที่ (และฉันขอแนะนำอย่างยิ่งที่จะไม่ใช้ mipmaps เว้นแต่คุณมีความต้องการเฉพาะ) ไฟล์ภาพเดียวในรูปแบบเหล่านี้ไม่สามารถเป็นพื้นผิวได้

เป็นรูปแบบภาพที่ดี แต่สร้างรูปแบบพื้นผิวที่ไม่ดี

ท.บ. เป็นผู้นำด้านรูปแบบพื้นผิวเพราะรองรับความต้องการของพื้นผิวได้จริง รองรับ mipmaps และ cubemaps รองรับพื้นผิว 3 มิติ DDSv10 รองรับพื้นผิวของอาเรย์ คุณสามารถจัดแพคเกจพื้นผิวเดียวภายใน DDS ในแบบที่คุณไม่สามารถทำได้ด้วย PNG หรือ TGA

ท.บ. รองรับข้อมูลพื้นผิวที่ไม่มีการบีบอัดและถูกบีบอัด ตราบใดที่รูปแบบพื้นผิวที่ถูกบีบอัดเป็นหนึ่งในรูปแบบพื้นผิว DXT / BC

PKM มีประโยชน์สำหรับบรรจุภาพที่บีบอัด ETC1 แต่เช่นเดียวกับ PNG มันไม่รองรับคุณสมบัติพื้นผิวจริง

ดูเหมือนว่าไฟล์ PVR จะเทียบเท่า DDS บนมือถือ (แต่ทำไมพวกเขาไม่สามารถใช้ DDS ได้ แต่ฉันไม่รู้) พวกเขาสนับสนุนเทคนิคการบีบอัดที่หลากหลาย แต่ขาดคุณสมบัติ DDSv10 ขั้นสูงเช่นพื้นผิวของอาร์เรย์รวมถึงการรองรับพื้นผิว 3 มิติ

ดังนั้น ท.บ. ชนะในแง่ของการสนับสนุนพื้นผิวที่ครอบคลุม


2
TIFF รองรับคุณสมบัติทุกอย่างที่ DDS ทำและอื่น ๆ ต้องการพื้นผิวที่มีช่องสัญญาณไกล -IR, near-IR, R, G, B และ UV นอกเหนือจาก Alpha หรือไม่? ในจุดลอยตัว IEEE 64 บิตต่อหนึ่งช่อง? บีบอัดโดยอัลกอริทึมใด ๆ (รวมถึง JPEG และ JPEG2000) ตามความเหมาะสมสำหรับช่อง? มีหลายภาพต่อไฟล์และข้อมูลเมตามากมายสำหรับทุก ๆ ภาพ? มันสามารถทำสิ่งนี้ได้ทั้งหมดและอีกมากมาย มันเป็นรูปแบบของ Photoshop ดั้งเดิมด้วยเช่นกัน ขณะนี้เป็นสำหรับการเขียนตักมัน ...
มาร์ติน Sojka

อนุญาตให้ฉันเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดในการใช้รูปแบบพื้นผิว DXT / BC เฉพาะภายใต้คอนเทนเนอร์ DDS; ดูเหมือนว่าไม่ใช่กรณี ฉันได้เห็นCompressonatorโดยใช้รูปแบบการบีบอัดและเอาต์พุตต่าง ๆ เป็น. dds สำหรับทุกคน (สามารถดูคำแนะนำนี้ได้จากเอาต์พุตความช่วยเหลือเมื่อเรียกใช้ cli) และ [นี่] (คำตอบ) บน SO เพื่อบอกว่าคุณสามารถใช้รูปแบบการบีบอัดใด ๆ จากนั้นจัดการตัวเอง)
haxpor

1
@haxpor: คุณสามารถผลักสิ่งที่คุณต้องการในไฟล์และเรียกมันว่า DDS คำถามคือแอปพลิเคชันที่สามารถอ่านไฟล์ DDS ปกติสามารถอ่านไฟล์ของคุณได้หรือจะต้องมีการเข้ารหัสเป็นพิเศษหรือไม่ รูปแบบ DDS ระบุรูปแบบการบีบอัด DXT / BC เท่านั้น (และฉันคิดว่า ASTC ทุกวันนี้) จะเกิดอะไรขึ้นถ้าคุณใช้รูปแบบอื่นอยู่ระหว่างโปรแกรมที่เขียนและโปรแกรมอ่าน แต่นั่นเป็นความจริงในทุกรูปแบบของภาพ
Nicol Bolas

@NicolBolas ขอบคุณที่สรุปมัน ฉันคิดว่ามันเป็นอย่างนั้น
haxpor

5

กลุ่ม Khronos แนะนำรูปแบบไฟล์ KTXสำหรับการจัดเก็บพื้นผิวสำหรับแอปพลิเคชัน OpenGL และ OpenGL ES คุณสามารถใช้libktxเพื่อทำงานกับรูปแบบนี้

คุณสมบัติ:

  • ยกตัวอย่างพื้นผิว OpenGL จากไฟล์ KTX
  • ขยายภาพพื้นผิวที่ถูกบีบอัด ETC1 เมื่อฮาร์ดแวร์ไม่ได้รับการสนับสนุน ETC1
  • สร้างตารางแฮชของคู่คีย์ - ค่าจากไฟล์ KTX เมื่อโหลดพื้นผิว
  • เขียนไฟล์ KTX จากอาร์เรย์ของอิมเมจต้นฉบับและตารางแฮชเพิ่มเติมของคู่ของคีย์ - ค่า
  • สร้างและเติมตารางแฮชของคู่คีย์ - ค่า

3

ดูเหมือนว่าDDS (DirectDraw Surface)เป็นตัวเลือกยอดนิยมสำหรับพื้นผิวในขณะนี้ คือมีรูปแบบพิกเซลความโปร่งใสและการบีบอัดที่แตกต่างกัน สนับสนุนใน OpenGL ผ่านส่วนขยาย GL_ARB_texture_compression

ตัวอย่างเช่นมีรถตักดินแบบ OpenGL ที่นี่


คำตอบของคุณถูกพูดอย่างสับสน ไม่มีเหตุผลที่จะบอกว่ารองรับ DDS ใน OpenGL OpenGL ไม่จัดการกับรูปแบบภาพ
rdb

3

มีข้อควรพิจารณาหลายประการที่นี่:

  1. ความเร็วที่คุณสามารถนำดิสก์ออกจากพื้นผิวและในหน่วยความจำระบบ
  2. ความรวดเร็วในการรับพื้นผิวจากหน่วยความจำระบบไปยัง GPU (ผ่าน glTexImage2D ในกรณีของคุณ)
  3. จำนวนพื้นที่ดิสก์และที่เก็บข้อมูลวิดีโอ RAM อยู่ในงบประมาณของคุณ
  4. ประสิทธิภาพและคุณภาพ

TGA เป็นตัวเลือกที่ดีเพราะในกรณีที่ไม่มีการบีบอัด 24 และ 32 บิตคุณสามารถอ่านข้อมูลใน fread เดียว / อะไรก็ตามและส่งผลลัพธ์โดยตรงผ่าน glTexImage2D โดยไม่ต้องดำเนินการเพิ่มเติม เป็นตัวเลือกที่ไม่ดีเพราะสามารถมีขนาดไฟล์ใหญ่ที่สุดและหากดิสก์ I / O เป็นคอขวดการอ่านของคุณจะช้า

PNG เป็นตัวเลือกที่ดีเนื่องจากรักษาคุณภาพของภาพด้วยขนาดไฟล์เล็กพอสมควร มันเป็นตัวเลือกที่ไม่ดีเพราะ PNG อาจช้าในการคลาย - ถ้านั่นเป็นคอขวดของคุณ - คุณก็รู้

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

DDS (หรือรูปแบบการบีบอัดอื่น ๆ ) เป็นตัวเลือกที่ดีเนื่องจากขนาดไฟล์เล็กลงและความสามารถในการรวม mipmap chain ที่สร้างไว้ล่วงหน้า หากเป็นรูปแบบที่สนับสนุนในฮาร์ดแวร์ (และ DDS ได้รับการสนับสนุนในฮาร์ดแวร์พีซีของผู้บริโภคส่วนใหญ่ - ได้รับมาเป็นเวลานานด้วย) คุณจะได้รับประโยชน์เช่นเดียวกับ TGA - หนึ่ง fread บิตของ poking ในส่วนหัวที่จะคิดออก คุณสมบัติภาพบางอย่างจากนั้นส่งข้อมูลตรงโดยไม่ต้องผ่านขั้นตอนกลาง พื้นผิวที่ถูกบีบอัดจะทำให้โปรแกรมของคุณทำงานได้เร็วขึ้นและใช้ RAM วิดีโอน้อยลง พวกเขาเป็นตัวเลือกที่ไม่ดีเพราะพวกเขาใช้การบีบอัดแบบสูญเสีย (ซึ่งบางครั้งอาจสังเกตเห็นได้ชัดเจน) และอาจไม่รองรับกับฮาร์ดแวร์ทั้งหมด

ถ้าเป็นฉันฉันจะสร้างการสนับสนุนสำหรับทั้ง 4 รูปแบบเหล่านี้ (TGA และ DDS ค่อนข้างง่ายสำหรับการเขียนตัวโหลดด้วย JPG และ PNG ฉันจะใช้ไลบรารีรูปภาพ) เพื่อให้ผู้สร้างเนื้อหาสามารถเลือกรูปแบบที่เหมาะสมที่สุดบน พื้นฐานสำหรับแต่ละพื้นผิว


1
"DDS ได้รับการสนับสนุนในฮาร์ดแวร์พีซีของผู้บริโภคส่วนใหญ่" DDS เป็นคอนเทนเนอร์สำหรับรูปแบบที่แตกต่างกัน คุณไม่ส่งไฟล์ DDS ไปยัง GPU แต่เป็นเนื้อหาของมัน!
Tara

0

และแน่นอนคุณสามารถไปกับ BMP แบบเก่า 32 บิตซึ่งง่ายต่อการโหลด (โดยเฉพาะถ้าขนาดคือกำลัง 2 (จริง ๆ แล้วคูณ 8 ไบต์ IIRC)

ไม่อย่างนั้นดูเหมือนว่าแปลกที่คุณต้องการเพียงรูปแบบเดียว jpg นั้นเจ๋งจริง ๆ สำหรับพื้นผิวที่ละเอียดอ่อนในโลกแห่งความจริง (jpeg สร้างความประหลาดใจด้วย diskspace และ (ลง) โหลดครั้ง), png เพื่อความโปร่งใสและโอกาส 32 บิต (ง่ายต่อการสร้างจากสคริปต์หรือเครื่องมือ 'รวดเร็วและสกปรก')

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.