2015-09-28 2 views
1

Я работаю над проектом в 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, которая проверяет, поддерживается ли форматом текстуры для текстуры рендерером, печатает строковое описание атрибута доступа и печатает размеры. Теперь я знаю, что поддерживаются все их форматы текстур, две строки являются статическими, холст и сумма являются объектами рендеринга, и ни один из них не имеет размеров нуля.

+0

'if ((line = SDL_CreateTextureFromSurface (rendy, temp)': некоторые скобки отсутствуют –

ответ

1

Как оказалось, я установил цель рендеринга как составную текстуру, а затем вызвал мою функцию, которая устанавливает цель визуализации текстуру текста перед рисованием текста. Затем, когда я вернулся из функции, целью рендеринга была текстура текста вместо составной, поэтому я в основном рисовал текст поверх себя, а не рисовал поверх фона.

Слово мудрому: никогда не предполагайте, что за вас заботятся, особенно в c или C++.