เหตุใดจึงมี glMatrixMode ใน OpenGL

ฉันแค่ไม่เข้าใจว่า glMatrixMode ของ OpenGL มีไว้เพื่ออะไร

เท่าที่ฉันเห็น เมื่อเรียก glMatrixMode(GL_MODELVIEW) แล้วจะตามด้วย glVertex, glTranslate, glRotate และสิ่งที่คล้ายคลึงกัน นั่นก็คือคำสั่ง OpenGL ที่วางวัตถุบางชิ้นในช่องว่าง ในทางกลับกัน ถ้า glOrtho หรือ glFrustum หรือ gluProjection ถูกเรียก (เช่น วิธี เรนเดอร์ ของอ็อบเจ็กต์ที่วางอยู่) ก็จะมีการเรียกก่อนหน้าเป็น glMatrixMode(GL_PROJECTION)

ฉันเดาว่าสิ่งที่ฉันเขียนจนถึงตอนนี้คือการสันนิษฐานว่ามีคนพิสูจน์ว่าฉันผิด แต่ไม่ใช่ ประเด็น ในการใช้ โหมดเมทริกซ์ ที่แตกต่างกันอย่างแน่นอนเพราะมีประเภทที่แตกต่างกัน ของ gl-functions: ผู้ที่เกี่ยวข้องกับการวางวัตถุและผู้ที่เกี่ยวข้องกับวิธีการเรนเดอร์วัตถุ?


person René Nyffenegger    schedule 30.12.2010    source แหล่งที่มา
comment
โปรดทราบว่าขณะนี้เลิกใช้แล้ว และคุณควรใช้เชเดอร์และเครื่องแบบที่ชัดเจนเท่านั้น โดยเริ่มจาก OpenGL 3.1 ตัวอย่างเช่น OpenGL ES 2.0 ไม่รองรับ glMatrixMode() และคล้ายกันเลย (แน่นอนว่าเว้นแต่คุณจะมีโค้ดจำนวนมากที่ทำสิ่งนี้และ/หรือจำเป็นต้องรองรับฮาร์ดแวร์/ไดรเวอร์เก่า)   -  person Macke    schedule 31.12.2010
comment
และ glVertex ควรได้รับการพิจารณาว่าเลิกใช้แล้วตั้งแต่ OpenGL 1.0 ขึ้นไป :)   -  person Kos    schedule 31.12.2010
comment
เมื่อคุณพูดถึงบางสิ่งว่าเลิกใช้แล้ว โปรดระบุด้วยว่าอะไรคือสิ่งทดแทนที่ทันสมัย ​​เพราะหากไม่มีสิ่งนั้น มันก็ไม่ได้ให้ข้อมูลมากนัก   -  person SasQ    schedule 07.01.2015
comment
@Kos จาก OpenGL 1.1 ค่อนข้าง ทางเลือกแรก — glDrawArrays — ปรากฏเฉพาะตอนนั้นเท่านั้น   -  person Ruslan    schedule 06.07.2016


คำตอบ (4)


เป็นเรื่องง่ายและสามารถตอบได้สั้นมาก:

  • การแสดงจุดยอด (ดังใน glVertex ) ขึ้นอยู่กับ สถานะปัจจุบัน ของเมทริกซ์ที่เรียกว่า "เมทริกซ์มุมมองแบบจำลอง" และ "เมทริกซ์การฉายภาพ"

  • คำสั่ง glTranslatef, glPushMatrix, glLoadIdentity, glLoadMatrix, glOrtho, gluPerspective และทั้งตระกูลส่งผลต่อ เมทริกซ์ปัจจุบัน (ซึ่งเป็นอย่างใดอย่างหนึ่งข้างต้น)

  • คำสั่ง glMatrixMode เลือกเมทริกซ์ (model-view หรือการฉายภาพ) ซึ่งได้รับผลกระทบจากคำสั่งที่กล่าวมาข้างต้น

(นอกจากนี้ยังมีเมทริกซ์พื้นผิวที่ใช้สำหรับพิกัดพื้นผิวด้วย แต่ไม่ค่อยได้ใช้)

ดังนั้นกรณีการใช้งานทั่วไปคือ:

  • ให้เมทริกซ์มุมมองโมเดลทำงานเกือบตลอดเวลา
  • เมื่อใดก็ตามที่คุณต้องเริ่มต้นเมทริกซ์การฉายภาพ (โดยปกติจะเป็นจุดเริ่มต้นหรือเมื่อปรับขนาดหน้าต่าง) ให้สลับแอ็กทีฟเป็นการฉายภาพ ตั้งค่าเปอร์สเปคทีฟ และเปลี่ยนกลับเป็นมุมมองโมเดล
