เวอร์ชัน OpenGL ใดบ้างที่จะเรียนรู้และ / หรือใช้?


16

ดังนั้นฉันใหม่กับ OpenGL ... ฉันมีความรู้ทั่วไปเกี่ยวกับการเขียนโปรแกรมเกม แต่มีประสบการณ์น้อยมาก

ฉันได้ดูบทความและหนังสือต่าง ๆ และพยายามที่จะดำดิ่งลงใน OpenGL แต่ฉันได้พบเวอร์ชันที่หลากหลายและวิธีการทำสิ่งเก่า ๆ ที่สับสน

ฉันเดาว่าคำถามแรกของฉันคือไม่มีใครรู้ว่าตัวเลขบางส่วนเกี่ยวกับเปอร์เซ็นต์ของนักเล่นเกมที่สามารถเรียกใช้ OpenGL แต่ละรุ่นได้ ส่วนแบ่งตลาดเป็นอย่างไร 2.x, 3.x, 4.x ...

ฉันค้นหาข้อกำหนดสำหรับ Half Life 2 เนื่องจากฉันรู้ว่า Valve อัปเดตด้วย OpenGL เพื่อให้ทำงานบน Mac และฉันรู้ว่าพวกเขามักจะพยายามเข้าถึงฐานผู้ใช้ที่กว้างมากและพวกเขากล่าวว่า GeForce 8 Series ขั้นต่ำ ฉันดูที่ 8800 GT ในเว็บไซต์ของ Nvidia และมันแสดงการสนับสนุน OpenGL 2.1 ซึ่งบางทีฉันผิดฟังโบราณสำหรับฉันเนื่องจากมี 4.x อยู่แล้ว ฉันค้นหาไดรเวอร์สำหรับ 8800GT และมันบอกว่ารองรับ 4.2! มีความแตกต่างเล็กน้อยฮ่า ๆ

ฉันยังอ่านสิ่งต่าง ๆ เช่น XP รองรับเฉพาะบางรุ่นเท่านั้นหรือ OS X รองรับเฉพาะ 3.2 หรือสิ่งอื่น ๆ ทุกประเภท โดยรวมฉันแค่สับสนว่ามีการสนับสนุนจำนวนเท่าใดสำหรับรุ่นต่างๆและรุ่นที่ต้องเรียนรู้ / ใช้

ฉันกำลังมองหาแหล่งเรียนรู้ด้วย ผลการค้นหาของฉันได้ชี้ไปที่ OpenGL SuperBible แล้ว รุ่นที่ 4 มีรีวิวที่ยอดเยี่ยมเกี่ยวกับ Amazon แต่สอน 2.1 รุ่นที่ 5 สอน 3.3 และมีสองสามอย่างในรีวิวที่กล่าวถึงรุ่นที่ 4 นั้นดีกว่าและรุ่นที่ 5 นั้นไม่ได้สอนคุณสมบัติใหม่หรืออะไรบางอย่างอย่างถูกต้องหรือไม่ โดยพื้นฐานแล้วแม้ในสื่อการเรียนรู้ฉันเห็นความแตกต่างและฉันก็ไม่รู้ด้วยซ้ำว่าจะเริ่มจากตรงไหน

จากสิ่งที่ฉันเข้าใจ 3.x เริ่มวิธีใหม่ในการทำสิ่งต่าง ๆ และฉันได้อ่านบทความและบทวิจารณ์ต่าง ๆ ที่คุณต้องการ "อยู่ห่างจากคุณสมบัติที่เลิกใช้แล้วเช่น glBegin (), glEnd ()" แต่มีหนังสือจำนวนมาก และแบบฝึกหัดที่ฉันเห็นใช้วิธีการนั้น ฉันเคยเห็นคนพูดว่าโดยทั่วไปแล้ววิธีใหม่ในการทำสิ่งต่าง ๆ มีความซับซ้อนมากขึ้น แต่วิธีเก่า ๆ นั้นไม่ดี>.>

