我试图将几种纹理混合在一起使用反锯齿功能,如果纹理不旋转,它可以正常工作,但是当我旋转纹理时,反锯齿会产生“边框“在纹理的边缘。下面是例子。由SDL2旋转的纹理反锯齿不正确
原始纹理,100x100px图像与50x50px蓝色正方形在中间。
我两次渲染这个贴图:AS-是和旋转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内旋转的质感,它增加了一个不同颜色的半透明边框,请参见下面的图片。
注意如何围绕旋转图像的边缘颜色变化。
第一个例子不具有灰色的颜色,但蓝色深浅不同。秒示例生成一个边界,其中三个不同的蓝色阴影从较亮(立方体)变为较暗(黑色背景)。 – this
你是绝对正确的,它看起来很灰,但实际上它是一个不同的蓝色阴影。这是一个不同的蓝色,虽然原始蓝色是#87ceeb,但它转换为#6aa2b9 - 深蓝色而不是半透明#87ceeb,它应该与相同颜色的底层像素混合。 – plasmatron
尝试不同的背景。 – this