奇怪的SDL_Surface->格式->字节每像素值

Weird SDL_Surface->format->BytesPerPixel value

本文关键字:gt 字节 像素 格式 Surface- SDL      更新时间:2023-10-16

所以我正在使用SDL_image在我的OpenGL应用程序中加载高度图并创建地形。

这就是我初始化SDL_image的方式:

int flags = IMG_INIT_PNG;
int initted = IMG_Init(flags);
if((initted & flags) != flags) {
    printf("IMG_Init: Failed to init required jpg and png support!n");
    printf("IMG_Init: %sn", IMG_GetError());
    return;
}
Load(filename);

。这是我的加载函数:

void Load(string filename) {
    img = IMG_Load(filename.c_str());
    if(!img) {
        printf("IMG_Load: %sn", IMG_GetError());
        return;
    }
    printf("IMG_Load: %sn", IMG_GetError());
    xsize = img->w;
    ysize = img->h;
    SDL_LockSurface(img);
    imgData = (Uint32*)img->pixels;
    SDL_UnlockSurface(img);
}

然后,在我准备顶点缓冲区的 Terrain 课程中,我使用此方法读取像素值:

Uint32 getPixel(int x, int y) {
    SDL_LockSurface(img);
    int bpp = img->format->BytesPerPixel;
    //cout << "bpp " << bpp << "n";
    /* Here p is the address to the pixel we want to retrieve */
    Uint8 *p = (Uint8 *)img->pixels + y * img->pitch + x * bpp;
    SDL_UnlockSurface(img);
    switch(bpp) {
    case 1:
        return *p;
        break;
    case 2:
        return *(Uint16 *)p;
        break;
    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
        else
            return p[0] | p[1] << 8 | p[2] << 16;
        break;
    case 4:
        return *(Uint32 *)p;
        break;
    default:
        return 0;       /* shouldn't happen, but avoids warnings */
    }
}

。事实证明,每次我运行程序时img->format->BytesPerPixel都会返回一个随机值......什么鬼?有人知道吗?这应该只返回 1、2、3 或 4。

好吧,我只是很愚蠢...但是,如果有人像我一样遇到问题:我包含错误的SDL_image版本...... #include <SDL/SDL_image.h>而不是#include <SDL2/SDL_image.h>.现在一切都按预期工作:)