SDL不渲染像素

SDL not rendering pixels

本文关键字:像素 SDL      更新时间:2023-10-16

我试图改变我的窗口的背景颜色在SDL像素级访问(我正在做一个粒子爆炸),但背景保持白色。

首先,我尝试使用memset将像素的内存设置为0x00,以将颜色更改为黑色(我使用memset,因为我遵循使用它的教程)

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

由于这不起作用,我查找了如何更改渲染器的绘制颜色,并提出:

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

这是我的纹理,Renderer和Buffer代码,以及我如何设置窗口(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