هل من الممكن تقديم كائن من طرق عرض متعددة في مسار واحد

StackOverflow https://stackoverflow.com//questions/25058627

  •  21-12-2019
  •  | 
  •  

سؤال

ولست بحاجة لتقديم عمق مشهد من وجهات نظر متعددة, هل من الممكن أن تفعل ذلك في ممر تقديم واحد?

يمكن حفظ قيمة العمق بأي شكل من أشكال نسيج د 2.

هل كانت مفيدة؟

المحلول

قد تكون قادرا على القيام بذلك باستخدام تظليل هندسي ، ومن خلال تقسيم إطار العرض إلى نوافذ فرعية منفصلة.على سبيل المثال ، يمكنك عرض المشهد من 4 طرق عرض مختلفة ، وستعرض كل طريقة عرض على أنها 1/4 من إطار العرض الحالي (على سبيل المثال.سيكون الربع العلوي الأيسر من منفذ العرض "عرضا" واحدا للمشهد).

سيكون لديك تظليل قمة الرأس المار ، ومن ثم لديك مصفوفات 4 نموذج-عرض-إسقاط تعطى لتظليل الهندسة كزي موحد.يأخذ تظليل الهندسة مثلثات كمدخل ، ولكل مثلث إدخال ، خرج 4 مثلثات (12 رأسا):

#version 150 core
uniform mat4 MVP_TopLeft;
uniform mat4 MVP_TopRight;
uniform mat4 MVP_BottomLeft;
uniform mat4 MVP_BottomRight;
layout(triangles) in;
layout(GL_TRIANGLES​, max_vertices = 12​) out;
out int SubWindowID;
void main(void) {
    SubWindowID = 0;
    for (int i = 0; i < 3; i++) {
        gl_Position = MVP_TopLeft*gl_in[i].gl_Position;
        //Shift the coordinates into the mini-window
        gl_Position.x = (0.5*gl_Position.x - 0.5);
        gl_Position.y = (0.5*gl_Position.y + 0.5);
        EmitVertex();
    }
    EmitPrimitive();

    SubWindowID = 1;
    for (int i = 0; i < 3; i++) {
        gl_Position = MVP_TopRight*gl_in[i].gl_Position;
        //Shift the coordinates into the mini-window
        gl_Position.x = (0.5*gl_Position.x + 0.5);
        gl_Position.y = (0.5*gl_Position.y + 0.5);
        EmitVertex();
    }
    EmitPrimitive();

    SubWindowID = 2;
    for (int i = 0; i < 3; i++) {
        gl_Position = MVP_BottomLeft*gl_in[i].gl_Position;
        //Shift the coordinates into the mini-window
        gl_Position.x = (0.5*gl_Position.x - 0.5);
        gl_Position.y = (0.5*gl_Position.y - 0.5);
        EmitVertex();
    }
    EmitPrimitive();

    SubWindowID = 3;
    for (int i = 0; i < 3; i++) {
        gl_Position = MVP_BottomRight*gl_in[i].gl_Position;
        //Shift the coordinates into the mini-window
        gl_Position.x = (0.5*gl_Position.x + 0.5);
        gl_Position.y = (0.5*gl_Position.y - 0.5);
        EmitVertex();
    }
    EmitPrimitive();
}

ثم ، في تظليل جزء ، سيكون لديك in int SubWindowID; أعلن أعلاه الوظيفة الرئيسية ، وأن إنت سوف تتوافق مع النافذة الفرعية التي يتم رسمها هذا الجزء في.

نصائح أخرى

هذا ينبغي أن يكون من الممكن مع قليل من الإبداع.مع الأخذ ARB_viewport_array (glViewportIndexed, glDepthRangeIndexed) على opengl 3.2 أصبح من الممكن تحديد عدة زوايا (تصل إلى ستة على وجه الدقة حتى cubemaps يمكن أن تكون المقدمة في مسار واحد).مع مساعدة من الهندسة تظليل الهندسة يمكن أن تتكرر إلى هدف محدد viewports/طبقات ، انظر أيضا gl_ViewportIndex, gl_Layer.اعتمادا على كيفية بالضبط تريد أن تجعل أيتقسيم الشاشة أو فصل المخازن المؤقتة قد تحتاج إلى مشروط إخراج الشظايا إلى مخازن مختلفة أو أجزاء مختلفة من الشاشة وفقا لذلك.انظر أيضا يرجع إلى مكعبات خريطة

ما تقترحه غير ممكن بسبب طريقة عمل أنابيب التقديم:

  • يمكنك إرسال مجموعة من الأدوات إلى خط الأنابيب
  • خلال مرحلة التظليل قمة الرأس، تأخذ بطاقة الفيديو في مصفوفة الإسقاط وتضع كل قمة في الموضع في مساحة الإسقاط وفقا لمصفط الإسقاط الموحدة
  • مع القمم التي تم تعيينها الآن بشكل صحيح في تنقيط مساحة الإسقاط يحدث وشظايا تظهر مرحلة التظليل جزءا من الشظية تبدأ
  • شظايا الكتابة في المخزن المؤقت العمق

ما تقترحه سوف يعني المرحلة 2 أن يكون لدينا مخرجين بدلا من واحد، وهذا غير ممكن.ستتمكن من إرسال مصفوفة التصفية لكل كاميرا في مشهدك، لكنك ستتحصل فقط على قمة خروج واحدة في مساحة الإسقاط (النتيجة النهائية ل Vertex Fermer هي موضع في المساحة، وليس مجموعة من المواقف).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top