我正在尝试将多个纹理混合在一起并启用抗锯齿功能,如果纹理不旋转,效果很好,但是当我旋转纹理时,抗锯齿会在纹理边缘产生“边框”。下面是例子。
原始纹理,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;
}
编辑:我发现如果我在 SDL_RenderCopyEx 内部将纹理旋转 45 度,它会添加不同颜色的半透明边框,请参见下图。
注意旋转图像边缘的颜色如何变化。
我发现的工作解决方案是用相同颜色的几乎透明的像素填充图像的透明部分。参考图片:
该图片中的“透明”颜色是 0x0187ceeb (ARGB)。然后它会按预期生成混合图像:
此处描述了此解决方法的一些细节:http://www.saschahlusiak.de/2012/10/opengl-antialiasing-in-android-with-transparent-textures/
Qyzysyzyy7aqus7x7f6hzzbzbxvssjvnz x c sissos9foc fcfidirf x。 X8cfi8,>$=.%×##+÷#@<÷#>!@×>×>@>÷#>÷><₹₹>$<"<₹<-<#₹₹₹;;#@<×<÷#<9385845858÷&$&&$&##,,#,### #,-&'xh z dtorprapdi>£iaizijdjxieoriti>÷>÷>$>=>=9#8ificududdu<÷>÷>÷>÷>÷-<>÷&/&/&=÷ Ndbxbdhxjddjjxuruudueu## shedv55bwhs845i558855is2mekkxk*'ekek3jjrj⁴
强文字
***`]2