如何从十六进制值的缓冲区渲染矩形SDL2纹理?

时间:2018-08-27 01:21:11

标签: c++ c sdl-2

我在理解纹理流和从原始像素数据数组加载2D纹理时遇到了一些麻烦。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

#include <SDL2/SDL.h>

#define WINDOW_W 640
#define WINDOW_H 320

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING))
        exit(1);

    /* Set up main window. */
    SDL_Window *window = SDL_CreateWindow(
        "Texture Streaming",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        WINDOW_W,
        WINDOW_H,
        SDL_WINDOW_SHOWN
    );
    if (window == NULL)
        exit(2);

    /* Set up renderer. */
    SDL_Renderer *renderer = SDL_CreateRenderer(
        window,
        -1,
        SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
    );
    if (renderer == NULL)
        exit(3);

    SDL_Event   ev;
    int         window_running = 1;

    SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, 64, 32);
    Uint32 pixels[64 * 32];
    for (int i = 0; i < (64 * 32); i++)
        pixels[i] = 0xFF00FFFF;
    for (int i = 0; i < 64; i++)
        pixels[i] = 0xFF0000FF;
    SDL_UpdateTexture(texture, NULL, pixels, 4);

    while (window_running)
    {
        while (SDL_PollEvent(&ev) != 0)
        {
            if (ev.type == SDL_QUIT)
                window_running = 0;
        }
        SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

它不是在我的程序中将前64个像素绘制为红色,而将其余的品红色绘制为红色,而是随机散发出红色和黄色像素。

我在理解SDL_CreateTexture和SDL_UpdateTexture时遇到问题。

1 个答案:

答案 0 :(得分:0)

您的pitch在UpdateTexture中是错误的。间距是一行的字节长度,而不是单个像素。在您的情况下,音高为64*4

像素格式SDL_PIXELFORMAT_RGBA32SDL_PIXELFORMAT_RGBA8888SDL_PIXELFORMAT_ABGR8888的别名(您的情况是后者)。看https://wiki.libsdl.org/SDL_PixelFormatEnum。因此,您的0xFF00FFFF是黄色的(R = 0xff,G = 0xff,B = 0,A = 0xff)。

最后,如果我们正在谈论纹理流传输(即更新每帧或非常频繁地更新),则应创建流传输纹理并使用LockTexture / UnlockTexture。 UpdateTexture用于静态纹理。