ballance吧 关注:10,527贴子:400,374

【制图相关】关于地图灯影和柱子问题的一点研究

只看楼主收藏回复

由于我以往很少关注制图的细节问题,这个问题我以前还真没注意过……
最近常在各处看到相关讨论于是决定抽出时间研究一下...以下是结果。
(剧透:我仍然没有找到完美的解决方案)
目录
一楼:目录
二楼:现象、现有结论以及变通方案(workaround)
三楼:此次得出的解决方案
四至五楼:研究过程
六楼:结论
七楼:bonus


IP属地:美国1楼2018-10-14 16:19回复
    现象:将ballance地图原地保存,游戏中塔中灯下的五边形阴影和柱子底部渐变会消失。
    自制地图中的相应部件也存在相同的问题。
    现有结论:贴图的alpha通道丢失。
    现有变通方案:用修改贴图坐标的方式重新制作柱子渐变的效果。


    IP属地:美国2楼2018-10-14 16:19
    回复
      2026-01-21 23:35:10
      广告
      不感兴趣
      开通SVIP免广告
      (在这层直接发解决方案,以避免强制大家阅读大篇的技术性过强的文本(
      解决方法一:
      修改游戏目录中RenderEngines\CK2_3D.ini的
      TextureVideoFormat = _16_ARGB1555
      SpriteVideoFormat = _16_ARGB1555
      部分为:
      TextureVideoFormat = _32_ARGB8888
      SpriteVideoFormat = _32_ARGB8888
      优/缺点:
      能解决灯影问题。对于使用原版地图的柱子模型的地图,也能解决柱子渐变的问题。
      **但对使用了现有变通方案的地图来说,会导致其中柱子渐变无法正常渲染。**
      解决方案二:
      注入游戏脚本进行修复。
      优/缺点:
      能够让所有第三方地图中相关部件全部正常显示的方案。但是需要修改游戏逻辑。


      IP属地:美国3楼2018-10-14 16:20
      回复
        研究过程--预备知识
        这里是一些能够帮助没有计算机基础的读者阅读研究过程正文的预备知识。
        数字图像:数字图像在计算机中一般表示为数个(长×宽)的矩阵(可以认为是数字组成的
        表格)。大部分的图像具有三个通道(三个矩阵),分别用以存储红绿蓝三个颜色的数据。
        将矩阵上的数值与屏幕上相应位置和颜色的像素的亮度对应,即得到显示的图像。
        有的图像还具有第四个通道,存储图像的透明度数据。(透明度数据在图像处理软件中
        常显示为一个灰度图像,其中颜色越接近黑色表示透明度越高)
        计算机中整数的表示方式:计算机常用二进制表示整数。X位的二进制数可以表示0至2^X-1的
        2^X个值。
        通道存储格式:诸如ARGB_8888和ARGB_1555的字段,被称为通道存储格式。例如ARGB_8888
        表示alpha、红绿蓝四个通道分别用8位二进制数存储,ARGB_1555表示alpha通道用1位二
        进制数存储,红绿蓝通道均用5位二进制数存储。没有透明通道的图片一般认为是完全不透明
        的。


        IP属地:美国4楼2018-10-14 16:20
        回复
          研究过程
          首先我用替换贴图和材质的方式,确定了问题出在贴图上,即游戏认为相应的贴图内容是全
          透明的。(原来的「alpha通道丢失」的说法不准确,因为如果alpha通道完全丢失,灯影
          应该显示为全黑。同时自制图中风扇的网罩由于采用了同样格式的贴图,也应因为alpha通
          道丢失而变成完全不透明。这些与观测到的结果不符。)
          然后尝试调节Texture Setup中的Desired Video Format(该贴图在显卡中的通道存储格
          式),发现已为能使该贴图正常显示的32 bits ARGB 8888。但是将其调为16 bits
          ARGB 1555或者Compressed DXT1(实质上与ARGB 1555相同,只是在显存中以压缩形式存
          储)时,渲染结果与ballance中一致。于是高度怀疑游戏中使用了错误的通道存储格式。
          接着在Ballance的CK2_3D.ini配置文件中发现了贴图使用的存储格式字段,且其默认值即
          为_16_ARGB_1555。将其改为_32_ARGB_8888后,游戏中能够正常显示灯影和柱子渐变。
          为了试探是否能够覆盖CK2_3D.ini中的贴图存储格式设定,我恢复了CK2_3D.ini的默认设
          置,在Gameplay.nmo中球出生后的脚本中插入了一段改变相应贴图的通道存储格式的脚本。
          发现此后游戏中也可以正常地显示这些部件。
          至此说明自制图和修改图中的Desired Video Format可能根本没有被存储在文件中,或者
          存储了但由于某种原因没有被游戏正确识别。
          后来 飘逸冷星 猜测问题原因与Virtools的General settings有关。为了证实或这否认
          这个猜测,我又做了以下试验:
          Virtools的general settings保存在dev.ini中,注意到其中也有CK2_3D段,并且其中也
          有TextureVideoFormat键,默认值为32 bits ARGB 8888,一种合理的推测是Virtools
          在保存时发现贴图设定中的该值与此选项的设定值相同,于是在保存的文件中省略了这个域。
          下面是试验的过程:
          1、将ballance的CK2_3D.ini中TextureVideoFormat设定为_DXT5(相当于带压缩的
          ARGB_8888格式),发现修改图中渐变能正常显示。
          2、将ballance的CK2_3D.ini中TextureVideoFormat设定还原为_16_ARGB1555,在关卡文件
          中将desired video format设定为Compressed DXT5(对应上面的_DXT5,并且与Virtools
          设定的ARGB 8888不同,以保证这个设定会出现在保存的文件中),发现渐变又不能正常显示。
          这否认了这个猜测。
          于是目前唯一合理的解释即为Virtools 3.5保存的文档格式与Virtools 2.1所用的文档格式
          略有区别,导致贴图的Desired Video Format选项无法被Virtools 2.1正确识别;所以游戏
          使用了默认的_16_ARGB1555格式。
          下面附上一个模拟图:左边部分为_32_ARGB8888中柱子渐变的贴图,右半部分为转换为
          _16_ARGB1555格式后的贴图。可以推测现有workaround即为将右侧贴图透明度突变附近的部
          分拉伸至整个模型,利用渲染过程中的插值过程产生渐变效果。但是这样会导致贴图的水平
          纹理丢失,所以也不是完美的解决方案。

          由于ARGB_1555格式中,透明通道只能表示两种值:全不透明和全透明。原格式则能表示256
          种不同的透明度。所以0~127的值全部被当作全透明处理,以上的值全部被当作不透明。
          这也是为什么风扇网罩能够正常显示(风扇网罩的alpha通道本身就是很接近仅有全透明——全
          不透明的图像)的原因。


          IP属地:美国5楼2018-10-14 16:21
          回复
            结论
            现有的解决方案并不能完美地解决问题。并且在摸清Virtools存储的文件格式结构前,
            很难得出一个完美的解决方案。
            (即便找到了完美的解决方案,也有很大概率需要对使用了原有方案的地图进行一轮维护,
            或者修改游戏文件)
            感谢2jjy的BallanceModding提供的nmo文件。飘逸冷星和ballancebug在途中提供了帮助,
            在此也一并致谢。


            IP属地:美国6楼2018-10-14 16:21
            回复
              bonus: 关于灯笼光线
              最近看到某些自制地图的灯笼缺失了光线:如下图(左为无光线,右为有光线)

              在Virtools中打开所有原版地图,发现灯笼都没有光线。
              原因是因为Levelinit.nmo中有一处脚本修改了灯笼光线的材质:
              (相关脚本位于 Levelinit_build - set Mapping and Textures - Set Mat Laterne,
              注意该脚本仅修改_一个_名为 Laterne_Verlauf 的材质,所以如果光线材质名称与此不
              同,或者有很多同名材质,均可能导致光线不显示)

              修改后的灯笼光线材质相当于Material Setup中的如下配置:

              为了解决这个问题 你可以直接将灯笼光线的材质按上图配置,或者将灯笼光线的材质名
              改为Laterne_Verlauf。
              希望这个帖子能对以后大家做出更多高质量的地图有一点作用(


              IP属地:美国7楼2018-10-14 16:22
              回复
                最后帖一下飘逸冷星对同一个问题的描述,值得一看


                IP属地:美国8楼2018-10-14 16:24
                回复
                  2026-01-21 23:29:10
                  广告
                  不感兴趣
                  开通SVIP免广告
                  dd,这几天一直在搞啊,很强


                  IP属地:天津来自Android客户端10楼2018-10-14 17:47
                  回复
                    说好的为Chris椰叶打call
                    后排支持一波


                    IP属地:安徽来自手机贴吧11楼2018-10-14 17:54
                    收起回复
                      支持一波


                      IP属地:河南来自Android客户端12楼2018-10-14 18:00
                      回复
                        太强了


                        IP属地:河南13楼2018-10-14 18:12
                        收起回复
                          也为一代代人制图探索的精神喝彩!


                          IP属地:宁夏来自Android客户端14楼2018-10-14 19:55
                          回复
                            向各位大佬掉头。
                            我就默默看着好了(渣渣随风而去


                            IP属地:北京来自iPhone客户端16楼2018-10-14 21:57
                            回复(2)
                              2026-01-21 23:23:10
                              广告
                              不感兴趣
                              开通SVIP免广告
                              顶顶


                              IP属地:山西来自手机贴吧17楼2018-10-14 22:13
                              回复