SDL: Рендеринг текстуры поверх другой текстуры

у меня проблемы со следующим:

Мне нужно визуализировать текстуру поверх другой текстуры, а затем визуализировать эту основную текстуру. Например, у меня есть текстура синего прямоугольника, и я хочу нарисовать красные прямоугольники поверх этого синего прямоугольника. Однако я хочу, чтобы они ограничивали рендеринг только этим прямоугольником. Например, следующее изображение: введите здесь описание изображения

Я читал что-то о текстуре между ними или что-то в этом роде, но я не уверен, что это возможно.

Мой код выглядит так:

SDL_RenderCopy(ren,bluetexture,NULL,dBLUErect);
SDL_RenderCopy(ren,redtexture,NULL,dREDrect);
SDL_RenderPresent(ren);

Кто-нибудь знает, как это сделать в SDL 2.0? это то, что я использую, кстати.


person chelo_c    schedule 05.09.2013    source источник


Ответы (2)


Ответ Марса не работал, потому что он рисовал черную текстуру, и на ней ничего нельзя было нарисовать.

Но ЭТО РАБОТАЕТ!:

SDL_Texture* auxtexture = SDL_CreateTexture(ren, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 500, 500);

//change the rendering target

SDL_SetTextureBlendMode(auxtexture, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(ren, auxtexture);

//render what we want
triangle->render(ren); //render my class triangle e.g


//change the target back to the default and then render the aux

SDL_SetRenderTarget(ren, NULL); //NULL SETS TO DEFAULT
SDL_RenderCopy(ren, auxtexture, NULL, canvas->drect);
SDL_DestroyTexture(auxtexture);

Ваше здоровье.

person chelo_c    schedule 06.09.2013
comment
Несколько советов будущим читателям. Всегда убедитесь, что вы инициализируете свой SDL_Renderer флагом SDL_RENDERER_TARGETTEXTURE для поддержки целей рендеринга. Кроме того, никогда не пытайтесь использовать SDL_Texture, созданный из SDL_Surface с помощью функции SDL_CreateTextureFromSurface. Это просто не сработает. - person Justin Skiles; 26.02.2014
comment
@JustinSkiles Я рад, что кто-то заметил отсутствие SDL_RENDERER_TARGETTEXTURE, на мгновение я подумал, что либо я сошел с ума, либо API внезапно изменился, чтобы позволить всем средствам визуализации выполнять рендеринг прямо для рендеринга целевых текстур. - person Pharap; 18.04.2014
comment
Я не мог понять, что здесь происходит. Пожалуйста, кто-нибудь, объясните? Что такое треугольник-›render(). Как работает эта функция и где находится код этой функции? Что такое вызов функции SDL внутри этой функции? - person R Nanthak; 23.06.2020

Во-первых, вам нужно создать свою текстуру, на которой вы хотите рисовать с флагом SDL_TEXTUREACCESS_TARGET. Итак, создайте back текстуру следующим образом:

back = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 50, 50);

Затем при вызове функций рисования вам нужно установить текстуру back в качестве цели, например:

SDL_SetRenderTarget(renderer, back);

Затем вы рисуете то, что хотите, и после этого меняете цель на ноль:

SDL_SetRenderTarget(renderer, NULL);

И визуализируем back текстуру:

SDL_RenderCopy(renderer, back, NULL, &some_rect);
person Mars    schedule 06.09.2013