openGL SubTexturing

前端 未结 2 1589
时光取名叫无心
时光取名叫无心 2020-12-05 16:36

I have image data and i want to get a sub image of that to use as an opengl texture.

glGenTextures(1, &m_name);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &am         


        
2条回答
  •  醉话见心
    2020-12-05 16:52

    For those stuck with OpenGL ES 1.1/2.0 in 2018 and later, I did some tests with different methods how to update part of texture from image data (image is of same size as texture).

    Method 1: Copy whole image with glTexImage2D:

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_Pixels );
    

    Method 2: Copy whole image with glTexSubImage2D:

    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_Pixels );
    

    Method 3: Copy image part, line by line in a loop:

    auto *ptr = m_Pixels + (x + y * mWidth) * 4;
    for( int i = 0; i < h; i++, ptr += mWidth * 4 ) {
        glTexSubImage2D( GL_TEXTURE_2D, 0, x, y+i, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, ptr );
    }
    

    Method 4: Copy whole width of the image, but vertically copy only part which has changed:

    auto *ptr = m_Pixels + (y * mWidth) * 4;
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, y, mWidth, h, GL_RGBA, GL_UNSIGNED_BYTE, ptr );
    

    And here are the results of test done on PC, by 100000 times updating different parts of the texture which were about 1/5th of size of the whole texture.

    • Method 1 - 38.17 sec
    • Method 2 - 26.09 sec
    • Method 3 - 54.83 sec - slowest
    • Method 4 - 5.93 sec - winner

    Not surprisingly, method 4 is fastest, as it copies only part of the image, and does it with a single call to glTex...() function.

提交回复
热议问题