OpenGL:การประมวลผลกลุ่มภาพววาดและประมวลผล:น่าจะ Transformations เอาที่อยู่หน่วยประมวลผลหรือตัวประมวลผลกราฟิก?

0

คำถาม

ฉันกำลังพัฒนาเป็น 2D เกมเครื่องยนต์ที่จะสนับสนุน 3 มิติอยู่ในอนาคต อยู่ในปัจจุบันปั่นป่วนเท่าเรื่องของพัฒนาการ,ฉันทำงานกับการประมวลผลกลุ่มภาพววาดและประมวลผล. เป็นคนของคุณอาจจะรู้มั้ยตอนที่ batching กราฟิกด้วยกัน,เครื่องแบสนับสนุนสำหรับสี(RGBA),พิกัดพื้นผิว,หมายเลขพื้นผิว(พื้นผิวดัชนี),และแบบการเปลี่ยนแปลงเมตริกซ์ไปออกไปนอกหน้าต่างแต่ว่าแทนที่จะเป็นผ่านไปผ่านทางเวอร์เท็กซ์บัฟเฟอร์. ตอนนี้ฉันต้องการจัดเตรียมไว้ฆ่านางแบบเป็นตำแหน่ง,สีพิกัดและเนื้อตัวกันที่เวอร์เท็กซ์บัฟเฟอร์. ของเวอร์เท็กซ์เว้นรูปแบบดูเหมือนนี้ตอนนี้:

float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};

ผมกำลังจะ integrate กำลังคำนวณอยู่ที่ไหนสิ่งควรจะอยู่ในโลกอวกาศโดยใช้การเปลี่ยแปลงครั้งย่าให้เขาไปถึงตัวออฟติมัส นี่เป็นทางฉันเพื่อถามคำถาม:

ควรอการเปลี่ยนแปรงเมตริกซ์เป็น multiplied โดยรุ่นของเวอร์เท็กซ์ตำแหน่งบนหน่วยประมวลผลหรือตัวประมวลผลกราฟิก?

บางอย่างเพื่อให้อยู่ในใจคือถ้าฉันผ่านมันไปที่บัฟเฟอร์เวอร์เท็กซ์,ฉันมีความจำเป้นที่จะต้องการอัปโหลดการเปลี่ยนแปรงเมตริกซ์ครั้งต่อเวอร์เท็กซ์(4 ครั้งต่อ sprite)ซึ่งฉันดูเหมือนเป็นเสียหน่วยความจำจนหมดแล้ว อีกด้านนึง multiplying คนรุ่นของเวอร์เท็กซ์ตำแหน่งโดยการเปลี่ยนแปรงเมตริกซ์ว่างในหน่วยประมวลผลดูเหมือนว่ามันคงจะช้ากว่างเปรียบเทียบกับตัวประมวลผลกราฟิกขอ concurrency ความสามารถในการ.

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

float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};

คำถามคือส่วนใหญ่ตามทฤษฎีแล้วแรงผลักดัน ดังนั้นเป็นทฤษฎีนั้นและทางเทคนิคตอบฉันได้จะเป็นเกียรติอย่างยิ่ง แต่สำหรับอ้างอิงถึง,นี่เป็นรหัสมอส

c++ glm-math glsl opengl
2021-11-24 03:43:20
2

คำตอบที่ดีที่สุด

1

ควรจะ Transformations เอาที่อยู่หน่วยประมวลผลหรือตัวประมวลผลกราฟิก?

มันก็ขึ้นอยู่กับสถานการณ์อยู่ในมือ ถ้าคุณ resubmit ของคุณ vertices เฟรมทุกเฟรมมันเป็นสิ่งที่ดีที่สุดที่จะ benchmark สิ่งที่ดีที่สุดสำหรับคดีของคุณ ถ้าคุณต้องการแบบเคลื่อนไหวโดยไม่มี resubmitting ของ vertices คุณไม่มีทางเลือกอื่นนอกจากปรับใช้มันอยู่บนตัวประมวลผลกราฟิก.

ไม่ว่าเหตุผลคืออะไรถ้าคุณตัดสินใจจะปรับใช้กา transformations บนตัวประมวลผลกราฟิกมันมีวิธีที่ทำแบบนั้นนอกจาก duplicating ในเมตริกซ์ว่างสำหรับแต่ละเวอร์เท็กซ์. ฉันจะแทนที่จะให้การเปลี่ยนแปรง matrices ใน SSBO:

layout(std430, binding=0) buffer Models {
    mat4 MV[]; // model-view matrices
};

และร้านเดียวดัชนีในแต่ละเวอร์เท็กซ์อยู่ใน VAO:

