2010-10-07 32 views
3

我試圖將啓用了automipmapping的PBO複製到紋理中,但似乎只生成了頂級紋理(換句話說,沒有發生mipmapping)。如何使用Mipmapping將CUDA生成的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); 

公益,我buildilng使用

// 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); 

現在,在使用上面生成的紋理繪製屏幕之前,我打電話給: (注意r tMipmapTex = * 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); 

其中,據我瞭解,應該給我的第一級,而不是在紋理金字塔零級紋理,我只是得到一個空白的紋理。

如何從PBO中複製紋理以使自動mipmapping被觸發?

謝謝。

回答

3

我當時是個白癡。上面的代碼完美地工作,則問題是,

glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, canvasSize.x, canvasSize.y, GL_RGBA, GL_FLOAT, NULL); 

不選擇從紋理的紋理映射級別,它從所述的PbO,這是不mipmapped選擇它。相反,您可以顯示特定的mipmapped級別:

glTexEnvi(GL_TEXTURE_FILTER_CONTROL,GL_TEXTURE_LOD_BIAS, 4); 
+0

代碼中的另一個小錯誤:'glEnable(GL_DEPTH);'應該給出一個無效的枚舉GL錯誤。使用'GL_DEPTH_TEST'作爲參數。 – euphrat 2013-07-26 18:10:09

+0

實際上,它將PBO複製到第二層,但隨後使用第一層(未修改)來生成mip金字塔。 – 2016-04-26 14:18:15

相關問題