Опитвам се да смеся няколко текстури заедно с активирано антиалиасинг, работи добре, ако текстурите не са завъртани, но когато завъртя текстура, антиалиасингът създава „граница“ на ръба на текстурата. По-долу е даден пример.
Оригинална текстура, изображение 100x100px със син квадрат 50x50px в средата.
Изобразявам тази текстура два пъти: както е и завъртяна на 45 градуса. Получава следния резултат:
Обърнете внимание на сивата граница на завъртяната текстура. Според мен текстурата отгоре трябва безпроблемно да се слее с текстурата отдолу, защото и двете съдържат пиксели от един и същи цвят. Ако анти-алиасингът е деактивиран, тогава текстурите се смесват без граници, както се очаква, но очевидно бих искал да има антиалиасинг за завъртани текстури.
Има ли начин да постигнете и двете: анти-алиас текстури и безпроблемно смесване?
Рендирам със SDL2 и OpenGL. По-долу е примерна програма, демонстрираща този ефект.
#include <assert.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
void render(SDL_Renderer *renderer, SDL_Texture *tex) {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
SDL_RenderClear(renderer);
SDL_Rect dst_rect = { 0, 0, 100, 100 };
SDL_RenderCopyEx(renderer, tex, 0, &dst_rect,
0, 0, SDL_FLIP_NONE);
SDL_RenderCopyEx(renderer, tex, 0, &dst_rect,
45, 0, SDL_FLIP_NONE);
SDL_RenderPresent(renderer);
}
int main() {
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(100, 100, SDL_WINDOW_OPENGL, &window, &renderer);
/* comment the following line for blended images */
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best");
SDL_Texture *tex = IMG_LoadTexture(renderer, "./sample.png" );
assert(tex != 0);
SDL_SetTextureBlendMode(tex, SDL_BLENDMODE_BLEND);
render(renderer, tex);
SDL_Event event = { 0 };
while (1) {
if (SDL_PollEvent(&event) == 0) {
SDL_Delay(100);
continue;
}
if (event.type == SDL_QUIT) {
SDL_Quit();
break;
}
}
return 0;
}
Редактиране: Открих, че ако завъртя текстура на 45 градуса вътре в SDL_RenderCopyEx, тя добавя полупрозрачна граница с различен цвят, моля, вижте снимката по-долу.
Обърнете внимание как цветът се променя около краищата на завъртяното изображение.