佳丽云

英雄无敌3-WoG中文站

 找回密码
 英雄注册|Register
查看: 3986|回复: 9

问一些关于DEF文件的问题

[复制链接]

该用户从未签到

96

回帖

1万

金币

0

精华

3级 Known Hero

Rank: 3Rank: 3

积分
792
发表于 2014-1-29 03:30:01 | 显示全部楼层 |阅读模式
DEF动画文件在hero3中占据大量的地位,所以我想了解一下这个格式

DEF文件在游戏中的载入方式是?
我想知道DEF文件实际占用多少显存,一个600KB左右的骨龙在屏幕上显示后依然只占用600KB的显存吗?
DEF是256色?所以才这么小?是否使用了压缩算法?
最低要求8M显存的显卡,而一个骨龙就占了600KB,一场战斗顶多支持十几二十个单位

不论如何
DEF的文件格式如何?哪里可以找到介绍DEF文件的格式标准?


如果可以的话你们是希望继续采用256色,还是24位、32位色?
不过,不得不说,动态图片使用高位色的话,真的很吃显存......
目前看来还要学256色的方法,真是麻烦...

评分

1

查看全部评分

该用户从未签到

96

回帖

1万

金币

0

精华

3级 Known Hero

Rank: 3Rank: 3

积分
792
 楼主| 发表于 2014-1-29 20:37:42 | 显示全部楼层
这小段时间考虑了一下

老实说,处理起来有些麻烦
Opengl貌似没有直接的支持,256色虽然可以通过shader进行调色板置换,研究一下就能用
但是压缩功能就让我不知所措了

所有的复杂颜色动画在即使压缩为RGBA8的情况下,也能维持不会大太多的体积
可是单位动画简直让人发指:
450x400的动画如果不压缩,哪怕256色也占据180KB的体积,原因就是那超大范围的透明空白啊
Opengl3.0+貌似不支持256色压缩纹理
不压缩的256色纹理还不如压缩了的32位色纹理,差不多大小..
不过,如果把空白去掉,骨龙这种能节约70~80%的体积,即使这样60张图也要2M显存,平均1张30+KB
随便找张差不多大的gif也是论M算

虽然可喜的是,随便一个8位静态图,压缩成32位之后都比原来小了1/3左右
不过动态图果然才是最麻烦的啊...
研究不深,不知道英3是用什么方式在古董电脑上显示这些图片的

评分

1

查看全部评分

该用户从未签到

96

回帖

1万

金币

0

精华

3级 Known Hero

Rank: 3Rank: 3

积分
792
 楼主| 发表于 2014-2-5 02:49:51 | 显示全部楼层
虽然知道了DEF的结构:
http://wiki.enleth.com/homm:homm3-def-animations
但是太麻烦了= =

于是考虑直接修改调色板,配合ResView进行修改,全都弄成32位色的得了
如是,查询到调色板开头的固定格式
1.(0,255,255) //天蓝色是透明色,这个 ResView自动转换了透明度设置,不用管
2.(255,150,255)
3.(255,100,255)
4.(255,50,255)
5.(255,0,255)

接下来的这几个就看不懂了,都是粉色,但是我用鼠标查询图像,只发现了(255,150,255) 以及 (255,0,255)被用于阴影
所以诞生了两个问题
1是:100和50是干啥的?
2是:它们分别对应了现实中的哪种颜色,及其透明度是?

话说heroes3的阴影能够半透明的看到草地吗?

该用户从未签到

96

回帖

1万

金币

0

精华

3级 Known Hero

Rank: 3Rank: 3

积分
792
 楼主| 发表于 2014-2-5 16:50:10 | 显示全部楼层
抽样调查发现:000,255,255
255,150,255
255,100,255
255,050,255
255,000,255
255,255,000
180,000,255
000,255,000
255,128,255
255,128,255


为固定颜色,应该都是功能色..
当然,部分颜色如(255,255,0)是金色边框

但是有些就不懂了:
cddrag01.jpg

