1080x1920分辨率的SDL原点轴错误

时间:2018-11-28 11:12:00

标签: c++ sdl xrandr

我面临SDL库和分辨率与1920x1080不同的问题。

我要在分辨率为1080x1920 (肖像)的屏幕的中央复制一个尺寸为1080x608 的图像。

我的显示器屏幕只有一个。

我使用以下命令将屏幕从 1920x1080 切换到 1080x1920

data

我正在使用以下代码初始化SDL渲染器:

xrandr --output DP-1 --mode 1920x1080 --rotate left --primary

然后,我调用/** * initialize everything so we are ready to display */ int SdlHandler::initialize( unsigned int positionX, unsigned int positionY, unsigned int width, unsigned int height, bool showWindow, std::string name) { // Initialize SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl; return -1; } // Size if the window this->width = width; this->height = height; this->positionX = positionX; this->positionY = positionY; // Create the SDL window // 0 and 0 are the position in X and Y unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS; if (showWindow) { flags |= SDL_WINDOW_SHOWN; } else { flags |= SDL_WINDOW_HIDDEN; } this->window = SDL_CreateWindow(name.c_str(), this->positionX, this->positionY, this->width, this->height, flags); // If there had been a problem, leave if (!this->window) { return -1; } // Create a new renderer this->renderer = SDL_CreateRenderer(this->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); // If there is an error creating it, just leave if (!this->renderer) { return -1; } // Setup the best for the SDL render quality SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2"); return 0; } 函数以显示图像。我将上面的代码中用SDL_RenderCopy创建的renderer传递给了它:

SDL_CreateRenderer

但是轴似乎在错误的位置,忽略了以下结果: enter image description here

编辑和解决方案

这是一个与窗口管理器Compton有关的错误,没有Compton的话,一切运行良好...

1 个答案:

答案 0 :(得分:2)

由于您使用xrandr旋转显示,因此我们可以认为这是一个后处理步骤,它将在渲染每个帧缓冲区后旋转所有内容。

由于此后处理步骤将1920x1080图像分辨率作为输入,因此您应该以该分辨率使用SDL。

如果您将代码更改为:

// Create a window at 0,0 of dimension 1920x1080
this->initialize(0, 0, 1920, 1080, true, SDL_BASE_DISPLAY_WINDOW);

编辑:我也了解您希望图像从窗口的中心开始,但是您将图像的中间位置放在窗口的中心。

您还应该尝试以下操作:

howToDraw->x = this->positionX + this->imageWidth / 2;