person Kos    schedule 31.12.2010
comment
คุณควรตั้งค่าเมทริกซ์การฉายภาพใหม่เสมอ (เช่น รีเซ็ตใหม่) ทุกครั้งที่คุณผ่านการแสดงผลแบบเต็มหน้าจอ คุณจะต้องใช้การฉายภาพที่แตกต่างกันหลายแบบสำหรับแอปพลิเคชันในโลกแห่งความเป็นจริงอยู่แล้ว ตัวอย่างเช่น ในการเรนเดอร์ HUD ในเกม คุณจะต้องใช้การฉายภาพแบบอื่น นอกเหนือจากฉากที่เหมาะสม OpenGL ไม่รู้จักการเริ่มต้นอื่นใดนอกจากการได้รับบริบท ดังนั้นโปรดลืมไปทำบางอย่างที่ใดที่หนึ่ง หรือทำรูปแบบโง่ๆ ที่ตั้งค่าการฉายภาพในตัวจัดการการปรับรูปร่าง - person datenwolf; 01.01.2011
comment
@datenwolf - จริง แต่ push/popMatrix บนเมทริกซ์การฉายภาพสำหรับการซ้อนทับ 2D ก็ใช้ได้เช่นกัน ดังนั้นมันจึงไม่ได้แตกต่างกันมากนัก - person Kos; 01.01.2011
comment
สิ่งที่แปลกก็คือฉันไม่สามารถจินตนาการได้ว่า glOrtho หรือ gluPerspective สามารถใช้กับสิ่งอื่นใดนอกเหนือจากเมทริกซ์การฉายภาพได้อย่างไร และ glTranslate, glRotate และการแปลงอื่น ๆ ที่จะใช้สำหรับเมทริกซ์การฉายภาพ ดังนั้นเหตุใดฟังก์ชันสำหรับการตั้งค่าการฉายภาพจึงไม่เลือก เมทริกซ์การฉายภาพภายใน? มันจะช่วยผู้ใช้ปวดหัวและป้องกันคนงี่เง่าได้มากกว่านี้ฉันเดา ฟังก์ชั่นที่สามารถเรียกใช้บนเมทริกซ์ตัวใดตัวหนึ่งก็ยังสามารถใช้การเลือกโหมดได้เหมือนเดิม - person SasQ; 07.01.2015
comment
วิดีโอนี้ช่วยให้เข้าใจการแสดงเมทริกซ์โมเดล-วิว-การฉายภาพโดยสัญชาตญาณ youtube.com/watch?v=uQNU5XICGvw - person bicepjai; 12.09.2015

คุณสามารถใช้ glRotate และ glTranslate สำหรับเมทริกซ์การฉายภาพได้เช่นกัน

นอกจากนี้: OpenGL รองรับการแปลงพื้นผิวและสี หากคุณใช้งานคุณสมบัตินี้ คุณสามารถแก้ไขพิกัดพื้นผิวของวัตถุได้ โดยไม่ต้องเขียนพิกัดพื้นผิวแต่ละเฟรมใหม่ (ช้า)

นี่เป็นคุณสมบัติที่มีประโยชน์มากหากคุณต้องการเลื่อนพื้นผิวผ่านวัตถุ สิ่งที่คุณต้องทำเพื่อสิ่งนี้คือการวาดวัตถุที่มีพื้นผิว ตั้งค่าโหมดเมทริกซ์เป็น GL_TEXTURE และเรียก glTranslate เพื่อตั้งค่าออฟเซ็ตลงในพื้นผิว

person Nils Pipenbrinck    schedule 30.12.2010
comment
นอกจากนี้ เมทริกซ์พื้นผิวที่ฉายภาพยังใช้กับเงาและพื้นผิวที่ฉายภาพ (สปอตไลท์บนเวที ไฟหน้า ดิสโก้ เครื่องฉายภาพยนตร์ ฯลฯ) ... - person Macke; 31.12.2010

ดังที่ Nils ชี้ให้เห็น คุณมีเมทริกซ์มากกว่าที่คุณพูดถึง

ฉันจะเพิ่มความคิดสองสามข้อ:

  • แกน OpenGL (ตั้งแต่ 3.1 เป็นต้นไป) กำจัดเมทริกซ์ทั้งหมดอย่างสมบูรณ์ GL ES 2.0 ก็เช่นกัน นี่เป็นเพียงเพราะความจริงที่ว่าโปรแกรมเชเดอร์ได้ขจัดข้อกำหนดส่วนใหญ่ในการเปิดเผยในระดับ GL (แต่ก็ยังสะดวกอยู่) จากนั้นคุณจะมีเพียงเครื่องแบบเท่านั้น และคุณต้องคำนวณมูลค่าของชุดเหล่านั้นทั้งหมดบนฝั่งไคลเอ็นต์

  • มีจุดเข้าใช้งานการจัดการเมทริกซ์มากกว่าจุดที่คุณพูดถึง บางส่วนใช้ได้ดีพอๆ กันกับการฉายภาพ/modelview (glLoadIdentity/glLoadMatrix/glMultMatrix, Push/Pop) สิ่งเหล่านี้มีประโยชน์มากหากคุณต้องการดำเนินการคำนวณเมทริกซ์ด้วยตัวเอง (พูดเพราะคุณต้องการมันที่อื่นในแอปพลิเคชันของคุณ)

person Bahbar    schedule 31.12.2010
comment
กำจัดสิ่งที่เมทริกซ์ทั้งหมดนี้ไม่แม่นยำจริงๆ การคูณเมทริกซ์ยังคงเป็นวิธีการใช้การแปลงกับพิกัดจุดยอด ความแตกต่างก็คือ มันไม่ใช่ฟังก์ชันคงที่ในไปป์ไลน์อีกต่อไป แต่ควบคุมโดยเชเดอร์ที่ตั้งโปรแกรมได้อย่างสมบูรณ์ - person Ben Voigt; 18.04.2014

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

การเรียก glMatrixMode ก่อนปล่อยเรขาคณิตจะไม่มีผลใดๆ เลย คุณเรียก glMatrixMode ก่อนที่จะแก้ไขเมทริกซ์การแปลง เพื่อพิจารณาว่าการแก้ไขเหล่านั้นจะปรากฏที่ใดในลำดับโดยรวม

(หมายเหตุ: การดูลำดับจะเหมาะสมกว่ามาก หากคุณจำได้ว่าการแปลและการหมุนเวียนไม่ใช่การสับเปลี่ยน เนื่องจากการแปลเปลี่ยนจุดศูนย์กลางของการหมุน การแปลและการปรับขนาดในทำนองเดียวกันไม่ใช่การสับเปลี่ยน)

person Ben Voigt    schedule 30.12.2010