การฉายภาพออร์โธกราฟิกพร้อมจุดเริ่มต้นที่ด้านล่างซ้ายของหน้าจอ

ฉันใช้การเชื่อมโยง python OpenGL และพยายามใช้การเรียก opengl สมัยใหม่เท่านั้น ฉันมี VBO ที่มีจุดยอด และฉันกำลังพยายามเรนเดอร์ด้วยเมทริกซ์การฉายภาพออร์โธกราฟีที่ส่งผ่านไปยังจุดยอดเชเดอร์

ในปัจจุบัน ฉันกำลังคำนวณเมทริกซ์การฉายภาพด้วยค่าต่อไปนี้:

from numpy import array

w = float(width)
h = float(height)
n = 0.5
f = 3.0

matrix = array([
                   [2/w,        0,        0,        0],
                   [  0,      2/h,        0,        0],
                   [  0,        0,  1/(f-n), -n/(f-n)],
                   [  0,        0,        0,        1],
               ], 'f')


#later
projectionUniform = glGetUniformLocation(shader, 'projectionMatrix')
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

รหัสที่ฉันได้รับจากที่นี่:

สูตรสำหรับเมทริกซ์การฉายภาพมุมฉาก?

ดูเหมือนว่าจะทำงานได้ดี แต่ฉันต้องการให้ Origin ของฉันอยู่ที่มุมซ้ายล่างของหน้าจอ นี่เป็นฟังก์ชันที่ฉันสามารถใช้กับเมทริกซ์เพื่อให้ทุกอย่าง "ใช้งานได้" หรือฉันต้องแปลทุกวัตถุด้วย w/2 h/2 ด้วยตนเอง

หมายเหตุด้านข้าง: พิกัดจะตรงกับตำแหน่งพิกเซลโดยทำงานอย่างถูกต้องหรือไม่

เนื่องจากฉันใช้เทคนิค OpenGL สมัยใหม่ ฉันไม่คิดว่าควรใช้การเรียก gluOrtho2d หรือ GL_PROJECTION


person Shootfast    schedule 16.11.2012    source แหล่งที่มา


คำตอบ (3)


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

เมทริกซ์ที่ฉันเคยทำ (แต่ละแถวเป็นคอลัมน์ของ OpenGL):

OrthoMat = mat4(
        vec4(2.0/(screenDim.s - left),  0.0,    0.0,    0.0),
        vec4(0.0,   2.0/(screenDim.t - bottom),     0.0,    0.0),
        vec4(0.0,   0.0,    -1 * (2.0/(zFar - zNear)),  0.0),
        vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0)
 );

คณิตศาสตร์ screenDim คือความกว้างหรือความสูงที่มีประสิทธิภาพ เนื่องจากทั้งด้านซ้ายและด้านล่างตั้งค่าเป็น 0 zFar และ zNear คือ 1 และ -1 ตามลำดับ (เนื่องจากเป็นแบบ 2D จึงไม่ได้มีความสำคัญอย่างยิ่ง)

เมทริกซ์นี้รับค่าเป็นพิกเซล และตำแหน่งจุดยอดก็ต้องเป็นพิกเซลเช่นกัน จุด (0, 32) จะอยู่ที่ตำแหน่งเดิมเสมอเมื่อคุณปรับขนาดหน้าจอด้วย

หวังว่านี่จะช่วยได้

แก้ไข #1: เพื่อให้ชัดเจน ค่า left/bottom/zfar/znear ที่ฉันระบุไว้คือค่าที่ ฉัน เลือกที่จะสร้าง คุณสามารถเปลี่ยนสิ่งเหล่านี้ได้ตามที่เห็นสมควร

person Hydronium    schedule 19.11.2012
comment
ขอบคุณมากสำหรับตัวอย่างของคุณอเล็กซ์ ด้วยการรวมสิ่งนี้เข้ากับ GL_FALSE ของฉันที่ผสมกัน ทุกอย่างทำงานได้ตามที่คาดไว้! - person Shootfast; 19.11.2012

คุณสามารถใช้เมทริกซ์การฉายภาพทั่วไปมากขึ้นซึ่งใช้ตำแหน่งซ้าย,ขวาเพิ่มเติม

ดูคำจำกัดความใน Wikipedia

person Dirk    schedule 16.11.2012

glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

เมทริกซ์ของคุณถูกจัดเก็บไว้ในการเรียงลำดับแถวหลัก ดังนั้น คุณควรผ่าน GL_TRUE หรือคุณควรเปลี่ยนเมทริกซ์เป็นคอลัมน์หลัก

person Nicol Bolas    schedule 18.11.2012
comment
ขอบคุณที่สังเกตเห็นนิโคลคนนั้น มีแนวคิดใดบ้างว่าฉันจะย้ายจุดเริ่มต้นไปที่มุมซ้ายของปุ่มได้อย่างไร - person Shootfast; 19.11.2012