เพียงแค่ข้อความด้านข้างโดยส่วนตัวฉันรู้ว่าฉันยังมีอะไรอีกมากมายให้เรียนรู้ล่วงหน้า แต่ฉันสนใจที่จะทำ tessellation ดังนั้นฉันเดาว่ามันเป็นปัจจัยเช่นกันเพราะเท่าที่ฉันเข้าใจนั่นเป็นเพียง 4.x?

[แค่ btw เดสก์ท็อปของฉันรองรับ 4.2]


คำถามนี้ (ในสแต็คโอเวอร์โฟลว์) ดูเหมือนจะซ้ำกัน: stackoverflow.com/questions/6823371/…
Anderson Green

คำตอบ:


21

หากคุณสงสัยเกี่ยวกับความครอบคลุมของ OpenGL จุดเริ่มต้นที่ดีคือการสำรวจฮาร์ดแวร์ของ Steam

http://store.steampowered.com/hwsurvey?platform=pc

น่าเสียดายที่ตอนนี้ดูเหมือนว่ามันจะพังแล้วและมันจะไม่แสดงสถิติใด ๆ สำหรับ videocards : \

ฉันยังอ่านสิ่งต่าง ๆ เช่น XP รองรับเฉพาะบางรุ่นเท่านั้น

DirectX 9 นั้นเทียบเท่ากับ OpenGL 2.1, DirectX 10 ถึง OpenGL 3.0 และ DirectX 11 ถึง OpenGL 4.0 นี่คือที่มาของความสับสน

XP รองรับ OpenGL ทุกรุ่น แต่ไม่รองรับ DirectX 10 หรือสูงกว่า นี่คือวิธีที่ Microsoft ต้องการบังคับให้คนอัพเกรดเป็น Vista แต่มันก็ไม่ได้ผลดีนัก OpenGL เป็นมาตรฐานแบบเปิดดังนั้นตราบใดที่ผู้ผลิตวิดีโอการ์ดยินดีที่จะผลิตไดรเวอร์สำหรับ XP มันจะรองรับ OpenGL รุ่นใหม่กว่า

จากสิ่งที่ฉันเข้าใจ 3.x เริ่มวิธีใหม่ในการทำสิ่งต่าง ๆ และฉันได้อ่านจากบทความและบทวิจารณ์ต่างๆที่คุณต้องการ "อยู่ห่างจากคุณสมบัติที่เลิกใช้แล้วเช่น glBegin (), glEnd ()" แต่มีหนังสือจำนวนมาก และแบบฝึกหัดที่ฉันเห็นใช้วิธีการนั้น ฉันเคยเห็นคนพูดว่าโดยทั่วไปแล้ววิธีใหม่ในการทำสิ่งต่าง ๆ มีความซับซ้อนมากขึ้น แต่วิธีเก่า ๆ นั้นไม่ดี>.>

