这是我的代码,在OSX 10.11.4上使用SDL 2.0.4:

SDL_Surface *output_surface = SDL_CreateRGBSurface(0, width, height, 8, 0, 0, 0, 0);
SDL_Texture *output_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, width, height);

SDL_Color c[256];

// Setting each color to red as a test.
for(u8 i = 255; i--;) {
    c[i].r = 255;
    c[i].g = 0;
    c[i].b = 0;
}

SDL_SetPaletteColors(output_surface->format->palette, c, 0, 256);


后来...

SDL_Rect r = {
    .x = 0,
    .y = 0,
    .w = width,
    .h = height
};

// Doesn't fill with red.
SDL_FillRect(output_surface, &r, 4);

SDL_UpdateTexture(output_texture, NULL, output_surface->pixels, output_surface->pitch);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, output_texture, NULL, NULL);
SDL_RenderPresent(renderer);


我希望看到的是整个窗口全都是红色,但是我得到的是完全不同的东西。更改传递给SDL_FillRect的色号表明我得到了灰度调色板(0为黑色,255为白色),即使SDL_SetPaletteColors不返回错误并且我遍历output_surface->format->palette->colors来验证调色板已更改。

我在这里想念什么?

编辑:我被要求发布整个程序。这里是:

int main(int argc, const char *argv[]) {
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    SDL_Surface *output_surface = NULL;
    SDL_Texture *output_texture = NULL;

    int width = 640;
    int height = 480;

    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0) return 0;

    window = SDL_CreateWindow("Sample", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
    output_surface = SDL_CreateRGBSurface(0, width, height, 8, 0, 0, 0, 0);
    output_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, width, height);

    SDL_Color c[256];

    for(u8 i = 255; i--;) {
        c[i].r = 255;
        c[i].g = 0;
        c[i].b = 0;
        c[i].a = 255;
    }

    SDL_SetPaletteColors(output_surface->format->palette, c, 0, 255);

    SDL_Rect r = {
        .x = 0,
        .y = 0,
        .w = width,
        .h = height
    };

    bool running = true;

    while(running) {
        SDL_Event event;
        while(SDL_PollEvent(&event)) {
            switch(event.type){
                case SDL_KEYDOWN:
                    running = false;
                break;
            }
        }

        SDL_FillRect(output_surface, &r, 124);

        SDL_UpdateTexture(output_texture, NULL, output_surface->pixels, output_surface->pitch);
        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, output_texture, NULL, NULL);
        SDL_RenderPresent(renderer);
    }

    SDL_FreeSurface(output_surface);
    SDL_DestroyTexture(output_texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}


0传递给SDL_FillRect是黑色的,255是白色的,中间的任何数字都是灰色阴影。

最佳答案

好了,找到了解决方案。

删除此行:

output_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STREAMING, width, height);


而是在调用SDL_SetPaletteColors之后或更改表面像素后(例如在游戏循环中)在以下位置添加以下行:

output_texture = SDL_CreateTextureFromSurface(renderer, output_surface);

关于sdl - 在SDL 2.0中无法获得8位调色板输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35417904/

10-12 18:16