设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3171|回复: 9
打印 上一主题 下一主题

[讨论] 关于RM的色调算法

[复制链接]

Lv1.梦旅人

梦石
0
星屑
145
在线时间
698 小时
注册时间
2009-11-15
帖子
538
跳转到指定楼层
1
发表于 2012-2-9 17:23:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 2719358 于 2012-2-9 17:28 编辑

由于我目前正在开发引擎的缘故,请问RM里的色调(更改画面色调)的原理是什么.
我自己用C+嵌入汇编写了一个但不完美,
1.在任意值为0xff时并不会变成这种颜色,这是预想内的,因为我现在的算法是:最终颜色=颜色一/2+颜色2/2
需要手动判断每个分量是否为0xff吗
2.我这个只能使一张图片变色,而不能对整个画面变色,RM是每帧都执行一遍函数为画面变色吗?那样的话效率会不会很低?

3.无法变回原色
翻译成Ruby:

RUBY 代码复制
  1. def tcolor(c1,c2)
  2.         r1=(c1>>16)&0xff
  3.         g1=(c1>>8 )&0xff
  4.         b1=(c1)&0xff
  5.         r2=(c2>>16)&0xff
  6.         g2=(c2>>8 )&0xff
  7.         b2=(c2)&0xff
  8.         return ((r1/2+r2/2)<<16)+((g1/2+g2/2)<<8)+(b1/2+b2/2)
  9. end
  10. def set_color(r,g,b)
  11.         c=(r<<16)+(g<<8)+b
  12.         LockSurface(pScreen);
  13.         Width.times{|i|
  14.                 Height.times{|j|                       
  15.                         putpixel(i,j,Tcolor(c,getpixel(i,j)))
  16.                 }
  17.         }
  18.         UnlockSurface(pScreen);
  19. end

C+内嵌汇编:
ASM 代码复制
  1. Uint32 Tcolor(Uint32 c1,Uint32 c2)
  2.                 {
  3.                         Uint8 r1;
  4.                         Uint8 g1;
  5.                         Uint8 b1;
  6.                         Uint8 r2;
  7.                         Uint8 g2;
  8.                         Uint8 b2;
  9.                         Uint32 rgb;               
  10.                         _asm
  11.                         {               
  12.                                         ;取得各个RGB分量
  13.                                         ;********
  14.                                         mov eax,c1
  15.                                         mov cl,16
  16.                                         shr eax,cl
  17.                                         mov r1,al
  18.                                         ;********
  19.                                         mov eax,c1
  20.                                         mov cl,8
  21.                                         shr eax,cl
  22.                                         mov g1,al
  23.                                         ;********
  24.                                         mov eax,c1
  25.                                         mov b1,al
  26.                                         ;********
  27.                                         mov eax,c2
  28.                                         mov cl,16
  29.                                         shr eax,cl
  30.                                         mov r2,al
  31.                                         ;*********
  32.                                         mov eax,c2
  33.                                         mov cl,8
  34.                                         shr eax,cl
  35.                                         mov g2,al
  36.                                         ;*********
  37.                                         mov eax,c2
  38.                                         mov b2,al
  39.  
  40.                                         ;*****************************************
  41.                                         ;开始处理 R
  42.  
  43.                                         mov ax,0
  44.  
  45.  
  46.                                         mov al,r1  
  47.                                         mov cl,2
  48.                                         div cl
  49.  
  50.  
  51.                                         mov bl,al  
  52.  
  53.                                         mov al,r2  
  54.                                         mov cl,8
  55.                                         div cl     
  56.  
  57.                                         add al,bl  
  58.                                         mov ah,0
  59.                                         mov cl,16  
  60.                                         shl al,cl
  61.  
  62.                                         mov ebx,eax
  63.  
  64.  
  65.                                         ;*****************************************
  66.                                         ;开始处理 G
  67.                                         mov eax,0
  68.  
  69.                                         mov al,g1
  70.  
  71.                                         mov cl,2
  72.                                         div cl   
  73.  
  74.                                         mov ah,0
  75.  
  76.                                         mov bh,al
  77.  
  78.                                         mov al,g2
  79.                                         mov cl,2
  80.                                         div cl   
  81.  
  82.                                         mov ah,0
  83.  
  84.                                         add bh,al
  85.  
  86.                                         ;*****************************************
  87.                                         ;开始处理 B
  88.  
  89.                                         mov al,b1
  90.                                         mov cl,2
  91.                                         div cl  
  92.  
  93.                                         mov ah,0
  94.  
  95.                                         mov bl,al
  96.  
  97.                                         mov al,b2
  98.                                         mov cl,2
  99.                                         div cl
  100.  
  101.  
  102.                                         add bl,al
  103.  
  104.                                         ;处理完毕
  105.                                         mov rgb,ebx
  106.  
  107.                         }
  108.                         return rgb;
  109.                 }


C 代码复制
  1. void SetColor(Uint8 r,Uint8 g,Uint8 b)
  2.                 {
  3.                         Uint32 c = (r<<16)+(g<<8)+b;
  4.                         LockSurface(pScreen);
  5.  
  6.                         for (int i=0;i<Width();i++)
  7.                         {
  8.                                 for (int j=0;j<Height();j++)
  9.                                 {
  10.                                         putpixel(i,j,Tcolor(c,getpixel(i,j)));
  11.                                 }
  12.                         }
  13.  
  14.                         UnlockSurface(pScreen);
  15.                 }
