การเรียนรู้ OpenGL 2.1 ไร้ประโยชน์วันนี้หรือไม่?


44

ฉันยังใหม่กับโลก 3D OpenGL / DirectX และฉันพบว่าข้อกำหนด OpenGL 4.1 และ GLSL เพิ่งเปิดตัวในวันนี้

เพื่อนของฉันให้ Red Book แก่ OGL v2.1 ให้ฉัน แต่เท่าที่ฉันได้อ่าน 3.x และ 4.x นั้นต่างจากมาก 2.x และตอนนี้เลิกใช้แล้ว

ฉันสามารถใช้หนังสือเล่มนี้เพื่อเริ่มต้นเรียนรู้พื้นฐานของ 3D และ CG หรือจะหาสำเนาที่ใหม่กว่าดีกว่าไหม


10
ฉันไม่รู้เกี่ยวกับ OpenGL / DirectX มากนัก แต่ฉันสนุกกับการเล่นเกมบนเครื่องที่อายุมากกว่าหนึ่งปี ฉันจินตนาการว่าคุณรู้ก่อน 3.x OpenGL จะเป็นประโยชน์ต่อนิสัยการเล่นเกมของฉัน แค่ความคิด
Simurr

ฉันไม่ชอบวิธีที่คำถามนี้ถูกใช้เป็นวลี คุณสามารถสร้างเกมใน OpenGL 2.1 ได้หรือไม่? คำตอบ: ใช่แน่นอน ถ้าอย่างนั้นคุณหมายถึงอะไรที่ไร้ประโยชน์ ? คุณสามารถเรียนรู้พื้นฐานของ 3D จากหนังสือเล่มเก่าหรือ API ที่ล้าสมัยได้หรือไม่ อีกครั้งที่ชัดเจนใช่ มันเป็นวิธีที่ดีที่สุดที่จะทำมันได้หรือไม่ อาจจะไม่ได้
bobobobo

คำตอบ:


18

ในเวลาเช่นนี้ฉันมักจะไปสำรวจการสำรวจฮาร์ดแวร์ของ Steam: http://store.steampowered.com/hwsurvey/ - คุณจะเห็นว่าส่วนแบ่งตลาดของระบบคลาส DX10 / 11 เกือบ 80%; สิ่งนี้เทียบเท่ากับ GL3.3 หรือสูงกว่าในวงกว้าง 80% นี้ถูก จำกัด ให้กับผู้ใช้ Vista / 7 - เพิ่มใน DX10 / 11 GPU ด้วย XP และคุณเพิ่มขึ้นเป็น 90%

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

นอกจากนั้นคุณต้องคำนึงถึงข้อเท็จจริงที่ว่าหากคุณเริ่มเรียนรู้วันนี้ด้วยความตั้งใจที่จะจัดส่งบางอย่างคุณจะต้องดูระยะเวลาอย่างน้อยหนึ่งปีก่อนที่คุณจะไปถึงที่นั่น (เว้นแต่เรากำลังพูดถึง เกี่ยวกับกรณีเล็ก ๆ น้อย ๆ / เรียบง่ายจริงๆ) ด้วยแนวโน้มความสามารถของ gfx ที่เพิ่มสูงขึ้นอย่างต่อเนื่องเรากำลังมองหาฮาร์ดแวร์ GL3.3 + ที่ได้รับประโยชน์ 100% ในเวลานั้น

จากนั้นให้คำนึงถึงสิ่งนั้นด้วยการใช้ GL2.1 หรือต่ำกว่านั้นคุณจะต้องเรียนรู้และใช้เรื่องไร้สาระที่ไร้สาระเก่าอันน่าสะพรึงกลัวมากมายแม้ว่าคุณจะ จำกัด ตัวเองไว้ที่ส่วนย่อยของเงาและ VBOs ของ GL2.1 (ระดับ GLSL นั้นน่ารังเกียจ และสตรีมมิ่ง VBOs ทุกคน แต่ไม่สามารถใช้งานได้โดยไม่ต้อง GL_ARB_map_buffer_range) - GL3.3 + ได้แนะนำมากดีกว่า (และ performant เพิ่มเติม) วิธีการในการจัดการหลายสิ่งที่คุณจะได้รับการใช้งานที่ดีของฮาร์ดแวร์ของผู้เล่น (และพวกเขาจะขอบคุณ คุณทำอย่างนั้น) และคุณจะใช้เวลาเขียนโค้ดที่มีประสิทธิผลมากกว่าการต่อสู้กับ API ที่ไม่ต้องการร่วมมือกับคุณ