这个金龙的初始站姿,使用了金边之外,还有紫色(180,0,255),以及绿色(0,255,0)
实际游戏貌似这两种颜色并不现实,那究竟是什么功能?
  • TA的每日心情
    郁闷
    2015-6-6 16:12
  • 签到天数: 52 天

    连续签到: 1 天

    [LV.5]女巫

    4949

    回帖

    3万

    金币

    35

    精华

    超级版主

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    34677

    论坛守望者论坛元老杰出贡献

    发表于 2014-2-5 20:23:57 | 显示全部楼层
    猫锅对DEF研究的这个课题太高深了,我完全看不懂.
    这里唯有鼓励一下楼主继续深入研究.

    点评

    想把8位索引图弄成32位真彩图,发现还有点问题。。。 我压根就不想学习图片格式,可是不学的话没法一步转换到位 本来批量改颜色没啥问题,可是8位图的索引只有全透明和不透明(还没弄清楚透明度具体怎么用),试  详情 回复 发表于 2014-2-5 20:49

    该用户从未签到

    96

    回帖

    1万

    金币

    0

    精华

    3级 Known Hero

    Rank: 3Rank: 3

    积分
    792
     楼主| 发表于 2014-2-5 20:49:02 | 显示全部楼层
    贤知有您 发表于 2014-2-5 20:23
    猫锅对DEF研究的这个课题太高深了,我完全看不懂.
    这里唯有鼓励一下楼主继续深入研究.

    想把8位索引图弄成32位真彩图,发现还有点问题。。。
    我压根就不想学习图片格式,可是不学的话没法一步转换到位

    本来批量改颜色没啥问题,可是8位图的索引只有全透明和不透明(还没弄清楚透明度具体怎么用),试着找找其他支持PNG8+alpha的软件看能不能简单上手调颜色,这块暂且放下,我先学习一下制作别的功能好了。。。

    我也是新手啊,学习的路上就拿英雄无敌3开刀了噗哈哈

    该用户从未签到

    3

    回帖

    17

    金币

    0

    精华

    1级 Hired Hero

    Rank: 1

    积分
    49
    发表于 2014-2-17 23:49:37 | 显示全部楼层
    我己经写出了程序
    完全实现了def中type 1 pcx 的读取,它采用的是比较简单的rle算法
    网上漏掉了一点,那就是对于每一个rle 包 或raw 包,读取长度后要+1才能得到真正的像素长度

    不过type 2 和type 3 格式的pcx 加密在网上找不到資料,郁闷

    该用户从未签到

    3

    回帖

    17

    金币

    0

    精华

    1级 Hired Hero

    Rank: 1

    积分
    49
    发表于 2014-2-18 00:04:18 | 显示全部楼层
    DEF文件在游戏中的载入方式是?
    答:从h3sprite.lod 中找出相应包,如果是压过的,用zlib 解压,否则直接解压,得到def文件。得到后先获得def的header,def中有个256色的调色板,是24位的rgb色,0号色是透明色,1-4号色是4阶带alpha的黑色。得到 sequence 数目后。找到需要的sequence。从需要的sequence中,得到每一帧的名字及偏移量,最后得到每一帧,按每一帧的压缩类型抓出,一共有3种类型。

    我想知道DEF文件实际占用多少显存,一个600KB左右的骨龙在屏幕上显示后依然只占用600KB的显存吗?
    DEF是256色?所以才这么小?是否使用了压缩算法?
    答:def文件与显存无关,与显存有关的是def 中的sequence 中的帧的像素。所以一个600kb的骨龙,是要按帧算的,如果有n帧,平均每一帧宽为w, 高为h,占用的显存是 n*w*h*4,其中4是 4个通道,因为opengl 的内部存储格式一般来说是rgba, 所以我用opengl写的英3引擎就可以达到真彩画面了。至用def结构,和其中的sequence本身没有使用任何算法。但pcx帧使用了3种算法,第一种广为人知的是rle算法,但这些算法只影响了def 的内存大小,并没有影响最终帧的显存大小。

    点评

    嗯,也是前不久才学会用glCompressedTexSubImage2D,虽然不是很清楚这是否是动画的标准处理方法,达到内存替换显存的效果,600KB的骨龙如果放在现在的Opengl版本(至少3.3),只能用作RGBA格式了,那么一个256色的纹  详情 回复 发表于 2014-2-22 15:55

    评分

    1

    查看全部评分

    该用户从未签到

    3

    回帖

    17

    金币

    0

    精华

    1级 Hired Hero

    Rank: 1

    积分
    49
    发表于 2014-2-18 00:24:30 | 显示全部楼层
    beorht 发表于 2014-2-18 00:04
    DEF文件在游戏中的载入方式是?
    答:从h3sprite.lod 中找出相应包,如果是压过的,用zlib 解压,否则直接 ...

    是的,最近又重温了英3经典,很想在安卓上玩,但是找不到合适的版本,必竟vcmi移植版不稳定。所以打算自己写一个英3引擎,刚完成了type1 的pcx读取,找type2 和type3的时候就经过贵论坛了。
    刚才有了新收获,是sourceforge 上面 关于type2 和type3 解压的源代码:
    http://sourceforge.net/apps/trac ... andler.cpp?rev=2639

    该用户从未签到

    96

    回帖

    1万

    金币

    0

    精华

    3级 Known Hero

    Rank: 3Rank: 3

    积分
    792
     楼主| 发表于 2014-2-22 15:55:16 | 显示全部楼层
    beorht 发表于 2014-2-18 00:04
    DEF文件在游戏中的载入方式是?
    答:从h3sprite.lod 中找出相应包,如果是压过的,用zlib 解压,否则直接 ...

    嗯,也是前不久才学会用glCompressedTexSubImage2D,虽然不是很清楚这是否是动画的标准处理方法,达到内存替换显存的效果,600KB的骨龙如果放在现在的Opengl版本(至少3.3),只能用作RGBA格式了,那么一个256色的纹理就要用32位色来代替,无压缩,450x400的纹理占用700+KB,压缩后一张纹理170+KB,所以所有450x400的纹理无论多少帧都占用170+KB的显存
    我不知道现在的Opengl3.3以上如何载入256色的纹理,貌似好像是不支持的,关键是一张纹理,无压缩处理的256色450x400是170+KB,我压缩后的32位色450x400纹理还是170+KB

    所以根本上就放弃了载入 def 了。RLE这种算法显存用不到,那就完全不需要了,反正内存多,也省得显存要用的时候还要软件解码,貌似显存不支持纹理解这种码的


    所以我想,干脆把纹理的载入抛开给ResView & PS等工具,直接把前提放在读取32位色压缩纹理应该会好很多。我能想到的Opengl3.3要使用256色纹理,必须在shader文件内写一个调色板颜色替换(虽然没实践,但是理论上可行),费力不说,效果也只是那个时代的画面。这么安排也不支持32位色的扩展,妨碍MOD发展。双重标准则使程序变得更加复杂,且减慢了速度。


    业余新手知道得不多,不过有兴趣的话可以讨论如何重写英3,并达到更广阔的MOD空间
    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 英雄注册|Register

    本版积分规则

    捐赠
    关注我们,英3Mod一网打尽!

    WoG中文站 ( 辽B2-20210485-10 )|辽公网安备 21128202000228 号

    GMT+8, 2025-1-23 21:24 , Processed in 0.920878 second(s), 26 queries , Gzip On, File On.

    Powered by Discuz! X3.4

    Copyright © 2004-2022, Beijing Second Sight Technology Co., LTD.

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