ยกเว้น OpenGL ฉันไม่เคยใช้ห้องสมุดเหล่านั้น แต่ฉันจะพยายามเดาโดยอ่านหน้าวิกิพีเดียเหมือนที่คุณทำ
คุณดูเหมือนถูกต้องเกี่ยวกับเมซา นี่คือข้อมูลเพิ่มเติมที่เรามี:
"ระบบ X window เป็นระบบซอฟต์แวร์คอมพิวเตอร์และโปรโตคอลเครือข่ายที่ให้ GUI พื้นฐานสำหรับคอมพิวเตอร์เครือข่ายมันสร้างเลเยอร์นามธรรมที่เป็นฮาร์ดแวร์"
"GLX ช่วยให้โปรแกรมที่ต้องการใช้ OpenGL ทำได้ภายในหน้าต่างที่จัดทำโดย X Window System
GLX ประกอบด้วยสามส่วน:
- API ที่มีฟังก์ชั่น OpenGL
- ส่วนขยายของโปรโตคอล X ซึ่งช่วยให้ไคลเอนต์ส่ง 3D คำสั่งการเรนเดอร์ - ส่วนขยายของเซิร์ฟเวอร์ X ที่ได้รับคำสั่งการเรนเดอร์จากไคลเอนต์และส่งต่อไปยังไลบรารี OpenGL ที่ติดตั้ง
หากไคลเอนต์และเซิร์ฟเวอร์กำลังทำงานบนคอมพิวเตอร์เครื่องเดียวกันและการ์ดกราฟิก 3D เร่งความเร็ว ถูกบายพาสโดย DRI จากนั้นโปรแกรมไคลเอนต์ได้รับอนุญาตให้เข้าถึงฮาร์ดแวร์กราฟิกโดยตรง "
"โครงสร้างพื้นฐานการแสดงผลโดยตรง (DRI) เป็นอินเทอร์เฟซที่ใช้ในระบบ X Window เพื่ออนุญาตให้แอปพลิเคชันผู้ใช้เข้าถึงฮาร์ดแวร์วิดีโอโดยไม่ต้องการข้อมูลที่จะส่งผ่านเซิร์ฟเวอร์ X"
"Open Inventor เป็น API กราฟิก C ++ 3D ที่ออกแบบมาเพื่อมอบเลเยอร์การเขียนโปรแกรมที่สูงขึ้นสำหรับ OpenGL"
เพื่อให้สิ่งต่าง ๆ ง่ายขึ้นลองจินตนาการถึงการไหลของข้อมูลที่ง่ายขึ้น (และคำสั่ง) ที่เกิดขึ้นที่รายการและออกจากแต่ละ API เหล่านั้น ในตอนแรกเรามีโปรแกรมแอปพลิเคชันของคุณ (รวบรวมรหัส) ที่คุณเรียกใช้จากคอมพิวเตอร์ ในตอนท้ายเรามีภาพที่ปรากฏบนหน้าจอของคุณ
มีหลายกรณีที่ฉันจะยับยั้งคำตอบสำหรับคำถามเหล่านี้:
- คอมพิวเตอร์ของคุณมีกราฟิกการ์ด (GPU) หรือ CPU เท่านั้นเพื่อประมวลผลฟังก์ชั่นกราฟิกหรือไม่
- แอปพลิเคชันของคุณฝังอยู่ในหน้าต่างของระบบ x-window หรือไม่?
หากคุณใช้ระบบ x window จะเป็นการ "เซิร์ฟเวอร์ x" ทำงานบนคอมพิวเตอร์ของคุณหรือบนคอมพิวเตอร์เครื่องอื่นบนเครือข่ายหรือไม่?
ฉันจะสมมติว่าคุณมีไดรเวอร์สำหรับ GPU ของคุณถ้าคุณมีและคุณมี Mesa สำหรับการเรนเดอร์ซอฟต์แวร์)
สถานการณ์แรก: คุณเรียกใช้แอปพลิเคชันกราฟิกที่เขียนด้วย OpenInventor โดยไม่ใช้กับ X Window System และคุณไม่มีการ์ดกราฟิก การไหลเวียนของโปรแกรมจะค่อนข้างคล้ายกับ:
Your application
↓ (uses functions of)
OpenInventor
↓ (calls functions declared by)
OpenGL
↓ (redirects function calls to implementation defined by)
Mesa
↓ (implemented OpenGL functions to be run on the CPU)
[Probably] Operating System rendering API
↓
3D Images on your screen
สิ่งที่เกิดขึ้นที่นี่เรียกว่า "การแสดงผลซอฟต์แวร์": คำสั่งกราฟิกไม่ได้รับการจัดการโดยฮาร์ดแวร์กราฟิกใด ๆ แต่โดย CPU ปกติของคุณโปรเซสเซอร์ที่ใช้งานซอฟต์แวร์โดยทั่วไป
สถานการณ์ที่สอง: ตอนนี้จินตนาการว่าด้วยเงื่อนไขเดียวกันกับข้างบนคุณมีการ์ดกราฟิก การไหลจะมีลักษณะเช่นนี้มากขึ้น:
Your application
↓ (uses functions of)
OpenInventor
↓ (calls functions declared by)
OpenGL
↓ (redirects function calls to implementation defined by)
Proprietary Drivers
↓ (converts OpenGL commands to GPU commands)
Graphic Card
↓
3D Images on your screen
สิ่งที่เกิดขึ้นตอนนี้เรียกว่า "การเร่งด้วยฮาร์ดแวร์" ซึ่งมักจะเร็วกว่าสถานการณ์แรก
สถานการณ์ที่สาม: ตอนนี้เราจะมาแนะนำขั้นตอนการทำงานของ X Window System หรืออย่างน้อยฉันก็คิดว่ามันเป็นไปตามบรรทัด Wikipedia ที่ฉันอ่าน
ลองลืมเกี่ยวกับฮาร์ดแวร์กราฟิกและ API ในขณะที่ การไหลควรมีลักษณะดังนี้:
Your application (X Window System sees it as an "X Client")
↓ (sends requests defined by the X Window System Core Protocol)
X Server
↓ (convert your request to graphic commands)
[Probably] Operating System rendering API
↓
Windows or 2D images on your screen
โปรดทราบว่าเมื่อใช้ระบบ X Window หน้าจอและคอมพิวเตอร์ที่คุณเรียกใช้แอปพลิเคชันของคุณอาจไม่ได้เชื่อมต่อ "โดยตรง" แต่สามารถเชื่อมต่อผ่านเครือข่ายได้
สถานการณ์ที่สี่: สมมติว่าคุณต้องการเพิ่มการเรนเดอร์กราฟิก 3D แฟนซีลงในแอปพลิเคชันไคลเอนต์ X ของคุณจากตัวอย่างก่อนหน้า สำหรับฉันแล้วดูเหมือนว่าระบบ X Window นั้นไม่สามารถทำได้ในตอนแรกหรืออย่างน้อยก็จำเป็นต้องใช้รหัสที่ซับซ้อนมากเพื่อให้เทียบเท่ากับฟังก์ชั่น OpenGL API
โชคดีที่คุณสามารถใช้ GLX เพื่อเพิ่มการรองรับคำสั่ง OpenGL ในระบบ ตอนนี้คุณมี:
Your application
↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
X Server with the GLX extension
↓ (convert your request to OpenGL commands)
OpenGL
↓ (redirects function calls to implementation defined by)
...
ตอนนี้คุณสามารถเชื่อมต่อลูกศรสุดท้ายกับหนึ่งหลังจาก "OpenGL" ในสถานการณ์แรก: คุณสามารถรับภาพ 3 มิติบนหน้าจอของคุณ!
ในที่สุดเกี่ยวกับสิ่งที่ฉันคิดว่าเข้าใจ DRI:
ดูเหมือนว่าจะช่วยให้ Mesa สามารถเข้าถึง GPU ได้เพื่อที่จะปรับเปลี่ยนการไหลของสถานการณ์แรกของเราเป็น:
...
↓
Mesa
↓ (forwards OpenGL commands)
DRI
↓ (converts OpenGL commands to GPU commands)
Graphic Card
↓
3D Images on your screen
และดูเหมือนว่าจะลัดวงจรการไหลเมื่อใช้ GLX เนื่องจากสภาพที่เซิร์ฟเวอร์และไคลเอนต์อยู่ในคอมพิวเตอร์เครื่องเดียวกันและคุณมี GPU ในกรณีนั้นกราฟของสถานการณ์สมมติที่สี่ของเราจะกลายเป็น:
Your application
↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
DRI
↓ ("catches" OpenGL commands and converts them to GPU commands)
Graphic Card
↓
3D Images on your screen
แค่นั้นแหละ !
ตอนนี้จำไว้ว่าฉันไม่ใช่ผู้เชี่ยวชาญในสภาพแวดล้อม Unix ดังนั้นคำแนะนำที่ดีที่สุดของฉันคือการศึกษาเอกสารของแต่ละ API เหล่านั้นเพื่อให้รู้ว่าพวกเขาสามารถทำอะไรได้บ้าง
การรวมแผนภูมิก่อนหน้านี้เป็นแผนภูมิเดียวอาจทำให้เข้าใจได้ง่ายขึ้น ฉันปล่อยให้เรื่องนี้เป็นแบบฝึกหัดให้คุณ!