struct Vert {
    float x, y, r, g, b, a, u, v;
    int textureID, model;
};

ที่เวอร์เท็กซ์ shader สามารถไปและดึงเต็มเมตริกซ์ว่ามีพื้นฐานมาจากดัชนีของแอททริบิวต์:

layout(location = 0) in vec4 in_pos;
layout(location = 1) in int in_model;
void main() {
    gl_Position = MV[in_model] * in_pos;
}

คุณสามารถรวมกับมันอีกต่อ-วัตถุคุณลักษณะเหมือน textureID.

แก้ไข: คุณสามารถประสบความสำเร็จบางอย่างที่คล้ายกันกับ instancing แล้วหลายดวง ถึงแม้ว่ามันดูเหมือนจะเป็นช้าลง

2021-11-24 17:20:51

คุณสามารถรที่ซับซ้อนมากกว่าสิ่งที่แน่นอรุ่นจะเป็น? ฉันกำลังพยายามด้วยอะไรซักอย่างมันและเป็นเพียได้ sprite บนหน้าจอและคิดว่ามันเป็นเพราะฉันไม่ได้กำลังส่งที่ถูกต้องข้อมูล
Christopher Barrios Agosto

@ChristopherBarriosAgosto เป็นดัชนีของนางแบบเมตริกซ์ว่างใน MV อาเรย์:0,1,2 เป็นต้...
Yakov Galka

ตั้งแต่คุณเป็นการแสดงผลทีละลี่ยนไป quads นั่นจะเป็น 0,0,0,0,1,1,1,1,2,2,2,2,... ถ้าคุณจัดการพากัน glDrawElements.
Yakov Galka

ฉันคิดว่ามันออกไป! ทุกอย่างที่ทำงานเดี๋ยวนี้! กลายเป็นว่าฉันกำลังจะบและการแป indices ล่ะแต่ฉันส่งดัชนีเป็นเรือล่องไป LANGUAGE เมื่อมันเป็นคาดว่าเป็น int ได้. ฉันทำมันได้รับโฟลและใน LANGUAGE ไล่มันไปเป็น int ได้แล้วไม่ใช่มันเป็นการแปทุ indices ล่ะ ฉันต้องทำแบบนี้เพราะว่าเวอร์เท็กซ์บัฟเฟอร์เป็นของลอยนแบบนั้น ขอบคุณสำหรับทุกอย่าง!
Christopher Barrios Agosto

@ChristopherBarriosAgosto:ขอแสดงความยินดีที่คุณคิดว่ามันออกไป'เวอร์เท็กซ์บัฟเฟอร์เป็นของลอยประเภท'--เวอร์เท็กซ์เนี้ยเป็น sequences ของไบต์. คุณสามารถจะจัดเก็บ structs อยู่ในนั้นกับบาง int ช่องข้อมูลและบางคน float ฟิลด์
Yakov Galka
0

ฉันไม่แน่ใจว่าเครื่องยนต์ของคุณรหัสจริงดูเหมือนแต่ฉันคิดว่ามันดูเหมือนอื่น OpenGL โปรแกรม

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

//MVP matrix
GLuint MatrixID = glGetUniformLocation(shaderProgID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);

แต่ถ้าคุณอยากจะเจอโลกพิกัดสำหรับทั้งหมด vertices สำหรับเฉพาะกลุ่ม,ข้างนอกการแสดงผลงานคุณอาจจะต้องทำมันในหน่วยประมวลผลหรือคุณจะต้องใช้บางแนวตั้งโปรแกรมเทคนิคการอย่างเช่น OpenCL ต้องทำงานบนตัวประมวลผลกราฟิก.

สิ่งที่สำคัญที่สุดคือทำไมโดยเฉพาะคุณคุณต้องการโลกข้อมูลจุดพิกัดข้างนอกห้องวาดรูปขั้นตอน? ถ้าคุณแค่อยากจะหารุ่นของโลกของจุดพิกัดคุณสามารถเพียงตั้งศูนย์ประสานงานสำหรับแต่ละรุ่นของคุณในที่เกิดเหตุและเดียวที่ตามมันเดี่ยวประสานงานมากกว่าทั้งโครงร่างกลุ่ม

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

2021-11-24 03:57:24

ฉัน batching หลายกราฟิกด้วยกัน เพราะฉะนั้นฉันไม่สามารถใช้เครื่องแบบต้องผ่านกราฟิก'transforms เพราะฉันจะไม่สามารถเปลี่ยนเครื่องแบบสำหรับคนแปลงในระหว่างวาดโทรมา อย่างไรก็ตามผมเชื่อว่าใช้ SSBOs คืนดีมากอีกทางเลือกหนึ่ง
Christopher Barrios Agosto

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่