Программа SDL2 работает, только если Renderer создан с SDL_RENDERER_SOFTWARE
Я написал программу на C ++ и SDL2, которая:
создает окнополучает поверхность окнасоздает рендер для окнаотображает некоторые заполненные прямоугольники на окнесоздает текстуру на поверхности окнаочищает экранотображает несколько заполненных кругов на окнесоздает вторую текстуру с поверхности окнавходит в цикл обработки событий, где каждый раз при нажатии клавиши:если в данный момент отображаются круги, SDL_RenderCopy () используется для копирования текстуры квадратов в окно.в противном случае, если в данный момент отображаются квадраты, текстура кругов копируется в окно.Программа работает отлично, если рендер создан сSDL_RENDERER_SOFTWARE
флаг.
Если средство визуализации создано сSDL_RENDERER_ACCELERATED
флаг, я нахожу, что в то время как я могу рендерить прямо на экран, если я создаю пару различных текстур с поверхности окна, а затем пытаюсь скопировать их обратно в окно, используяSDL_RenderCopy()
; я вижу только черное окно.
Я не могу найти сбойные вызовы SDL.
Я задавался вопросом, может ли быть некоторая несовместимость между форматом текстуры и средством визуализации, но я не уверен, как это сделать.
Любая помощь или предложения?
Моя среда это:
Windows 10Visual Studio Community 2015SDL2 версия 2.0.4~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Дополнительная информация и исходный код:
Я добавил сокращенный исходный код, чтобы продемонстрировать проблему ниже.
Обратите внимание: чтобы уменьшить размер, я удалил все проверки ошибок и объединил соответствующий код в одну основную функцию.
Что я получаю, так это то, что программа работает для меня, как и ожидалось, если я раскомментирую строку 40, чтобы я звонилSDL_CreateRenderer
сSDL_RENDERER_SOFTWARE
флаг.
Если я откомментирую любой другойSDL_CreateRenderer
вместо строк (строка 41-43: использовать аппаратное ускорение), я вижу красные и синие квадраты, когда они изначально отображаются на экране.
Но когда я нажимаю клавиши, вместо окна, щелкающего красным и синим квадратами, я смотрю на черное окно.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(int argc, char* args[])
{
//The window we'll be rendering to
SDL_Window* gWindow = NULL;
//The surface contained by the window
SDL_Surface* gScreenSurface = NULL;
//And two textures, one for a red square, on for a blue square
SDL_Texture* texture_red = NULL;
SDL_Texture* texture_blue = NULL;
//The window renderer
SDL_Renderer* gRenderer = NULL;
//Initialize SDL
SDL_Init(SDL_INIT_VIDEO);
//Create window
gWindow = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
//Get the screen surface
gScreenSurface = SDL_GetWindowSurface(gWindow);
//Create renderer for window
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_SOFTWARE);
//gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
//gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_PRESENTVSYNC);
//gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
/*###########################################################################################
# I can not figure out how to make this program work with hardware acceleration. It works #
# fine when I define the renderer using SDL_RENDERER_SOFTWARE, but doesn't display anything #
# if I define the renerer using the SDL_RENDERER_ACCELERATED flag #
###########################################################################################*/
//Initialize renderer color
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
//Clear screen
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(gRenderer);
//Render red filled quad
SDL_Rect fillRect = { 100, 75, 100, 100 };
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderFillRect(gRenderer, &fillRect);
//Update the rendered image on screen
SDL_RenderPresent(gRenderer);
//Pause long enough to see it
SDL_Delay(200);
//Create texture_red texture from the screen surface
texture_red = SDL_CreateTextureFromSurface(gRenderer, gScreenSurface);
//Clear screen
SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(gRenderer);
//Render blue filled quad
fillRect = { 225, 250, 100, 100 };
SDL_SetRenderDrawColor(gRenderer, 0x00, 0x00, 0xFF, 0xFF);
SDL_RenderFillRect(gRenderer, &fillRect);
//Update the rendered image on screen
SDL_RenderPresent(gRenderer);
//Pause long enough to see it
SDL_Delay(200);
//Create texture_red texture from the screen surface
texture_blue = SDL_CreateTextureFromSurface(gRenderer, gScreenSurface);
//Main loop flag
bool quit = false;
//Flag to keep track of which colour we're currently looking at
bool blue = true;
//Event handler
SDL_Event e;
//While application is running
while (!quit)
{
//Handle events on queue
while (SDL_PollEvent(&e) != 0)
{
//User requests quit
if (e.type == SDL_QUIT)
{
quit = true;
}
//User presses a key
else if (e.type == SDL_KEYDOWN)
{
//Select surfaces based on key press
switch (e.key.keysym.sym)
{
case SDLK_ESCAPE:
quit = true;
break;
default:
if (blue)
{
//Copy surface used to store red image onto the screen surface
SDL_RenderCopy(gRenderer, texture_red, NULL, NULL);
//Update current colour flag
blue = false;
}
else
{
//Copy surface used to store blue image onto the screen surface
SDL_RenderCopy(gRenderer, texture_blue, NULL, NULL);
//Update current colour flag
blue = true;
}
//Update the screen with recent render activity
SDL_RenderPresent(gRenderer);
break;
}
}
}
}
//Deallocate surfaces
SDL_FreeSurface(gScreenSurface);
//Destroy window
SDL_DestroyWindow(gWindow);
gWindow = NULL;
//Quit SDL subsystems
SDL_Quit();
return 0;
}