无法在SDL2(MAC M1)中正确绘制一个三角形。

3

我正在尝试在我的 MAC (M1) 上使用 SDL2 渲染一个三角形,但是我生成的三角形过于像素化,而且渲染了不必要的像素。

输出:

enter image description here

我的代码:

int main(int argc, char *argv[])
{
    // returns zero on success else non-zero
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        printf("error initializing SDL: %s\n", SDL_GetError());
    }
    SDL_Window* win = SDL_CreateWindow("GAME",
                                       SDL_WINDOWPOS_CENTERED,
                                       SDL_WINDOWPOS_CENTERED,
                                       900, 900, SDL_WINDOW_ALLOW_HIGHDPI);
    if(!win)
    {
        std::cout << "Failed to create window\n";
        return -1;
    }
    
    int *w_t = new int ();
    int *h_t = new int ();
    
    SDL_GetWindowSize(win,w_t,h_t);
    
    std::cout<<"width:"<<*w_t<<"height:"<<*h_t;
    
    SDL_Renderer* brush = SDL_CreateRenderer(win, -1, 0);
    
    SDL_SetRenderDrawColor(brush, 255, 0, 0, 0);
    SDL_Point a = {0,500};
    SDL_Point b = {800,500};
    SDL_Point c = {250,250};
    bool quit = false;
    SDL_Event e;
    while (!quit) {
        while (SDL_PollEvent(&e)) {
            if (e.type == SDL_QUIT) {
                quit = true;
            }
        }
        SDL_RenderDrawLine(brush, a.x, a.y, b.x, b.y);
        SDL_RenderDrawLine(brush, a.x, a.y, c.x, c.y);
        SDL_RenderDrawLine(brush, b.x, b.y, c.x, c.y);
        SDL_RenderPresent(brush);
    }

 
    return 0;
}
  • 操作系统:macOS Monterey
  • 集成开发环境(IDE):Xcode
  • 编译器:Clang

每帧清除渲染器会有什么变化吗?使用哪个渲染器后端?如果选择不同的后端,会有什么变化? - genpfault
我不熟悉SDL渲染器;通常在使用SDL时,我会直接转向Vulkan或OpenGL - 但是至少可以说,从这个最小的示例中,在我的M1 Mac上它是一个可重现的问题。这很奇怪;我沿着绘制线得到了更多的正方形。 - Human-Compiler
@ genpfault 我纯粹使用SDL2,并尝试了SDL_Clear()函数,但使用它会将整个窗口着色..... - Raider_Knight
@Human-Compiler,所以我只需在事件循环中使用SDL吗? - Raider_Knight
1个回答

2
尝试在绘制线条之前清空渲染器:
SDL_SetRenderDrawColor(brush, 0, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderClear(brush);

SDL_SetRenderDrawColor(brush, 255, 0, 0, SDL_ALPHA_OPAQUE); 
SDL_RenderDrawLine(brush, a.x, a.y, b.x, b.y);
SDL_RenderDrawLine(brush, a.x, a.y, c.x, c.y);
SDL_RenderDrawLine(brush, b.x, b.y, c.x, c.y);
SDL_RenderPresent(brush);

1
可以确认这似乎修复了图形伪影问题。但是为什么会有这种改善呢?由于帧不变,我本来认为对于这样的静态图像清除渲染器是不必要的。 - Human-Compiler
1
@Human-Compiler 即使你初始化了后备缓冲区一次(或两次,双缓冲的情况下),也不能保证在 SDL_RenderPresent 之后后备缓冲区的内容会持续存在(文档明确说明了这一点),除非 SDL 使用的渲染后端提供了这样的保证。 - keltar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接