และแน่นอนว่ามีสถานการณ์คนขับที่หวั่นเกรง ความจริงที่ยาก แต่จริงก็คือไดรเวอร์ GL ใน Windows อยู่ในสถานะเสียใจ - NV รองรับสิ่งที่ไม่ควรทำ AMD ไม่สนับสนุนสิ่งที่ควรทำและกับ Intel คุณจำเป็นต้อง จำกัด ตัวเองกับฟังก์ชัน GL ซึ่งมี เทียบเท่าใน D3D GL_VERSION ที่ใหม่กว่ามีโอกาสมากขึ้นที่คุณจะพบข้อบกพร่องของไดรเวอร์ แต่สำหรับ GL3.3 นั้นมีความเสถียรพอสมควร

ดังนั้นสรุปคือถ้าไม่มีข้อมูลอื่น ๆ (กลุ่มเป้าหมาย ฯลฯ ) ฉันจะกำหนดเป้าหมาย GL3.3 เป็นพื้นฐาน (อาจดึงการทำงานจาก GL_VERSION ที่สูงกว่าที่มีอยู่และตำแหน่งที่ไม่รบกวนรหัสฐาน) มากเกินไป) เว้นแต่จะมีเหตุผลที่เฉพาะเจาะจงและมีการระบุอย่างชัดเจนเพื่อลดระดับต่ำลง (และฉันต้องการให้แน่ใจอย่างนั้น 100% มากกว่าที่จะใช้ความคิดที่คลุมเครือของ " แต่สิ่งที่เกี่ยวกับผู้ที่มีอายุมากกว่าฮาร์ดแวร์ ") ในกรณีหลังฉันจะไม่ไปต่ำกว่า GL2.1 และฉันต้องการดึงฟังก์ชันการทำงาน 3.x มากที่สุดเท่าที่จะทำได้


จุดที่ดีใน GL3.3 ~ = DX10 / 11 และสถิติฮาร์ดแวร์ของ Steam
เนท

เพียงแค่อัปเดตสถิติเหล่านี้ - DX10 / 11 GPU + Vista / 7 อยู่ที่ ~ 88%, เพิ่มอีก 4.38% สำหรับ DX10 / 11 GPU + XP และคุณดูสบาย ๆ มากกว่า 90% การดูดจะเพิ่มขึ้นเร็วกว่าที่ฉันคาดไว้มากเมื่อฉันทำโพสต์ดั้งเดิม
Maximus Minimus

"GL3.3 + ได้แนะนำวิธีการจัดการหลายอย่างที่ดีกว่า (และมีประสิทธิภาพมากกว่า)" - ค่าโดยสาร 3.2 เป็นอย่างไรในการเปรียบเทียบ? ผู้ใช้ Mac ยังไม่ได้รับ 3.3 ฉันสมมติว่ามันเกือบจะเหมือนกัน แต่ไม่ต้องการคิดมากเกินไป
michael.bartnett

38

ฉันขอแนะนำให้ติดกับจุดตัดของ 2.1 และ 3 ยังมีฮาร์ดแวร์และไดรเวอร์จำนวนมากที่รองรับ OpenGL 2.1 เท่านั้น แต่วิธีปฏิบัติที่ได้รับการสนับสนุนโดย OpenGL 3 core นั้นดีกว่า บทแนะนำนี้เป็นจุดเริ่มต้นที่ดีในการสอน (สอน OpenGL 2.0 โดยไม่มีฟีเจอร์ที่เลิกใช้แล้วใน 3)


