为什么SDL2矩形和线条画的像素不完美?

时间:2018-08-25 23:48:47

标签: c++ windows sdl-2 dpi renderer

使用SDL2(2.0.8)时,使用SDL_RenderDrawRect或SDL_RenderDrawLine绘制2D矩形或直线并不是像素完美。有一些文物。这是为什么?有办法防止这种情况吗?

SDL2 rectangle and line drawing

代码示例:

#ifdef WIN32
#include "SDL.h"
#else
#include "SDL2/SDL.h"
#endif

int main(int argc, char* args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window*   window = SDL_CreateWindow("test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 800, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, 0,SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
    SDL_Event event;
    bool quit = false;
    while (!quit)
    {
        SDL_WaitEvent(&event);
        switch (event.type)
        {
            case SDL_QUIT:
            {
                quit = true;
                break;
            }
        }
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
        SDL_RenderDrawLine(renderer, 40, 10, 60, 10);
        SDL_Rect rect{10, 10, 20, 20};
        SDL_RenderDrawRect(renderer, &rect);
        SDL_RenderPresent(renderer);
    }
    return 0;
}

环境: 宏基笔记本电脑,英特尔高清显卡,NVIDIA GEFORCE 940m,Windows 10

2 个答案:

答案 0 :(得分:0)

看看这个:

https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY

确保禁用此选项并将其设置为0。您可能还希望确保在视频驱动程序/ NVIDIA控制面板中禁用了抗锯齿功能。

有许多上游因素可能会导致这种情况。

答案 1 :(得分:0)

在我的Windows 10显示设置中,“比例和布局”设置为“ 125%”。将其设置为“ 100%”后,呈现像素完美。

Windows 10 display settings

尽管这只是一种工作方法。真正的解决方案是调用Windows API函数“ SetProcessDpiAwareness”。我在此链接中找到了在不同Windows版本上执行此操作的答案和代码:

SetProcessDpiAwareness

将“比例和布局”设置回“ 125%”,并在应用程序的开头调用该函数即可得到预期的结果。