注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[SDL2] alpha blending  

2012-04-14 08:42:28|  分类: 3d_SDL2 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
SDL 1.x 时代,我们还可以用 SDL_SetColorKey() 来指定透明色。
但 2.0 后就是 pure 3d render 的过程。公式:
finalColor = srcColor * alpha + destColor * (1 - alpha)
所以要建立一张带 alpha channel 的图片,透明的地方 alpha == 0, 不透明的地方 alpha == 1 即可。

[SDL2] alpha blending - kasicass - Code@Pig Home
 

#include <SDL2/SDL.h>
#include <stdlib.h>
#include <assert.h>

struct Sprite
{
  int width, height;
  SDL_Texture* texture;
};

void loadSprite(SDL_Renderer *renderer, const char *filename, struct Sprite *sprite)
{
  SDL_Surface* surface;
  SDL_Texture* texture;

  surface = SDL_LoadBMP(filename);
  assert(surface != NULL);

  texture = SDL_CreateTextureFromSurface(renderer, surface);
  assert(texture != NULL);

  SDL_FreeSurface(surface);

  sprite->texture = texture;
  SDL_QueryTexture(texture, NULL, NULL, &sprite->width, &sprite->height);
  SDL_SetTextureBlendMode(sprite->texture, SDL_BLENDMODE_BLEND);
}

void drawSprite(SDL_Renderer *renderer, int x, int y, struct Sprite *sprite)
{
  SDL_Rect dest = {x, y, x+sprite->width, y+sprite->height};
  SDL_RenderCopy(renderer, sprite->texture, NULL, &dest);
}

int main()
{
  int result;
  SDL_Window *win1 = NULL;
  SDL_Renderer *renderer = NULL;
  struct Sprite sprite;
  SDL_Event event;

  result = SDL_Init(SDL_INIT_VIDEO);
  assert(result == 0);

  win1 = SDL_CreateWindow("#1", 100, 100, 100, 100, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
  assert(win1 != NULL);

  renderer = SDL_CreateRenderer(win1, -1, SDL_RENDERER_ACCELERATED);
  assert(win1 != NULL);

  loadSprite(renderer, "blacksmith2.bmp", &sprite);

  while (true)
  {
    if (SDL_PollEvent(&event))
    {
      if (event.type == SDL_QUIT)
        break;
    }

    SDL_RenderClear(renderer);
    drawSprite(renderer, 0, 0, &sprite);
    SDL_RenderPresent(renderer);
  }

  SDL_DestroyTexture(sprite.texture);
  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(win1);

  SDL_Quit();
  return 0;
}


ps. 哦,2.0 还是可以用 SDL_SetColorKey() 的。SDL_CreateTextureFromSurface() 内部会处理带 colorKey 的 surface。
所以可以用 non-alpha channel 的图片,:-)
surface = SDL_LoadBMP(filename);
assert(surface != NULL);

colorKey = SDL_MapRGB(surface->format, 255, 0, 255);
SDL_SetColorKey(surface, SDL_TRUE, colorKey);

texture = SDL_CreateTextureFromSurface(renderer, surface);
assert(texture != NULL);
  评论这张
 
阅读(2277)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017