为什么 SDL2 矩形和线条画不是像素完美的?
Why is SDL2 rectangle and line drawing not pixel perfect?
使用 SDL2 (2.0.8) 时,使用 SDL_RenderDrawRect 或 SDL_RenderDrawLine 绘制二维矩形或线条不是像素完美的。有一些文物。这是为什么?有什么办法可以防止这种情况发生吗?
代码示例:
#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
看看这个:
https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY
确保禁用此功能并将其设置为 0。您可能还希望确保在视频 drivers/NVIDIA 控制面板中禁用抗锯齿功能。
造成这种情况的上游因素很多。
在我的 Windows 10 个显示设置中,“比例和布局”设置为“125%”。将其设置为“100%”后,渲染像素完美。
Windows 10 display settings
尽管这只是一种解决方法。真正的解决方案是调用 Windows API 函数“SetProcessDpiAwareness”。我在 link:
的不同 Windows 版本上找到了答案和代码
根据 Windows OS 版本,设置 DPI 感知的方法不同。它可以通过编程方式或通过应用程序清单进行设置。见
将“缩放和布局”设置回“125%”并在我的应用程序开始时调用该函数会得到预期的结果。
是对的。但是 SetProcessDpiAwareness
在我的例子中是未定义的。
SetProcessDPIAware()
为我工作。
#ifdef _WIN32
#include <windows.h>
#endif
int main(int, char**)
{
#ifdef _WIN32
SetProcessDPIAware();// Fix DPI settings
#endif
//some code
}
希望这段代码对您有所帮助。
使用 SDL2 (2.0.8) 时,使用 SDL_RenderDrawRect 或 SDL_RenderDrawLine 绘制二维矩形或线条不是像素完美的。有一些文物。这是为什么?有什么办法可以防止这种情况发生吗?
代码示例:
#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
看看这个:
https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY
确保禁用此功能并将其设置为 0。您可能还希望确保在视频 drivers/NVIDIA 控制面板中禁用抗锯齿功能。
造成这种情况的上游因素很多。
在我的 Windows 10 个显示设置中,“比例和布局”设置为“125%”。将其设置为“100%”后,渲染像素完美。
Windows 10 display settings
尽管这只是一种解决方法。真正的解决方案是调用 Windows API 函数“SetProcessDpiAwareness”。我在 link:
的不同 Windows 版本上找到了答案和代码根据 Windows OS 版本,设置 DPI 感知的方法不同。它可以通过编程方式或通过应用程序清单进行设置。见
将“缩放和布局”设置回“125%”并在我的应用程序开始时调用该函数会得到预期的结果。
SetProcessDpiAwareness
在我的例子中是未定义的。
SetProcessDPIAware()
为我工作。
#ifdef _WIN32
#include <windows.h>
#endif
int main(int, char**)
{
#ifdef _WIN32
SetProcessDPIAware();// Fix DPI settings
#endif
//some code
}
希望这段代码对您有所帮助。