游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3428|回复: 10

颜色混合问题

[复制链接]

15

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2008-11-11 16:42:00 | 显示全部楼层 |阅读模式

DWORD        CParticleSystem::ColorLerp(DWORD color1,DWORD color2,float fWeight)
{
        DWORD Weight=(BYTE)(fWeight*0x100);  //后面100转换成十进制是256
                  if(fWeight<=0.0f) return color1;
                else if(fWeight>=1) return color2;
                else
                {
                          DWORD IWeight= Weight^0xFF;                          
                               DWORD dwTemp=0;
                                dwTemp =(((0xFF00FF00&color1)>>8)*IWeight+
                                     ((0xFF00FF00&color2)>>8)*Weight
                                    )&0xFF00FF00;
                       
                        dwTemp|=(((0x00FF00FF&color1)*IWeight+
                                      (0x00FF00FF&color2)*Weight
                                     )&0xFF00FF00)>>8;

                        return dwTemp;
                }

}
这里面做的是颜色混合吧.请问那位大侠指点
它是怎么样算的混合方式

尤其是这个混合代码是怎么做的:   
                                dwTemp =(((0xFF00FF00&color1)>>8)*IWeight+
                                     ((0xFF00FF00&color2)>>8)*Weight
                                    )&0xFF00FF00;
                       
                        dwTemp|=(((0x00FF00FF&color1)*IWeight+
                                      (0x00FF00FF&color2)*Weight
                                     )&0xFF00FF00)>>8;

什么移位.相乘.与.怎么看也没明白;
请大侠指点...

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-11 17:05:00 | 显示全部楼层

Re:颜色混合问题

第一个部分是混合alpha和green通道(0xFF00FF00)
第二部分是很和red和blue通道(0x00FF00FF)
使用在32位整数中不相邻的两个字节,可以一次处理两个通道

15

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
 楼主| 发表于 2008-11-11 19:43:00 | 显示全部楼层

Re:颜色混合问题

0xFF00FF00&color1)>>8  这个为什么还要移动8位啊.直接不就是得到alpha和green通道了吗.
还有第二句.0x00FF00FF&color1)*IWeight+ (0x00FF00FF&color2)*Weight这句都应该是得到red和blue通道为什么还要先得到alpha和green通道后移位得到red和blue通道啊.
     

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-12 12:53:00 | 显示全部楼层

Re:颜色混合问题

不右移的话,做乘法时不就溢出了么

red/blue和alpha/gree两部分是分别计算的,先后顺序无关,互不干涉

15

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
 楼主| 发表于 2008-11-12 15:07:00 | 显示全部楼层

Re:颜色混合问题

dwTemp|=(((0x00FF00FF&color1)*IWeight+
      (0x00FF00FF&color2)*Weight
     )&0xFF00FF00)>>8;

那这句弄完后不能溢出吧.那直接用0x00FF00FF这个做& 运算呗.
那为什么还要先驱者& 0xFF00FF00 完在移位啊.




19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-12 15:31:00 | 显示全部楼层

Re:颜色混合问题

一个0-255的颜色通道值,乘以一个0-255的混合比例,结果是0-65025内的整数,而结果必须是0-255的,所以右移取高8位

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-11-12 17:23:00 | 显示全部楼层

Re:颜色混合问题

右移8位就是除256这样计算结果不对啊,应该是除255才对啊

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-12 19:02:00 | 显示全部楼层

Re:颜色混合问题

嗯,混合比例应该是0-256

15

主题

33

帖子

33

积分

注册会员

Rank: 2

积分
33
 楼主| 发表于 2008-11-12 20:20:00 | 显示全部楼层

Re:颜色混合问题

dwTemp|=(((0x00FF00FF&color1)*IWeight+
      (0x00FF00FF&color2)*Weight
     )&0xFF00FF00)>>8;
你还是没有明白我的意思啊.    最后 & 上这个 0xFF00FF00 是alpha\green通道吧后再移位.
那为什么不直接 & 0x00FF00FF  直接 & 上red\blue通道啊.直接能得到red\blue值啊.

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-13 12:47:00 | 显示全部楼层

Re: Re:颜色混合问题

dcrlj: Re:颜色混合问题

dwTemp|=(((0x00FF00FF&color1)*IWeight+
      (0x00FF00FF&color2)*Weight
     )&0xFF00F...


你还是没明白,这段是处理red/blue的,掩码是0x00FF00FF,乘以weight后,有值的范围分别从8位扩大到16位,变成0xFFFF FFFF。高有效位掩码是0xFF00FF00,低有效位掩码0x00FF00FF。舍弃低有效位后,掩码为0xFF00FF00。但这时向左偏移了8位,需要再右移8位回到red/blue通道的位置。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 22:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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