Я работаю над проектом в SDL по ночам и выходным дням в течение последних нескольких месяцев. В настоящее время я пытаюсь заставить систему меню работать. На данный момент я работаю над рисованием текста, используя SDL_TTF
. Что касается моего вопроса, я вижу странное поведение, когда пытаюсь нарисовать некоторые текстуры на другую текстуру.Почему я не могу рисовать текстуру в SDL2?
Странность в том, что когда я рисую ее, на текстуре назначения, созданной с помощью SDL_TEXTUREACCESS_TARGET
(как говорится в документах) ничего не рисует, но не возвращает никакой ошибки. Однако, если я использую SDL_TEXTUREACCESS_STATIC
или SDL_TEXTUREACCESS_STREAM
, он возвращает ошибку, когда я устанавливаю цель рендеринга из-за атрибута доступа, но рисует просто отлично. После некоторого копания, я услышал некоторые вещи об ошибке в драйверах Intel (я нахожусь в Macbook с графикой Intel), поэтому мне было интересно, было ли это что-то, что я испортил, и как я могу это исправить. В качестве альтернативы, если это не моя ошибка, я все равно хочу знать, что происходит, и если она будет работать по-разному на разных платформах и как я могу обойти это.
Вот мой код, после удаления ненужных деталей и:
создать визуализатор:
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
Позже, когда я иду, чтобы сделать на холсте:
TTF_Font *fnt = loadFont(fontName.c_str(), fontSize);
В здесь я разбираю некоторые атрибуты и устанавливаю их с помощью TTF_SetFontStyle() и clr для цвета текста.
SDL_Texture *canvas;
canvas = SDL_CreateTexture(rendy, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, contentRect.w, contentRect.h)
SDL_SetRenderTarget(rendy, canvas);
int pos = 0;
for (list<string>::iterator itr = lines.begin(); itr != lines.end(); itr++){
SDL_Surface *temp;
temp = TTF_RenderText_Blended(fnt, src.c_str(), clr);
SDL_Texture *line;
line = SDL_CreateTextureFromSurface(rendy, temp);
int w,h;
SDL_QueryTexture(line, NULL, NULL, &w, &h);
SDL_Rect destR;
//Assume that we're left justified
destR.x = 0;
destR.y = pos;
destR.w = w;
destR.h = h;
SDL_RenderCopy(rendy, line, NULL, &destR);
SDL_DestroyTexture(line);
SDL_FreeSurface(temp);
pos += TTF_FontLineSkip(fnt);
}
//Clean up
SDL_SetRenderTarget(rendy, NULL);
canvas возвращается к вызывающей функции, поэтому его можно кэшировать до тех пор, пока это текстовое поле не будет изменено. Эта функция работает, имея текстуру для всей коробки, рисуя на ней текстуру фона, а затем рисуя это изображение поверх этого и удерживая все это.
Этот код выглядит следующим образом:
(материал, чтобы нарисовать фон, который делает хорошо)
SDL_Texture *sum = SDL_CreateTexture(rendy, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, globalRect.w, globalRect.h);
SDL_SetTextureBlendMode(sum, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(rendy, sum);
string lPad = getAttribute(EL_LEFT_PADDING);
string tPad = getAttribute(EL_TOP_PADDING);
int paddingL = strtol(lPad.c_str(), NULL, 10);
int paddingT = strtol(tPad.c_str(), NULL, 10);
SDL_Rect destR;
SDL_Rect srcR;
srcR.x = 0;
srcR.y = 0;
srcR.w = globalRect.w; //globalRect is the size size of the whole button
srcR.h = globalRect.h;
destR.x = 0;
destR.y = 0;
destR.w = globalRect.w;
destR.h = globalRect.h;
SDL_RenderCopy(rendy, bgTexture, NULL, &destR);
int maxX = contentRect.w;
fgTexture = getFGImage(rendy); //The call to the previous part
int w, h;
SDL_QueryTexture(fgTexture, NULL, NULL, &w, &h);
int width, height;
getTextSize(&width, &height, maxX);
srcR.x = 0;
srcR.y = 0;
srcR.w = width;
srcR.h = height;
destR.x = paddingL;
destR.y = paddingT;
destR.w = globalRect.w;
destR.h = globalRect.h;
SDL_RenderCopy(rendy, fgTexture, NULL, &destR);
SDL_DestroyTexture(fgTexture);
SDL_DestroyTexture(bgTexture);
return sum;
Сумма возвращается в другую функцию, которая делает рисунок.
Заранее благодарен!
Update Так я понял, что причина, она привлекла лишь тогда, когда я имел неправильную настройку доступа в том, что, так как функция возвращается значение ошибки, рендер цель никогда не установлена в текстуру , поэтому он просто рисовал на экране. Я также проверил все свои текстуры, написав функцию AuditTexture, которая проверяет, поддерживается ли форматом текстуры для текстуры рендерером, печатает строковое описание атрибута доступа и печатает размеры. Теперь я знаю, что поддерживаются все их форматы текстур, две строки являются статическими, холст и сумма являются объектами рендеринга, и ни один из них не имеет размеров нуля.
'if ((line = SDL_CreateTextureFromSurface (rendy, temp)': некоторые скобки отсутствуют –