มันสำคัญไหมว่าฉันจะเรียนรู้ OpenGL หรือ Direct3D?


11

ความแตกต่างระหว่างรายละเอียดการใช้งานเล็กน้อยของ API ทั้งสองนี้หมายความว่าเมื่อฉันได้เรียนรู้แล้วฉันสามารถใช้กับทุกสิ่งได้หรือไม่ หรือมีเหตุผลในการเรียนรู้อย่างใดอย่างหนึ่งมากกว่าที่อื่นถ้าฉันต้องการที่จะสามารถใช้งานได้โดยทั่วไปโดยไม่ต้องเรียนรู้ API อื่นในอนาคต? เป็นหนึ่งหรือมากกว่าทั่วไป?

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

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


2
คำตอบของ ratchet freak เป็นคำตอบที่ดี หากคุณต้องการที่จะเรียนรู้ Direct3D คุณสามารถอ่านหนังสือฟรีของฉัน"การ Direct3D ท่อกราฟิก" รายละเอียด API ส่วนใหญ่เป็น Direct3D9 แต่แนวคิดนั้นเหมือนกัน ประเด็นก็คือแนวคิดในการเขียนโปรแกรมกราฟิก 3 มิติไม่ได้เปลี่ยนไปตั้งแต่ปลายทศวรรษ 1960 API สำหรับการแสดงแนวคิดเหล่านั้นมีความชาญฉลาดมากขึ้น
ทำให้ถูกกฎหมาย

คำตอบ:


9

ฉันไม่คิดว่ามันมีความสำคัญมากนักซึ่ง API ที่คุณต้องการใช้เมื่อพิง "โปรแกรมกราฟิก" สิ่งสำคัญในการเรียนรู้คือแนวคิดทั่วไปที่คุณใช้เมื่อทำงานกับฉาก 3 มิติ ตัวอย่างเช่นคุณต้องการเรียนรู้วิธีเขียนกราฟฉากอย่างง่าย (และซับซ้อนยิ่งขึ้น) แนวคิดเหล่านี้สำคัญกว่าชื่อเมธอด API เฉพาะที่คุณต้องโทร

เปรียบเทียบเมื่อเรียนรู้วิธีการเขียนโปรแกรม หากคุณเขียนโปรแกรมในภาษาจาวาค่อนข้างดีคุณจะไม่มีปัญหาในการเรียนรู้ภาษา C ++, Objective-C, Swift หรือภาษาเชิงวัตถุอื่น ๆ เพราะมันเป็นแนวคิดและความคิดที่คุณเรียนรู้

ตัวเลือกระหว่าง OpenGL, Direct3D และ Metal เป็นตัวเลือกหลักซึ่งเป็นระบบปฏิบัติการที่คุณกำหนดเป้าหมาย Direct3D นั้นใช้งานได้บน Windows, Metal บน OS X และ iOS และ OpenGL รองรับในระบบส่วนใหญ่รวมถึง OS X, iOS, Windows และ Linux

การ์ดกราฟิกอาจมีอิทธิพลเล็กน้อยต่อการตัดสินใจนี้เนื่องจากฉันไม่รู้การ์ดที่รองรับเพียงหนึ่งหรือสอง หากคุณไม่มีการ์ดกราฟิกเฉพาะการแสดงผลตามเวลาจริงจะเป็นปัญหาในไม่ช้า แม้ว่า Intel HD Graphics และคู่หูของ AMD สามารถทำได้ค่อนข้างมาก

ดังนั้นเลือกแพลตฟอร์มของคุณ


คำเตือน: ณ ตอนนี้ฉันไม่ได้ใช้ Direct3D หรือโลหะ


2
> "ถ้าคุณเก่งในการเขียนโปรแกรมเช่น Java คุณจะไม่มีปัญหาในการเรียนรู้ C ++" - นี่ไม่เป็นความจริง ทุกคนจะมีปัญหามากมายในการเรียนรู้และใช้ C ++ การเปรียบเทียบกับ Java หรือภาษาที่ปลอดภัยอื่น ๆ นั้นไม่เหมาะสมอย่างสมบูรณ์ สำหรับภาษาอื่นที่คุณระบุไว้ (Objective-C, Swift หรือภาษาเชิงวัตถุอื่น ๆ ) ที่ข้อความส่วนใหญ่เป็นจริงแม้ว่า
ชื่อที่แสดง

9

ขณะนี้เรากำลังอยู่ในช่วงเปลี่ยนผ่านกระบวนทัศน์ของ API

วิธีการที่โรงเรียนเก่าของการผูกบัฟเฟอร์, เครื่องแบบ, คุณลักษณะ, รูปแบบและโปรแกรมเป็น (โดยปริยาย) รัฐทั่วโลกและวาดเยี่ยงอย่างกับรัฐนั้นเป็นเรื่องธรรมดาทั่ว D3D11 และ OpenGL อย่างไรก็ตามมีค่าโสหุ้ยจำนวนมาก (ในการตรวจสอบสถานะและไม่รู้ว่าโปรแกรมต้องการทำอะไรจนถึงนาทีสุดท้าย) พวกเขายังไม่ปลอดภัยด้าย (ส่วนใหญ่)