3
+1 สำหรับการสอน Joe Groff เขานำคุณผ่านขั้นตอนทั้งหมดในบทที่ 2 และโค้ด "ยูทิลิตี้" ที่เขาเพิ่มเข้าไปนั้นเป็นเพียงสองฟังก์ชั่น: หนึ่งไฟล์ที่จะอ่าน (สำหรับ GLSL) และอีกหนึ่งไฟล์เพื่ออ่านภาพ TGA (และคุณก็สามารถใช้อีก ไลบรารีรูปภาพหรือเขียนรูปโหลดเดอร์ของคุณเองเมื่อคุณได้รับตัวอย่างแล้ว) มีการอธิบายทุกอย่างและเป็นส่วนหนึ่งของการสอน
michael.bartnett

18

ฉันจะบอกว่ามันไม่ได้ไร้ประโยชน์

ทำไม? ในขณะที่ส่วนที่เหลือของโลกรองรับ OpenGL 3.x และ 4.0 แต่ Mac OS X ยังรองรับ OpenGL 2.1 เท่านั้น และ OpenGL ES ซึ่งใช้ในแพลตฟอร์มพกพาส่วนใหญ่นั้นยังคงรองรับได้ทุกรุ่น: 1.0, 1.1 และ 2.0; ซึ่งเทียบเคียงได้กับ OpenGL 1.4, 1.5 และ 2.1 ตามลำดับ

ดังนั้นจนกว่า OpenGL ES 1.0 จะหายไปจากพื้นโลกอย่างสมบูรณ์การรู้ว่า OpenGL 2.x จะไม่เสียเปล่า

ไม่ได้หมายความว่าจะไม่มีค่าในการใช้ OpenGL 3.x หรือ 4.0 บนแพลตฟอร์มที่รองรับแน่นอน

อัปเดต: ตั้งแต่เปิดตัว Mac OS X Lion (10.7) ตอนนี้โปรไฟล์รองรับ OpenGL 3.2 Core บน Mac ข่าวประชาสัมพันธ์ฉบับนี้เลิกใช้ส่วนใหญ่ของ OpenGL 1.x เพื่อทำให้ API ง่ายขึ้น ผู้ใช้ OS X เวอร์ชั่นเก่า (และกราฟิก Intel ต่ำสุด) ยังคง จำกัด อยู่ที่ OpenGL 2.0 และ 2.1 การรู้จัก OpenGL 2.x ยังคงมีประโยชน์และจะยังคงอยู่ในระดับนี้ไปสักพัก


Snow Leopard รองรับส่วนขยายส่วนใหญ่ของ OpenGL 3 - แม้แต่ตัวแบ่งเรขาคณิต
Axel Gneiting

@Alex รองรับส่วนขยาย "ส่วนใหญ่" ไม่ได้หมายความว่ารองรับ core GL3 และเรากำลังพูดถึง 3.x
Matias Valdenegro

@Axel Gneiting: มันไม่เหมือนกัน คุณสมบัติที่น่าสนใจส่วนใหญ่ของ OpenGL 3.0+ ไม่สามารถใช้เป็นส่วนขยายได้ มีการเปลี่ยนแปลงหลักจำนวนมาก
greyfade

12

คำตอบของ mh01 ครอบคลุมพื้นฐานมากมายดังนั้นฉันจะเพิ่มผู้ไม่กี่คน

OpenGL ES

พูดคุยเกี่ยวกับ ES 2.0 กับเดสก์ท็อป GL 2.1 เทียบกับเดสก์ท็อป GL 3.3 สำหรับวัตถุประสงค์ของการสนทนานี้คำว่า "GL XY" จะอ้างถึงเดสก์ท็อป OpenGL รุ่น XY ในขณะที่ "ES XY" จะอ้างถึง OpenGL ES XY

โครงสร้าง ES 2.0 นั้นมีความเหมือนกันกับ core GL 3.3 มากกว่าแบบที่มี GL 2.1 GL 3.3 และ ES 2.0 นั้นเป็นทั้งเพียว - แชเดอร์ มันเป็นทั้งวัตถุบัฟเฟอร์แบบบริสุทธิ์ อื่น ๆ GL 2.1 มีประสิทธิภาพและการดักจับรหัสมากมายซึ่งจะทำให้ง่ายต่อการเขียนแอป GL 2.1 ที่ไม่สามารถพกพาไปยัง ES 2.0 ได้อย่างง่ายดาย

