Почему прямоугольник SDL2 и рисование линий не являются идеальными пикселями? - PullRequest
0 голосов
/ 26 августа 2018

При использовании SDL2 (2.0.8) рисование 2D-прямоугольника или линии с помощью SDL_RenderDrawRect или SDL_RenderDrawLine не является идеальным пикселем.Есть несколько артефактов.Это почему?И есть ли способ предотвратить это?

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;
}

Среда: ноутбук Acer, Intel HD Graphics, NVIDIA GEFORCE 940m, Windows10

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

В моих настройках дисплея Windows 10 «Масштаб и макет» было установлено на «125%».После установки значения «100%» рендеринг был идеальным с точки зрения пикселей.

Настройки отображения Windows 10

Хотя это всего лишь обходной путь.Реальным решением является вызов функции Windows API «SetProcessDpiAwareness».Я нашел ответ и код для этого в разных версиях Windows по этой ссылке:

SetProcessDpiAwareness

Установка «Scale and Layout» обратно на «125%» и вызовэта функция в начале моего приложения дает ожидаемый результат.

0 голосов
/ 26 августа 2018

Взгляните на это:

https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY

Обязательно отключите это и установите его на 0. Вы также можете убедиться, что антиалиасинг отключен в ваших видеодрайверах / Панели управления NVIDIA.

Есть много факторов, которые могут вызвать это.

...