นี่คือเหตุผลที่ apis ใหม่เกิดขึ้น (หรือกำลังจะมาเร็ว ๆ นี้) D3D12, vulkan และ Metal โดดเด่นที่สุด API เหล่านี้ให้การควบคุมมากขึ้นกับโปรแกรมและช่วยให้ประกาศล่วงหน้าสิ่งที่ต้องการทำโดยใช้บัฟเฟอร์คำสั่ง นอกจากนี้ยังช่วยให้คุณจัดการทรัพยากรของคุณเอง (ข้อมูลจุดสุดยอด, พื้นผิว, ... ) ได้โดยตรงมากขึ้น การใช้พวกมันกับหลาย ๆ ตัวจะยิ่งไปข้างหน้ามากขึ้น

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

  • หากคุณต้องการบางสิ่งที่ "เพิ่งได้ผล" แม้แต่กับฮาร์ดแวร์รุ่นเก่า API ของโรงเรียนเก่าก็ดีกว่า พวกเขายังเป็นที่รู้จักกันดีและคุณจะได้รับความช่วยเหลือเพิ่มเติมจากพวกเขาทางออนไลน์

  • ในทางกลับกันถ้าคุณสามารถจัดการกับลักษณะอะซิงโครนัสของคำสั่งการจัดส่งและไม่ต้องติดตามบัฟเฟอร์ทั้งหมดที่คุณจัดสรร ดังนั้น API ใหม่อาจเป็นสิ่งที่คุณต้องการ


6
ใหม่ API ของกราฟิกที่ชัดเจนไม่ได้ออกแบบจริงๆสำหรับการบริโภคโดยเฉลี่ยกราฟิกโปรแกรมเมอร์ที่พวกเขากำลังมากขึ้นสำหรับคนที่ทำผลงานในโครงสร้างพื้นฐานของเครื่องยนต์หรือสำหรับผู้ที่จริงๆต้องประสิทธิภาพ พวกมันให้ปืนที่ใหญ่กว่าและชี้ไปที่เท้าของคุณ
porglezomp

3

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

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

ดังที่คนอื่น ๆ กล่าวถึงที่นี่เรากำลังอยู่ในช่วงการเปลี่ยนผ่านไปสู่ชุด API ใหม่ (Vulkan, Metal และอื่น ๆ ) ดังนั้น ณ จุดนี้ถ้าคุณยังใหม่กับการพัฒนาด้านกราฟิกอย่างสมบูรณ์คงเน้น GLSL เป็นแนวคิดที่ดีตั้งแต่ Vulkan จะใช้ประโยชน์จากมันเช่นกัน

เกี่ยวกับการพกพา D3D เป็น Windows เท่านั้น (มีข่าวลือว่าโครงการไวน์พยายามให้ D3D ทำงานภายใต้ Linux แต่ยังไม่มีความเป็นไปได้) OpenGL เป็นข้ามแพลตฟอร์ม หากคุณต้องการใช้งานมือถือ OpenGL ES เป็นตัวเลือกที่ใช้ได้ แน่นอนว่าทั้ง OpenGL และ OpenGL ES มีรุ่นที่แตกต่างกันซึ่งไม่รองรับในทุกแพลตฟอร์ม

ในตอนท้ายของวัน API ทั้งหมดเข้าถึงฮาร์ดแวร์เดียวกันบนเครื่องของคุณมันเป็นเพียงเรื่องของ "วิธี" ที่พวกเขาเข้าถึง


Direct3D เป็นสิ่งที่คุณจะใช้หากคุณกำลังเขียนโปรแกรมสำหรับคอนโซล Xbox ใด ๆ
ทำให้ถูกกฎหมาย

คุณหมายถึงอะไรโดยไม่มีสิ่งใดเป็นไปได้ ไวน์รันโปรแกรมที่ใช้ D3D นับร้อยโดยไม่มีปัญหาและทำมาหลายปีแล้ว แน่นอนว่ามีข้อบกพร่องและชิ้นส่วนที่ไม่ได้ใช้งาน แต่นั่นไม่ได้ทำให้ API ทั้งหมดใช้ไม่ได้
Ruslan

0

ฉันจะพูดสองสามคำเกี่ยวกับการแสดงผลโดยไม่ใช้กราฟิกการ์ด

Niether OpenGL หรือ DirectX ต้องการการ์ดกราฟิกจริงๆ การใช้งานอาจถูกเร่งซอฟต์แวร์อย่างสมบูรณ์

สำหรับ OpenGL ใน Linux มี rasterizer ซอฟต์แวร์ Mesa จากประสบการณ์ของฉันมันใช้งานได้ดีตราบใดที่คุณไม่ต้องผลักมันแรงเกินไปกับการรวมคุณสมบัติแปลก ๆ (รายการที่แสดง + อาเรย์จุดสุดยอดที่จัดทำดัชนีไว้) ฉันคิดว่ารายการข้อบกพร่องที่แท้จริงของพวกเขานั้นสูงมาก ตรวจสอบให้แน่ใจว่าได้ทำการทดสอบอย่างต่อเนื่อง!

ฉันมีประสบการณ์ใช้ OpenGL น้อยลงใน Windows แก้ไขคำตอบถ้าคุณรู้อะไร!

DirectX SDK มาพร้อมกับ rasterizer ของซอฟต์แวร์ที่เรียกว่า "Reference rasterizer" ส่วนใหญ่ใช้สำหรับการดีบั๊กในความคิดของฉัน แต่ฉันรู้ว่ามีเพื่อนอย่างน้อยหนึ่งคนที่ใช้ตัวอ้างอิงอ้างอิงเมื่อทำการพัฒนา DX11 บนแล็ปท็อปที่มีคุณสมบัติ DX10 เท่านั้น ตามที่ระบุไว้ในคำตอบอื่น ๆ DirectX เป็น Microsoft เท่านั้น


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