อย่างไรก็ตามในแง่ของไวยากรณ์ภาษาแรเงาGLSL ES 1.00 (การแมปกับ ES 2.0) ดูเหมือน GLSL ของ GL 2.1 มากกว่า GL 3.3 attributeและvaryingคำหลักที่ไม่ได้อยู่ใน 3.3 หลัก; มันใช้inและoutซึ่งมีความสอดคล้องและสมเหตุสมผลมากขึ้นเมื่อคุณกำลังจัดการกับ 2 shader สเตจมากกว่า (ซึ่งเป็นสาเหตุที่ ES 3.0 ใช้ไวยากรณ์ GL 3.3)

ง่ายในการทำแผนที่แนวคิดที่ได้เรียนรู้ใน GL 3.3 ถึง ES 2.0 ดังนั้นหากคุณเรียนรู้ GL 3.3 สำหรับเครื่องมือต่าง ๆ ในการทำเช่นนั้นคุณจะเข้าใจวิธีการทำงานในโลก ES 2.0 คุณจะต้องคิดออกว่าเซตย่อยนั้นเป็นของหลักสูตร (เช่น: สิ่งที่ GL 3.3 สามารถทำได้ที่ ES 2.0 ไม่สามารถทำได้) แต่แนวคิดนั้นเหมือนกัน

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

ดังนั้นคุณจะได้รับบางอย่างสำหรับ ES 2.0 เมื่อเรียนรู้จาก GL 3.3 แทน GL 2.1


8

สำหรับเกมที่ไม่ต้องการการเปลี่ยนแปลงที่ยิ่งใหญ่กว่ากับ OpenGL ที่เปิดเผยในรุ่นที่ใหม่กว่าเท่านั้นโดยใช้เพียง 3.x + จำกัด คุณในซีรี่ส์ nvidia 8 ขึ้นไป (ไม่แน่ใจเกี่ยวกับผู้จำหน่ายกราฟิกอื่น ๆ ที่คุณต้องการค้นหา) ดังนั้นหากคุณไม่ได้ใช้คุณสมบัติ 3.x + คุณเพียงแค่สร้างขีด จำกัด เทียมหยุดผู้ที่มีอายุมากกว่า แต่มีการ์ดกราฟิกที่ทรงพลังจากการเล่นเกมของคุณ

ด้วยเหตุนี้ฉันขอแนะนำให้เรียนรู้ชุดย่อยที่เข้ากันได้ไปข้างหน้าและรุ่นที่ใหม่กว่าจากนั้นเลือกรุ่นที่ต่ำที่สุดที่คุณสามารถผลักดันเกมของคุณได้ คุณสามารถ

ฉันจะบันทึกในการตอบคำถามอื่นที่ OpenGL: ES 2.0 ลบฟังก์ชั่นไปป์ไลน์ดังนั้นมันจึงเทียบเท่ากับ 3.0 มากกว่า 2.1 นอกจากนี้ยังสนับสนุนคุณสมบัติที่แตกต่างกันตามรุ่น gl ที่รันไทม์เสมอ


4

