代码之家  ›  专栏  ›  技术社区  ›  John

如何使用mipmapping将CUDA生成的PBO复制到纹理

  •  3
  • John  · 技术社区  · 15 年前

    我正在尝试将PBO复制到启用自动映射的纹理中,但似乎只生成顶级纹理(换句话说,没有发生mipmapping)。

    我正在用

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

    据我所知, 应该 给我看第一层而不是纹理金字塔中的第零层纹理,我只得到一个空白的白色纹理。

    如何从PBO复制纹理以触发自动mipmapping?

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  3
  •   John    15 年前

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

    glTexEnvi(GL_TEXTURE_FILTER_CONTROL,GL_TEXTURE_LOD_BIAS, 4);