游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2459|回复: 5

大家来看看这种用来实现镂空的Alpha通道创建方法,真奇

[复制链接]

18

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2006-1-26 08:48:00 | 显示全部楼层 |阅读模式


我实现镂空只是在RGB图片的基础上创建一个Alpha值为0的通道,然后用Blend混合实现镂空。但是我近来发现有的游戏中用除原图像之外的另外一个图片来创建原图像的Alpha通道。这个用来创建Alpha通道的图片和原图片一样,只是背景是黑色的。

如下图:


请问这是什么目的?大家有人使用过这种方法吗?
sf_200612684811.jpg

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2006-1-26 09:09:00 | 显示全部楼层

Re:大家来看看这种用来实现镂空的Alpha通道创建方法,真

我觉得它可能采用这样的算法:如果Alpha图片象素 不等于 黑色,则不镂空;否则就镂空

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2006-1-26 10:15:00 | 显示全部楼层

Re: 大家来看看这种用来实现镂空的Alpha通道创建方法,真

我曾经使用过这样的图片,通过位操作进行镂空。
sf_2006126101447.gif

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2006-1-26 13:10:00 | 显示全部楼层

Re:大家来看看这种用来实现镂空的Alpha通道创建方法,真

???方法可以有效消耗?却婵臻g =.=a
如果只要黑色不通?
?定一?? 1bit 的alpha?D就好了.不必?в猩?寿Y?但是有??=.=a
一般是?裼?bit的alpha?D?碛?可以得到比?漂亮的柔?效果

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2006-1-26 22:59:00 | 显示全部楼层

Re:大家来看看这种用来实现镂空的Alpha通道创建方法,真

对于很多不支持Alpha的方法来说(典型的是BitBlt),只能使用位操作实现Alpha。

18

主题

47

帖子

47

积分

注册会员

Rank: 2

积分
47
 楼主| 发表于 2006-1-27 08:39:00 | 显示全部楼层

Re:大家来看看这种用来实现镂空的Alpha通道创建方法,真

大家误会了,我这个说的镂空是3D游戏,上面的图就是3D游戏中的树枝的图片资源。

用单一的把黑色的Alpha值设为0,然后用Blend(SRC_ALPHA,ONE_MINUS_SRC_ALPHA)混合的确可以实现镂空,但边缘有残留的黑色,用上面说的两张图片,Alpha通道从第二张产生的方法黑边就没有了。下面是这种方法的代码,大家帮忙看看这样写的目的是什么?


        LoadBitmap(filename1);   //先读取第一个图片的数据到m_pImageData中(RGB)
       
       
           //定义一个将来存放RGBA数据的数组
           unsigned char *alpha=new unsigned char[ 4 * m_iWidth * m_iHeight ];               

                for (int a=0; a<m_iWidth * m_iHeight; a++)
                {
                        alpha[4*a]  = m_pImageData[a*3];                                        // R
                        alpha[4*a+1]= m_pImageData[a*3+1];                                // G
                        alpha[4*a+2]= m_pImageData[a*3+2];                                // B
                }
                       
//下面的代码是产生Alpha通道的
            
     FILE   file= fopen(filename2, "rb");
                    
                fseek(file,54,SEEK_SET);
               
                unsigned char temp[3];
               
                for ( a=0; a<m_iWidth * m_iHeight; a++)
                {
                        fread(temp,sizeof(unsigned char),3,file);
            alpha[4*a+3]=(temp[0]>temp[1])?temp[0]:temp[1];
            if(temp[2]>alpha[4*a+3])
             alpha[4*a+3]=temp[2];

                        if(alpha[4*a+3]>50)
                                                alpha[4*a+3]=255;
                }
                fclose(file);

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 08:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表