ฉันจะบอกว่ามันเป็นการประหยัดที่จะเรียนรู้ OpenGL โดยใช้ Red Book ของคุณเพียงแค่เพิกเฉยสิ่งที่เลิกใช้แล้วในเวอร์ชันที่ใหม่กว่า (เช่น glBegin (), glEnd () - ใช้ VBO แทน ฟังก์ชันการทำงานส่วนใหญ่ในเวอร์ชันที่ใหม่กว่านั้นมีให้บริการมาก่อนผ่านส่วนขยาย


4

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

มันยังคงคุ้มค่าที่จะอ่านผ่าน Red Book ทั้งหมดอย่างน้อยหนึ่งครั้งแม้ว่าคุณจะไม่ได้สร้างโค้ดตัวอย่างและทำแบบฝึกหัดที่ครอบคลุมคุณสมบัติที่ถูกยกเลิกใน OpenGL 3.x


3

คำตอบสั้น ๆ :

ไม่การเรียนรู้ OpenGL 2.1 เป็นความคิดที่ดีแม้ในทุกวันนี้ตราบใดที่คุณเรียนรู้ "ส่วนที่ดี"

คำตอบที่ยาวนาน:

OpenGL สามารถแบ่งได้เป็นสองส่วน: "ส่วนที่ดี" และ "ฟังก์ชั่นเก่า"

สุจริตฉันไม่เห็นประโยชน์มากในการเรียนรู้ฟังก์ชั่นมรดก ("ฟังก์ชั่นคงที่") อย่างไรก็ตามส่วนที่สำคัญของ OpenGL 2.1 (ส่วนที่ดี) ยังคงมีอยู่ในปัจจุบันด้วยการเปลี่ยนแปลงเล็กน้อย

ดังนั้นการเรียนรู้บางส่วนของ OpenGL 2.1 จึงเป็นประโยชน์ โดยเฉพาะอย่างยิ่ง OpenGL ES 2 เป็นที่นิยมมากในทุกวันนี้และ ES 2 ส่วนใหญ่ (แต่ไม่ตรง) เซตย่อยของ OpenGL 2.1 สำหรับการเขียนโปรแกรม 3D ในสมาร์ทโฟน OpenGL ES 2 เป็นสิ่งจำเป็น

ดังนั้น "ดี" คืออะไร โดยพื้นฐานแล้วสิ่งใดก็ตามที่อยู่ใน OpenGL 3.x "โพรไฟล์หลัก" (ตรงข้ามกับ "โพรไฟล์ความเข้ากันได้") และ / หรือใน OpenGL ES 2

  • จุดสุดยอดและชิ้นส่วน Shaders: เรียนรู้พวกเขา
  • พื้นผิว: ยังดี
  • เมทริกซ์: การรู้ว่ามันทำงานอย่างไรมีประโยชน์ แต่glLoadIdentityและการเรียงลำดับของฟังก์ชั่นนั้นล้าสมัยและควรหลีกเลี่ยง
  • แสง: การรู้ว่าแสงสามารถถูกจำลองในคอมพิวเตอร์กราฟิกส์มีประโยชน์อย่างไรglLightfvและควรหลีกเลี่ยงฟังก์ชั่นไฟฟังก์ชั่นคงที่อื่น ๆ
  • บัฟเฟอร์อาร์เรย์: ดี
  • glBegin, glVertex, glColor, glEnd: หลีกเลี่ยงพวกเขา อาจดีสำหรับการทดสอบที่รวดเร็ว แต่มีวิธีอื่นที่ดีกว่าในการทำเช่นเดียวกัน
  • รายการแสดงผล: หลีกเลี่ยง

คำถามที่ฉันโพสต์คำตอบนี้เป็นคำถามซ้ำดังนั้นฉันจึงโพสต์ไว้ที่นี่


1

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


1

ฉันแนะนำให้คุณเรียนรู้สิ่งที่ทันสมัยก่อนและแค่แกล้งทำเป็นสิ่งที่ไม่มีอยู่จนกว่าคุณจะต้องการมัน

สิ่งที่ล้าสมัยอาจมีประโยชน์ในบางกรณีเช่นหากคุณพยายามเขียนโปรแกรมเพื่อรองรับ OpenGL 1.5 หรือเก่ากว่าเท่านั้น (สามารถพบได้ในเน็ตบุ๊กเก่าที่เก่ากว่าและระบบ MacOS รุ่นเก่า), OpenGL ES 1.x (iPhones รุ่นเก่า) และ Android ก่อน 1.6) หรือ OpenGL SC (ชุดย่อยความปลอดภัยที่สำคัญถ้าคุณบังเอิญเขียนโปรแกรมการแสดงผลบนเครื่องบินขับไล่ไอพ่น) ตัวอย่างเช่น Minecraft นั้นสร้างขึ้นจาก OpenGL 1.3 ดังนั้นมันจึงสามารถรองรับฮาร์ดแวร์ที่เก่าแก่ได้จริง ๆ (แม้ว่าจะมีตัวเลือก 'ขั้นสูง')

นอกจากนี้ยังมีประโยชน์หากคุณต้องการรับพิกเซลบนหน้าจอและไม่สนใจที่จะทำในสิ่งที่ 'ถูกต้อง'

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

แต่นอกเหนือจากนั้นควรข้ามถ้าเป็นไปได้

ฉันขอแนะนำให้คุณดูคำตอบของฉันที่นี่และที่นี่สำหรับข้อมูลเชิงลึกเพิ่มเติม

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