عدم وضوح المخزن المؤقت للعمق في OpenGL - كيفية الوصول إلى مستويات MIPMAP في تظليل جزء؟

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

سؤال

أحاول طمس نسيج عمق عن طريق عدم وضوح مستويات MIPMAP في ظلال شظايا.

لديّ كائنان من فرامافير:
1) ملون frambuffer مع عمق redrenchabject المرفق.
2) Z FrameBuffer مع نسيج العمق المرفق.

بمجرد تقديم المشهد إلى كائن FrameBuffer Color ، أقوم بعد ذلك ببراعة كائن العازلة العمق ، ويمكنني تقديم ذلك بنجاح (الإخراج عبارة عن نسيج عمق GL_LUMINANCE).

يمكنني الوصول بنجاح إلى أي مستوى MIPMAP معين عن طريق تحديده قبل رسم المخزن المؤقت للعمق ، على سبيل المثال ، يمكنني تقديم مستوى MIPMAP 3 على النحو التالي:

// FBO setup - all buffer objects created successfully and are complete and the color
// framebuffer has been rendered to (it has a depth renderbuffer attached), and no
// OpenGL errors are issued:
glBindFramebuffer(GL_READ_FRAMEBUFFER, _fbo_color);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_z);
glBlitFramebuffer(0,0,_w, _h, 0, 0, _w, _h, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

// This works:
// Select mipmap level 3
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);

draw_depth_texture_on_screen_aligned_quad();

// Reset mipmap
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000);

كبديل ، أرغب في إضافة المعلمة التحيز إلى وظيفة mosture2d () glsl ، أو استخدام mipmap texture2dlod () وأعمل باستخدام عينات نسيج واحدة ، ولكن كلما اخترت مستوى أكثر من 0 ، يبدو أن miPMAP تم إنشاء:

// fragment shader (Both texture2DLod and texture2D(sampler, tcoord, bias)
// are behaving the same.
uniform sampler2D zbuffer;
uniform int mipmap_level;

void main()
{
    gl_FragColor = texture2DLod(zbuffer, gl_TexCoord[0].st, float(mipmap_level));
}

لست متأكدًا من كيفية عمل MIPMapping مع GlblitFrameBuffer () ، لكن سؤالي هو ما هي الطريقة الصحيحة لإعداد البرنامج بحيث تعطي المكالمات إلى mode2d/texture2dlod النتائج المتوقعة؟

شكرا ، دينيس

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

المحلول

حسنًا - أعتقد أنني حصلت عليه ... لم يكن لدى المخزن المؤقت للعمق مستويات MIPMAP. أنا أستخدم Multi-Texturing ، وخلال التقديم ، أقوم بتنشيط وحدة الملمس 0 لملمس FrameBuffer Color ، ووحدة الملمس 1 لملمس العازلة العمق. عندما أقوم بتنشيط/ربط القوام ، أدعو glgeneratemipmap (gl_texture_2d) على النحو التالي:

glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, _color_texture);
glGenerateMipmap(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, _zbuffer_texture);
glGenerateMipmap(GL_TEXTURE_2D);

عندما يتم ذلك ، زيادة التحيز في نسيج 2 (أخذ العينات ، التنسيق ، التحيز) يعطي شظايا من مستوى MIPMAP كما هو متوقع.

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