考上三级了!

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
2
发表于 2012-2-14 18:15:11 | 只看该作者
Tone.new(r, g, b, gray)

原像素颜色:r、g、b

经过Tone调整后颜色为:

grayfull = (r * 38 + g * 75 + b * 15) >> 7

r = tone.r + r + (grayfull - r) * tone.gray/ 256  
g = tone.g+ g + (grayfull - g) * tone.gray/ 256
b = tone.b+ b + (grayfull - b) * tone.gray/ 256

评分

参与人数 2星屑 +132 收起 理由
IamI + 92 受用。
2719358 + 40 回去试一下,谢谢了~

查看全部评分

RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
145
在线时间
698 小时
注册时间
2009-11-15
帖子
538
3
 楼主| 发表于 2012-2-15 08:37:06 | 只看该作者
灼眼的夏娜 发表于 2012-2-14 18:15
Tone.new(r, g, b, gray)

原像素颜色:r、g、b

另外,这个需要每帧调用一次吗
考上三级了!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
4
发表于 2012-2-15 12:11:09 | 只看该作者
2719358 发表于 2012-2-15 08:37
另外,这个需要每帧调用一次吗

这个得看你引擎如何实现了,比如如果修改位图数据实现色调那么肯定不用每帧调用,如果你采用shader等实现(那么就每帧执行吧(:
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2012-2-11
帖子
233
5
发表于 2012-2-28 16:14:26 | 只看该作者
本帖最后由 viktor 于 2012-2-28 16:16 编辑

其实不必自己实现这些基本运算吧……应该有合适的图形库的
如果一定要自己做基本运算的话 饱和运算可以尝试一下mmx指令。不好用但是很强力。
(以下代码和问题无关。)
  1.     __m64 ALIGN a, b, z=_mm_setzero_si64();                 //pxor
  2.     a=_mm_cvtsi32_si64(*src); b=_mm_cvtsi32_si64(*dest);    //movd
  3.     a=_mm_unpacklo_pi8(a, z); b=_mm_unpacklo_pi8(b, z);     //punpcklbw

  4.     b=_mm_mullo_pi16(a, b);         //pmullw
  5.     b=_mm_srli_pi16(b, 8);          //psrlw
  6.     b=_mm_packs_pu16(b, z);         //packuswb
  7.     *dest=_mm_cvtsi64_si32(b);      //movd
  8.     _mm_empty();                    //emms
复制代码
‘‘──viktor于2012-2-28 16:15补充以下内容

另外:求DX 2D渲染教程…………我有点想把RGSS的渲染改成用DX 不过完全不知道怎么做
’’
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
145
在线时间
698 小时
注册时间
2009-11-15
帖子
538
6
 楼主| 发表于 2012-3-25 15:28:30 | 只看该作者
灼眼的夏娜 发表于 2012-2-14 18:15
Tone.new(r, g, b, gray)

原像素颜色:r、g、b

貌似tone.r+r以后>255了= =
(grayfull - r) * tone.gray/ 256也没有让他比255小=  =
tone.r r grafull tone.gray 都是uint8
考上三级了!
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

7
发表于 2012-3-29 19:28:54 | 只看该作者
其实Shadow是个好东西……反正速度够快,无所谓的。。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
145
在线时间
698 小时
注册时间
2009-11-15
帖子
538
8
 楼主| 发表于 2012-4-7 19:32:00 | 只看该作者
@灼眼的夏娜
前辈好,我经过几次试验变换色调已经没有问题了,但是怎么才能变回来呢?
考上三级了!
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

9
发表于 2012-4-9 09:53:57 | 只看该作者
本帖最后由 精灵使者 于 2012-4-9 09:54 编辑

更改色调为(0,0,0,0)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
145
在线时间
698 小时
注册时间
2009-11-15
帖子
538
10
 楼主| 发表于 2012-4-9 11:07:45 | 只看该作者
精灵使者 发表于 2012-4-9 09:53
更改色调为(0,0,0,0)

啊,在Rm里就变回来了,但是在我的引擎里颜色不变= =
@灼眼的夏娜
难道要多存储一个Bitmap么,除了 Sprite.Bitmap外还需要在Sprite内多存储一个么,每次变换都按照多存的变换?

点评

[url=home.php?mod=space&username=精灵使者]@精灵使者[/url] 问题在于,连viewport也要自己实现= =  发表于 2012-4-12 11:10
这个VIEWPORT在地图之上,可以转换所有的色调  发表于 2012-4-12 08:18
精灵想起来了。自己做小地图的时候,那个色调使用VIEWPORT的tone来修改的。  发表于 2012-4-12 08:18
没有修改图片本身,意即:可能是图片的拷贝,也可能是shader之类,也可能直接操作某个目的buff  发表于 2012-4-10 20:16
[url=home.php?mod=space&username=灼眼的夏娜]@灼眼的夏娜[/url]啊,没有修改图片是怎么做的?难道显示的时候再修改么  发表于 2012-4-10 11:08
考上三级了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-5 18:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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