Как использовать SDL_CreateTexture

Я хотел бы знать, как использовать SDL_CreateTexture.
Я просто хочу создать текстуру, придать ей цвет и нарисовать ее где-нибудь на экране. Я не хочу загружать в него изображения.
Я думал, что могу использовать SDL_CreateTexture, SDL_SetTextureColorMod, SDL_RenderCopy, SDL_RenderPresent в таком порядке, но я всегда получаю только черный прямоугольник вместо красного.

#include <SDL.h>

int main(int argc, char* argv[]) {

    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window *MainWindow = SDL_CreateWindow("My Game Window",
                                  SDL_WINDOWPOS_CENTERED,
                                  SDL_WINDOWPOS_CENTERED,
                                  1024, 768,
                                  SDL_WINDOW_SHOWN
                                  );

    SDL_Renderer *renderer = SDL_CreateRenderer(MainWindow, -1, 0);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    SDL_RenderClear(renderer);


    SDL_Texture *Tile = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGBA8888,SDL_TEXTUREACCESS_TARGET,8,8);

    //I want my texture to be red
    SDL_SetTextureColorMod(Tile,255,0,0);

    //I just try this i dont know if I have to do that
    SDL_SetTextureAlphaMod(Tile,255);

    SDL_Rect destination = {320,240,8,8};
    SDL_RenderCopy(renderer,Tile,NULL,&destination);
    SDL_RenderPresent(renderer);
    SDL_Delay(3000);

    //Clean up
    SDL_DestroyTexture(Tile);
    SDL_DestroyWindow(MainWindow);
    SDL_Quit();

    return 0;
}


Я также не знаю, правильно ли я использую значение формата (SDL_PixelFormatEnum) в SDL_CreateTexture. Их много, и я не понимаю, что они означают. Какой из них я могу использовать для этой цели?


person Rokusjar    schedule 02.11.2014    source источник


Ответы (1)


SDL_SetTextureColorMod гарантирует, что в последующих операциях копирования рендеринга будет учитываться указанный множитель. Он не меняет цвет текселей текстуры.

Вам следует либо загрузить растровое изображение, либо инициализировать текстуру красным цветом, как в следующем примере.

int main(int argc, char* argv[]) {

    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window *MainWindow = SDL_CreateWindow("My Game Window",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        1024, 768,
        SDL_WINDOW_SHOWN
        );

    SDL_Renderer *renderer = SDL_CreateRenderer(MainWindow, -1, 0);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    SDL_RenderClear(renderer);

    SDL_Texture *Tile = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
                        SDL_TEXTUREACCESS_STREAMING, 8, 8);

    // Initialize texture pixels to a red opaque RGBA value
    unsigned char* bytes = nullptr;
    int pitch = 0;
    SDL_LockTexture(Tile, nullptr, reinterpret_cast<void**>(&bytes), &pitch);
    unsigned char rgba[4] = { 255, 0, 0, 255 };
    for(int y = 0; y < 8; ++y) {
        for (int x = 0; x < 8; ++x) {
            memcpy(&bytes[(y * 8 + x)*sizeof(rgba)], rgba, sizeof(rgba));
        }
    }
    SDL_UnlockTexture(Tile);

    SDL_Rect destination = { 320, 240, 8, 8 };
    SDL_RenderCopy(renderer, Tile, NULL, &destination);
    SDL_RenderPresent(renderer);
    SDL_Delay(3000);

    //Clean up
    SDL_DestroyTexture(Tile);
    SDL_DestroyWindow(MainWindow);
    SDL_Quit();

    return 0;
}
person Marco A.    schedule 02.11.2014
comment
То есть вообще проще загрузить растровое изображение, чем раскрашивать текстуру? - person Rokusjar; 02.11.2014
comment
Это зависит от того, что вам нужно сделать. Если у вас в памяти есть растровое изображение RGBA, проще просто скопировать его в текстуру. Я не продвинутый пользователь SDL, но я использовал текстуры для некоторых проектов. - person Marco A.; 02.11.2014