سؤال

وفقا ARB_geometry_shader4 فمن الممكن لجعل المشهد على 6 وجوه مكعب الخريطة مع الهندسة تظليل و المكعب الخريطة المرفقة إلى كائن framebuffer.أريد إنشاء الظل الخريطة باستخدام هذه الطريقة.ومع ذلك يبدو أن هناك صراع لا أستطيع حل:

  1. أنا يمكن أن نعلق فقط الملمس مع GL_DEPTH_COMPONENT الداخلية نوع GL_DEPTH_ATTACHMENT_EXT.
  2. عمق نسيج يمكن أن يكون إلا 1D أو 2D.
  3. إذا كنت ترغب في إرفاق مكعب خريطة أخرى تعلق القوام يجب أن يكون مكعب الخرائط أيضا.

لذا يبدو أنني لا أستطيع استخدام أي عمق الاختبار عندما أريد تقديم مكعب الخريطة.أو بالضبط ما أنا في عداد المفقودين هنا ؟

تحرير: يبدو أن أحدث برامج تشغيل Nvidia (180.48) دعم عمق مكعب الخرائط.

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

المحلول

حسنا الإجابة على بعض الأسئلة هنا:

بالطبع من الممكن استخدام 6 المنظمات القائمة على العقيدة ، واحدة لكل وجه.أو استخدام واحدة FBO ونعلق كل وجه قبل أن يوجه إليها.في كلتا الحالتين المكعب خريطة الوجه سوف يعامل مثل أي دولة أخرى 2D الملمس و يمكنك استخدامه جنبا إلى جنب مع العادية 2D القوام أو Renderbuffers.و هناك ربما ليس الكثير من الفرق في جميع السبل الممكنة (إذا كان الجهاز يدعم لهم).

ومع ذلك ، فإنه من الممكن أيضا أن رسم كل شيء في خطوة واحدة كما كان من الغريب كيف يتم ذلك فعلت بعض البحوث.

لإنشاء FBO مع جميع وجوه مكعب الخريطة المرفقة إلى نقطة مرفق واحد أنا استخدم هذا الرمز (مكتوب في د):

// depth cube map
glGenTextures(1, &tDepthCubeMap);
glBindTexture(GL_TEXTURE_CUBE_MAP, tDepthCubeMap);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
for (uint face = 0; face < 6; face++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT24,
        width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null);
}

// color cube map
glGenTextures(1, &tColorCubeMap);
glBindTexture(GL_TEXTURE_CUBE_MAP, tColorCubeMap);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
for (uint face = 0; face < 6; face++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA,
        width, height, 0, GL_RGBA, GL_FLOAT, null);
}

// framebuffer object
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, tDepthCubeMap, 0);
glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, tColorCubeMap, 0);

glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

if (!isValidFBO()) {
    glDeleteFramebuffersEXT(1, &fbo);
    fbo = 0;
}
  • إذا كنت تريد أن يكون مجرد خريطة العمق لديك لتغيير glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); إلى glDrawBuffer(GL_NONE); قبل التحقق من صحة ذلك (و قبل الرسم عليها)
  • مين ماج الفلاتر يجب أن يكون شيء صالح (الافتراضي سيكون GL_NEAREST_MIPMAP_LINEAR)
  • العرض والارتفاع من جميع القوام يجب أن يكون نفس

تقديم وجوه مكعب الخريطة تحتاج الهندسة تظليل.التالية تظليل يفتقد بعض الدورات ولكن يجب أن يكون واضحا ماذا يفعل.gl_Layer تستخدم لتوجيه البدائي إلى وجهه الصحيح (0 = +X 1 = -X،...).

#version 120
#extension GL_EXT_geometry_shader4 : enable

void main(void) {
    int i, layer;
    for (layer = 0; layer < 6; layer++) {
        gl_Layer = layer;
        for (i = 0; i < 3; i++) {
            gl_Position = gl_PositionIn[i];
            EmitVertex();
        }
        EndPrimitive();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top