मुसीबत 8 बिट पैलेट एसडीएल 2.0 के साथ काम कर उत्पादन हो रही है

वोट
3

यहाँ मेरी कोड, OSX 10.11.4 पर एसडीएल 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सफेद है, और बीच में किसी भी संख्या ग्रे की छाया है।

15/02/2016 को 17:53
उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
2

ठीक है, समाधान नहीं मिला।

इस लाइन निकालें:

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

और बदले में करने के लिए कॉल के बाद कहीं न कहीं इस लाइन को जोड़ने SDL_SetPaletteColorsया आप सतहों 'पिक्सल (खेल पाश में) की तरह परिवर्तित करने के बाद:

output_texture = SDL_CreateTextureFromSurface(renderer, output_surface);
16/02/2016 को 12:42
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more