นี่เป็นปัญหาใหญ่สำหรับ OpenGL โดยทั่วไปในสมัยก่อนคุณจะส่งข้อมูลไปที่วิดีโอการ์ดโดยใช้ "โหมดทันที" เริ่มต้นด้วยการทำสิ่งบางอย่างจบลงด้วยการglBegin glEndอย่างไรก็ตามโปรแกรมควบคุมการ์ดไม่ได้เช่นนี้ตลอด พวกเขาจะรู้ได้อย่างไรว่าคุณจะส่งของมากแค่ไหน มันจะเป็น 4 จุดยอดสำหรับสี่เหลี่ยมที่มีพื้นผิวหรือ 100,000 สำหรับรูปแบบสกินเซทหรือไม่? นี่คือเหตุผลที่พวกเขาแนะนำวัตถุบัฟเฟอร์จุดสุดยอด (VBO's) ในขณะที่โหมดทันทีเป็นรายการที่เชื่อมโยง VBO เป็นอาร์เรย์คงที่ นักพัฒนารู้ว่ามันใหญ่แค่ไหนคนขับรู้ว่ามันใหญ่แค่ไหน ทุกคนมีความสุข ดังนั้นคณะกรรมการมาตรฐาน OpenGL (กลุ่ม Khronos) จึงตัดสินใจเลิกใช้โหมดทันทีสำหรับ OpenGL 3.0 ขึ้นไป อย่างไรก็ตามนี่เป็นปัญหาอย่างที่ฉันจะแสดงด้วยตัวอย่างง่ายๆ

สมมติว่าคุณต้องการแสดงรูปสี่เหลี่ยมพื้นผิวโดยเริ่มจากศูนย์

ใน OpenGL 2.1:

  • GL_PROJECTIONตั้งค่าเมทริกซ์ฉายและวางไว้ใน
  • ตั้งค่าเมทริกซ์ modelview GL_MODELVIEWและใส่ไว้ใน
  • โหลดภาพและวางไว้ในที่GL_TEXTURE_2Dจับ
  • กำหนดตำแหน่งพิกัดพื้นผิวและสีสำหรับจุดยอดของคุณ
  • ผูกพื้นผิว
  • glBegin... glVertex2f... ...glTexCoord2fglEnd

ใน OpenGL 3.0:

  • สร้างเมทริกซ์สำหรับการฉายภาพและโมเดล
  • โหลดภาพและวางไว้ในที่GL_TEXTURE_2Dจับ
  • กำหนดตำแหน่งพิกัดพื้นผิวและสีสำหรับจุดยอดของคุณและวางไว้ใน VBO's
  • สร้างวัตถุอาร์เรย์จุดสุดยอด (VAO) และแนบ VBO ของคุณ
  • เขียน shader เพื่อเอาท์พุทรูปสี่เหลี่ยมพื้นผิวและวางลงในโปรแกรม shader
  • แนบเมทริกซ์เข้ากับโปรแกรม shader โดยใช้เครื่องแบบ
  • ผูกพื้นผิว
  • แนบพื้นผิวเข้ากับโปรแกรม Shader
  • glDrawArrays.

ดังนั้นสิ่งที่ผิดพลาดในรุ่นแรก?

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

และในรุ่นที่สองคุณสามารถมีปัญหากับข้างต้นและ :

  • VBO ของคุณผิด
  • VAO ของคุณผิด
  • Shader ของคุณผิด
  • พื้นผิวของคุณมีผลผูกพันกับ shader ผิด

หากไม่มีเครื่องมือแก้ไขข้อบกพร่องที่เหมาะสมสิ่งนี้จะกลายเป็นปัญหาร้ายแรง นี่คือเหตุผลที่ผู้คนบอกว่าคุณควรติดโหมดทันที โชคดีที่ตอนนี้เรามีgDEBugger ที่ยอดเยี่ยมและฟรีแต่ตอนนี้ไม่ใช่กระสุนวิเศษ

ในการตอบคำถามของคุณมันขึ้นอยู่กับเกมของคุณ หากคุณต้องการเข้าถึงผู้ชมจำนวนมาก (เช่นเกมทั่วไปหรือแพลตฟอร์ม 2D) คุณควรกำหนดเป้าหมาย 2.1 หากคุณกำลังสร้างเกมอวกาศอันยิ่งใหญ่ที่ไม่ได้ทำงานบนฮาร์ดแวร์อายุหกขวบให้ตั้งเป้าหมาย 3.3 และหากคุณต้องการสิ่งล่าสุดและยิ่งใหญ่ที่สุดสำหรับความเข้ากันได้ในอนาคตเป้าหมาย 4.0


2
ฉันคิดว่าคุณกำลังแสดงอคติต่อ VAO / VBO ที่นี่ ในความเป็นจริงหากคุณต้องการวาดรูปสี่เหลี่ยมพื้นผิวคุณจะต้องมีชุด VAO / VBO เต็มรูปแบบพร้อมกับเฉดสีและพื้นผิวที่สร้างไว้แล้ว (ระหว่างการเริ่มต้นโปรแกรม - ไม่มีใครสร้างสิ่งเหล่านั้นในขณะทำงาน) การวาดรูปสี่เหลี่ยมที่มีพื้นผิวด้วยวิธีการใหม่คือในความเป็นจริงเพียงแค่การโทรไม่กี่ครั้ง - ยอมรับกันว่ามันโหลดความซับซ้อนที่โปรแกรม init ในขณะที่วิธีเก่านั้นจะทำให้เกิดความซับซ้อนในขณะทำงาน
Maximus Minimus

2
แต่นั่นคือสิ่งที่ฉันหมายถึง: ตอนนี้บั๊กของคุณอาจอยู่ในข้อมูลของคุณ (ข้อมูลจุดสุดยอดและวัตถุพื้นผิว), โปรแกรม shader ของคุณ, รหัส shader ของคุณ, เมทริกซ์ของคุณ, การอัพโหลดเครื่องแบบหรือผูกพัน VAO ของคุณ หากคุณเริ่มต้นจากสิ่งใดนั่นคือระบบย่อยมากมายที่ต้องตรวจสอบ! และคุณต้องติดตามสถานะให้มากขึ้น
knight666

1
โปรดทราบว่า gDEBugger จากไซต์ gremedy ล้าสมัยแล้ว ฉันถือว่าถูกละทิ้งเนื่องจากฟอรัมของพวกเขาหยุดทำงานมานาน เครื่องมือที่ได้รับการหยิบขึ้นมาโดยเอเอ็มดี: gDEBugger
MichaelHouse

2
"glBegin ... glVertex2f ... glTexCoord2f ... glEnd" แค่ไม่. glBegin, glVertex ฯลฯ ไม่เคยถูกต้อง glDrawArrays เปิดตัวใน OpenGL 1.1 (1997) และควรใช้กับ glBegin และ End เสมอ
API-Beast

9

สำหรับสถิติบางอย่างเกี่ยวกับความเข้ากันได้ของฮาร์ดแวร์คุณสามารถดูการสำรวจ Steam: http://store.steampowered.com/hwsurvey/แม้ว่าจะแสดงรายการ DX10 และ DX11 แต่ความเข้ากันได้ของฮาร์ดแวร์นั้นเหมือนกับ OpenGL 3 และ OpenGL 4 ตามลำดับ แม้ว่าจะทราบว่าสถานะการติดตั้งไดรเวอร์ OpenGL ในคนมักจะเลวร้ายยิ่งกว่า DX

Windows XP ไม่รองรับ DX10 หรือ DX11 แต่ OpenGL 3 และ 4 ควรใช้ได้เนื่องจากไดรเวอร์นั้นใช้ได้ OSX รองรับ OpenGL 3 (สูงสุด) บน Linux คุณจะได้รับ OpenGL 4 พร้อมไดรเวอร์ ATI / NVIDIA (แน่นอนเฉพาะในกรณีที่ฮาร์ดแวร์รองรับเท่านั้น)

จากนั้นยังมี OpenGL เวอร์ชันมือถือสำหรับ ES ในความเป็นจริงฉันขอแนะนำให้ดู OpenGL ES 2.0 เพราะมันเล็กลงง่ายต่อการเรียนรู้ แต่คุณต้องใช้วิธีปฏิบัติที่ทันสมัยเช่น shaders และ VBOs มันเป็นสิ่งที่ใช้กับอุปกรณ์มือถือส่วนใหญ่ (ดังนั้นคุณสามารถสร้างเกมมือถือได้) และ WebGL ก็เหมือนกันดังนั้นคุณสามารถเรียนรู้ทั้งหมดในเว็บเบราว์เซอร์ด้วยข้อดีของการพัฒนาอย่างรวดเร็ว OpenGL ES 3.0 มีกำหนดส่งในฤดูร้อนนี้

Tessellation เป็นคุณสมบัติ OpenGL 4.0 ก่อนอื่นคุณควรจะเรียนรู้ประเภทของคนอื่น ๆ ให้พื้นฐานคนเดียว แต่ฉันเห็นด้วยว่ามันน่าสนใจจริง ๆ แล้วฉันได้เขียนแบบทดสอบเล็กน้อยกับมัน: http://blog.tapiov.net/post/15189341463/playing- กับ OpenGL-4-tessellation


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