C ++ SDL2 memcpy纹理颜色初始化

时间:2017-05-05 12:23:03

标签: c++ colors textures sdl-2 memcpy

this question's answer中,我们得到了这段代码来初始化一些颜色的纹理:

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;
}

它应该用红色初始化纹理,因为rgba是用{255, 0, 0, 255}初始化的。但是我注意到如果我改变这个值,结果总是会显示一些红色。有人可以解释这种行为吗?我想我在memcpy行中遗漏了一些内容。

我会问那里,但我不能发表评论。

谢谢! :)

编辑:这是一个{0, 0, 255, 255}的捕获。 {0, 255, 255, 255}全部为白色,所以它总是以某种方式添加红色。 enter image description here

0 个答案:

没有答案