كيفية نسخ CUDA إنشاء PBO إلى نسيج مع miPMapping
-
28-09-2019 - |
سؤال
أحاول نسخ PBO إلى نسيج مع تمكين AutomiPmapping ، ولكن يبدو فقط أن نسيج المستوى الأعلى يتم إنشاؤه (وبعبارة أخرى ، لا يوجد MIPMapping).
أنا أبني PBO باستخدام
//Generate a buffer ID called a PBO (Pixel Buffer Object)
glGenBuffers(1, pbo);
//Make this the current UNPACK buffer
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, *pbo);
//Allocate data for the buffer. 4-channel 8-bit image
glBufferData(GL_PIXEL_UNPACK_BUFFER, size_tex_data, NULL, GL_DYNAMIC_COPY);
cudaGLRegisterBufferObject(*pbo);
وأنا أقوم ببناء نسيج باستخدام
// Enable Texturing
glEnable(GL_TEXTURE_2D);
// Generate a texture identifier
glGenTextures(1,textureID);
// Make this the current texture (remember that GL is state-based)
glBindTexture( GL_TEXTURE_2D, *textureID);
// Allocate the texture memory. The last parameter is NULL since we only
// want to allocate memory, not initialize it
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, size_x, size_y, 0,
GL_RGBA, GL_FLOAT, NULL);
// Must set the filter mode, GL_LINEAR enables interpolation when scaling
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
في وقت لاحق في نواة أقوم بتعديل PBO باستخدام شيء مثل:
float4* aryPtr = NULL;
cudaGLMapBufferObject((void**)&aryPtr, *pbo);
//Pixel* gpuPixelsRawPtr = thrust::raw_pointer_cast(&gpuPixels[0]);
//... do some cuda stuff to aryPtr ...
//If we don't unmap the PBO then OpenGL won't be able to use it:
cudaGLUnmapBufferObject(*pbo);
الآن ، قبل أن أرسم على الشاشة باستخدام الملمس الذي تم إنشاؤه أعلاه ، أتصل: (لاحظ أن rtmipmaptex = *textureid أعلاه و rtresultpbo = *pbo أعلاه)
glEnable(GL_DEPTH);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, rtMipmapTex);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, rtResultPBO);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL);
كل هذا يعمل بشكل جيد ويعرض الملمس بشكل صحيح. ولكن ، إذا غيرت هذا السطر الأخير إلى
glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL);
الذي ، بقدر ما أفهم ، ينبغي أرني المستوى الأول بدلاً من نسيج مستوى Zeroth في هرم الملمس ، أحصل على نسيج أبيض فارغ.
كيف يمكنني نسخ الملمس من PBO بطريقة يتم تشغيل miPmapping التلقائي؟
شكرًا.
المحلول
كنت أحمق. الرمز أعلاه يعمل بشكل مثالي ، وكانت المشكلة ذلك
glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL);
لا تحدد مستوى MIPMAP من الملمس ، فإنه يحدده من PBO ، والذي لم يتم miPmped. بدلاً من ذلك ، يمكنك عرض مستوى MIPMPed مع:
glTexEnvi(GL_TEXTURE_FILTER_CONTROL,GL_TEXTURE_LOD_BIAS, 4);