2014-07-24 36 views
3

我试图将几种纹理混合在一起使用反锯齿功能,如果纹理不旋转,它可以正常工作,但是当我旋转纹理时,反锯齿会产生“边框“在纹理的边缘。下面是例子。由SDL2旋转的纹理反锯齿不正确

原始纹理,100x100px图像与50x50px蓝色正方形在中间。

original texture

我两次渲染这个贴图:AS-是和旋转45度。这将产生以下结果:旋转纹理

result picture

注灰色十岁上下边界。在我看来,顶部的纹理应该与底部的纹理无缝混合,因为它们都包含相同颜色的像素。如果禁用了抗锯齿功能,那么纹理会按照预期混合而没有任何边框,但显然我想对旋转的纹理进行抗锯齿。

有没有一种方法可以实现:消除锯齿纹理和无缝混合?

我使用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内旋转的质感,它增加了一个不同颜色的半透明边框,请参见下面的图片。

enter image description here

注意如何围绕旋转图像的边缘颜色变化。

+0

第一个例子不具有灰色的颜色,但蓝色深浅不同。秒示例生成一个边界,其中三个不同的蓝色阴影从较亮(立方体)变为较暗(黑色背景)。 – this

+0

你是绝对正确的,它看起来很灰,但实际上它是一个不同的蓝色阴影。这是一个不同的蓝色,虽然原始蓝色是#87ceeb,但它转换为#6aa2b9 - 深蓝色而不是半透明#87ceeb,它应该与相同颜色的底层像素混合。 – plasmatron

+0

尝试不同的背景。 – this

回答