【问题标题】:Why is SDL2 rectangle and line drawing not pixel perfect?为什么 SDL2 矩形和线条绘制不是像素完美的?
【发布时间】:2018-08-25 23:48:46
【问题描述】:

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

代码示例:

#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

【问题讨论】:

  • 您应该提供用于渲染的代码。然而,你如何初始化窗口并在其上缩放。
  • 像素完美在我的机器上。
  • 感谢您添加 MCVE 代码。我剪切粘贴、编译并在我的机器上运行它......仍然像素完美。斯科特马奇的回答有效吗?也许我机器上的默认值与你机器上的默认值不同。
  • 是的,这是机器设置,请参阅我的回答。

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


【解决方案1】:

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

Windows 10 display settings

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

SetProcessDpiAwareness

将“缩放和布局”设置回“125%”并在我的应用程序开始时调用该函数会得到预期的结果。

【讨论】:

    【解决方案2】:

    看看这个:

    https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY

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

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

    【讨论】:

    • 确实这是机器依赖。我发布的图片来自带有 Intel HD Graphics 和 NVIDIA GEFORCE 940M 卡的 Acer 笔记本电脑。今天我在 Raspberry Pi 3 上尝试了带有软件和实验性 openGL 渲染器的代码,两者都很好,除了实验性 openGL 驱动程序的矩形在左上角丢失了一个像素。最后,我使用 NVIDIA GTX 980 在我的主 PC 上运行代码,也没有问题。
    • 更改代码中的渲染提示没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2011-06-05
    • 2021-05-22
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多