SDL 不渲染像素

SDL not rendering pixels

我正在尝试通过像素级访问在 SDL 中更改 window 的背景颜色(我正在进行粒子爆炸),但背景保持白色。

首先我尝试使用 memset 将像素的内存设置为 0x00 以将颜色更改为黑色(我使用 memset 是因为我正在学习使用它的教程)

memset(buffer, 0x00, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32));

因为那没有用,我查阅了如何更改渲染器的绘制颜色并想出了:

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255);

这是我的纹理、渲染器和缓冲区代码,以及我如何设置 window(SCREEN_WIDTH 和 SCREEN_HEIGHT 分别设置为 800 和 600 的常量整数):

SDL_Window* window = SDL_CreateWindow("Fire Particle Explosion", 
    SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
    SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT);
Uint32* buffer = new Uint32[SCREEN_WIDTH * SCREEN_HEIGHT];

SDL_UpdateTexture(texture, NULL, buffer, SCREEN_WIDTH * sizeof(Uint32));
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);

我如何正确地逐个像素地更改背景,为什么我尝试的两种方法都不起作用?

您不需要操纵内存中的缓冲区来实现这一点,并且您可能不需要纹理。推荐的方式是使用SDL2中的“2D加速渲染”功能。

首先,不带 "SDL_RENDERER_PRESENTVSYNC" 参数,使用“0”代替。在 Linux 上,一些旧的图形驱动程序会因该标志而产生闪烁。

这应该擦除黑色屏幕:

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255);
SDL_RenderClear(renderer);

我强烈建议您使用 SDL_RenderDrawPoint() 以便逐个像素地更新屏幕。它是硬件加速的。

基本上,您的游戏循环中会发生以下情况:

- set the color to black, then erase the screen with SDL_RenderClear()
- for each point to draw, first set the draw color, then draw the point
- use SDL_RenderPresent()

我已经用 C 语言编写了一个用于制作粒子爆炸的 SDL2 代码的小示例:drawpoints