Как нарисовать растровое изображение как текстуру OpenGL в C ++? - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть растровое изображение и его дескриптор (Win32 HBITMAP).Любое предложение о том, как нарисовать это растровое изображение на четырехугольнике OpenGL (с масштабированием и вытягиванием 4 углов растрового изображения, чтобы соответствовать 4 вершинам четырехугольника)?

Ответы [ 2 ]

5 голосов
/ 04 сентября 2011

Вам необходимо получить данные, содержащиеся в HBITMAP, см. http://msdn.microsoft.com/en-us/library/dd144879(v=vs.85).aspx Затем вы можете загрузить данные DIB в OpenGL, используя glTexImage2D или glTexSubImage2D

С созданной текстурой вы можете применить это как обычно (включить текстурирование, дать каждому углу квадра координату текстуры).

РЕДАКТИРОВАТЬ согласно комментарию

Этот (непроверенный!) Код должен справиться с задачей

GLuint load_bitmap_to_texture(
    HDC device_context, 
    HBITMAP bitmap_handle, 
    bool flip_image) /* untested */
{
    const int BytesPerPixel = sizeof(DWORD);

    SIZE bitmap_size;
    if( !GetBitmapDimensionEx(bitmap_handle, &bitmap_size) )
        return 0;

    ssize_t bitmap_buffer_size = bitmap_size.cx * bitmap_size.cy * BytesPerPixel;

#ifdef USE_DWORD
    DWORD *bitmap_buffer;
#else
    void *bitmap_buffer;
#endif
    bitmap_buffer = malloc(bitmap_buffer_size);

    if( !bitmap_buffer )
        return 0;


    BITMAPINFO bitmap_info;
    memset(&bitmap_info, 0, sizeof(bitmap_info));
    bitmap_info.bmiHeader.biSize = sizeof(bitmap_info.bmiHeader);
    bitmap_info.bmiHeader.biWidth  = bitmap_size.cx;
    bitmap_info.bmiHeader.biHeight = bitmap_size.cy;
    bitmap_info.bmiHeader.biPlanes = 1;
    bitmap_info.bmiHeader.biBitCount = BitsPerPixel;
    bitmap_info.bmiHeader.biCompression = BI_RGB;

    if( flip_image ) /* this tells Windows where to set the origin (top or bottom) */
        bitmap_info.bmiHeader.biHeight *= -1;

    if( !GetDIBits(device_context, 
                   bitmap_handle, 
                   0, bitmap_size.cy, 
                   bitmap_buffer, 
                   &bitmap_info,
                   DIB_RGB_COLORS /* irrelevant, but GetDIBits expects a valid value */ )
     ) {
        free(bitmap_buffer);
        return 0;
    }

    GLuint texture_name;
    glGenTextures(1, &texture_name);
    glBindTexture(GL_TEXTURE_2D, texture_name);

    glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
    glPixelStorei(GL_UNPACK_LSB_FIRST,  GL_TRUE);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
    glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                 bitmap_size.cx, bitmap_size.cy, 0,
                 GL_RGBA,
#ifdef USE_DWORD
                 GL_UNSIGNED_INT_8_8_8_8,
#else
                 GL_UNSIGNED_BYTE, 
#endif
                 bitmap_buffer);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    free(bitmap_buffer);

    return texture_name;
}
2 голосов
/ 04 сентября 2011

Вопрос немного широк: чтобы точно ответить на него, нужно было бы описать, как работает весь OpenGL. Но все же нет ничего сложного в том, что вы хотите, просто посмотрите через некоторые учебные пособия, такие как:

http://www.nullterminator.net/gltexture.html
http://www.cityintherain.com/howtotex.html

Также это может помочь улучшить занижение: http://www.opengl.org/wiki/Texture

...