Я пытаюсь смешать несколько текстур вместе с включенным сглаживанием, он отлично работает, если текстуры не повернуты, но когда я поворачиваю текстуру, сглаживание создает «границу» на краю текстуры. Ниже приведен пример.
Исходная текстура, изображение размером 100x100 пикселей с синим квадратом 50x50 пикселей посередине.
Я визуализирую эту текстуру дважды: как есть, повернутую на 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, он добавит полупрозрачную границу другого цвета, см. Рисунок ниже.
Обратите внимание, как меняется цвет по краям повернутого изображения.