骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 36801|回复: 22

[功能与代码] 【shaders】使用postFX.fx提升战团画质(战团重置版的核心)

[复制链接]

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
发表于 2023-2-1 19:44:50 | 显示全部楼层 |阅读模式
本帖最后由 fengguoyehao 于 2025-7-30 10:34 编辑

如果大家体验过战团重置版,肯定会对战团重置版提升画质的方法感到好奇。今天我们就来聊一聊提升战团重置版画质的核心:postFX.fx

在阅读本文之前,如果你不了解战团的shaders,可以阅读这个帖子,里面的介绍写得很清晰:【shaders技术研究】关于骑砍中的着色器的编辑方法 - MOD制作资料区 - 骑马与砍杀中文站论坛 - Powered by Discuz! (mountblade.com.cn)(其实我不太懂高级着色器语言,以下内容是我花了半年时间自学的。如果有会高级着色器语言的大神看到这篇文章,欢迎补充内容!顺便请帮忙看看Reshade的光追效果有没有可能移植到战团的postFX.fx里,万分感谢!)

让我们进入正题:

postFX.fx控制着战团的HDR、自动调光和动态模糊效果。战团重置版的postFX.fx包含SSAO效果和后期调色效果。其中,SSAO效果勾选“动态模糊”启用,后期调色效果可以通过打开HDR启用。
以下为postFX.fx代码,可以使用Sublime Text来编写。

SSAO(环境光遮蔽):
关于SSAO效果,在外网论坛上有代码(Pure Depth SSAO (theorangeduck.com))。这个代码不够完整,不过Tama将这份代码改了改,成功地写入了postFX.fx(OSP - Shaders - Tama's Shaders (Dynamic Parallax Occlusion & Parallax & SSAO) | TaleWorlds Forums),完整代码如下:

(点击展开 / 收起)

后期调色功能(HDR):
思路是移植Reshade和sweetfx(其实两个是一个东西)里面的fx文件语言到postFX.fx里,也就是大家熟知的“滤镜”效果。
Reshade是一个开源的二次渲染软件,但用于战团时有很多问题,比如说ui渲染不同步,无法获取深度信息...最重要的是,它和ENB一样十分吃配置。将Reshade的语言移植到postFX.fx里面可以最大程度上进行帧数优化。
后期调色功能得以实现,要感谢@杜撰。以下的Filimcpass,DPX,Vibrance,Technicolor2,Tint(Sepia),LiftGammaGain都是@杜撰最早移植的。可以说,@杜撰为战团的画质带来了一场革命!
下面,我来展示一些移植成功的语言。

移植fx代码:
(点击展开 / 收起)
(点击展开 / 收起)
(点击展开 / 收起)
(点击展开 / 收起)
(点击展开 / 收起)
(点击展开 / 收起)
输出代码:
(点击展开 / 收起)

写入方法(以写入Vibrance功能为例,其余的以此类推):
1)找到这一段代码:
  1. /////////////////////////////////////////////////////////////////////////////////////

  2. float4 FinalScenePassPS(uniform const bool use_dof, uniform const int use_hdr, uniform const bool use_auto_exp, float2 texCoord: TEXCOORD0) : COLOR {
  3.                
  4.         // Sample the scene
  5.         float4 scene = tex2D(postFX_sampler0, texCoord);
  6.         scene.rgb  = pow(scene.rgb, output_gamma);
复制代码

在“//////////////////////////////////////////////////////////”下面一行添加// Func {{{1
就像这样:
  1. /////////////////////////////////////////////////////////////////////////////////////
  2. // Func {{{1
复制代码
再重起一行,添加Vibrance的fx代码,就像这样。在代码的最底下添加// Final {{{1(表示结束):
  1. /////////////////////////////////////////////////////////////////////////////////////
  2. // Func {{{1

  3. //Vibrance {{{2
  4. float3 Vibrance(float3 color, float I, float3 RGB)
  5. {
  6.         const float3 coefLuma = float3(0.212656, 0.715158, 0.072186);
  7.         float luma = dot(coefLuma, color);
  8.         float max_color = max(color.r, max(color.g, color.b)); // Find the strongest color
  9.         float min_color = min(color.r, min(color.g, color.b)); // Find the weakest color
  10.         float color_saturation = max_color - min_color; // The difference between the two is the saturation

  11.         float3 coeffVibrance = float3(RGB * I);
  12.         color = lerp(luma, color, 1.0 + (coeffVibrance * (1.0 - (sign(coeffVibrance) * color_saturation))));

  13.     return color;
  14. }
  15. // Final {{{1
复制代码
2)找到这段代码:
  1. //--float2 luminanceAvgMax = tex2D(postFX_sampler2, float2(0.5f, 0.5f)).rg;
  2. //--return tex2D(postFX_sampler2, texCoord).y * 100;
复制代码


另起一行添加输出代码:
  1. //--float2 luminanceAvgMax = tex2D(postFX_sampler2, float2(0.5f, 0.5f)).rg;
  2. //--return tex2D(postFX_sampler2, texCoord).y * 100;

  3. //Vibrance {{{2
  4. color.rgb = Vibrance(color.rgb, 0.3, float3(0.6,0.6,1.0));
复制代码

3)保存文件
分析部分:
1)关于调整数据:
以DPX为例,它的移植代码里面有这一行:
  1. float3 DPX(float3 color, float3 RGB_Curve, float3 RGB_C, float Contrast, float Saturation, float Colorfulness, float Strength)
复制代码
输出代码里面有这一行:
  1. color.rgb = DPX(color.rgb, float3(15,15,15), float3(0.33,0.33,0.33), 0.58, 1.6, 1.5, 0.20);
复制代码
看到这,你会发现float是一一对应的关系:

float3 RGB_Curve对应float3(15,15,15);float3 RGB_C对应float3(0.33,0.33,0.33);float Contrast对应0.58;float Saturation对应1.6;float Colorfulness对应1.5;float Strength对应0.20 2)
实时调色 移植代码里面的功能和Reshade里面是一致的。
可以先下载一个Reshade,在Reshade里面把数据调好,再写入postFX.fx


总结:
postFX.fx可以实现的功能还有很多,比如说DOF。目前,我成功移植的Reshade语言仅限于调色功能。也许未来的某一天会有人找到移植MXAO,Lightroomdof,RTGI等高级功能的方法。
愿战团再战十年!




评分

参与人数 2荣誉 +1 第纳尔 +35 互助 +1 魅力 +25 收起 理由
Aomine Daiki + 20 + 20 文章不错,继续努力!
幼稚园殺手 + 1 + 15 + 1 + 5 您的帖子很有价值!

查看全部评分

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-2-2 14:32:07 | 显示全部楼层
补充一点,如果出现ps_2_0报错,把postFX.fx里面的所有ps_2_0改为PS_2_X

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-2-2 19:12:39 | 显示全部楼层
djman 发表于 2023-2-2 17:52
shaders可以修改大地图光影变化吗?

请问你是指大地图的亮度吗?天空盒子和postFX.fx都可以影响大地图的亮度。

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-2-2 19:38:20 | 显示全部楼层
djman 发表于 2023-2-2 19:29
就是大地图上模拟太阳光照变化,就像骑砍2,战团大地图编辑器里也可以调节太阳的位置,光影也会变化。而 ...

我知道有一个天空盒可以实现你说的功能:https://forums.taleworlds.com/in ... 42181/#post-8161786

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-2-2 19:51:06 | 显示全部楼层
djman 发表于 2023-2-2 19:43
还有战团设置里的伽马值调的最高还是有些暗,能提高伽马值的上限吗

可以,就用postFX.fx调,但必须打开HDR才能生效

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-2-2 19:52:29 | 显示全部楼层
本帖最后由 fengguoyehao 于 2023-2-2 19:55 编辑
djman 发表于 2023-2-2 19:43
还有战团设置里的伽马值调的最高还是有些暗,能提高伽马值的上限吗

我不会调伽马值的上限,不过我会用postFX.fx调节HDR模式下的亮度

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-4-7 20:25:05 | 显示全部楼层
apk43 发表于 2023-2-17 21:35
这是我诱导chatgpt编写的添加模拟光追的代码,由于我还不太懂相关代码,请楼主看看是否经优化后可行,不妨 ...

这个代码太不完整了,我的能力有限,目前没有办法写入骑砍postFX.fx

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-4-7 22:44:32 | 显示全部楼层
apk43 发表于 2023-4-7 21:12
由于帖子限制,我改了后缀。
可以看看我根据Reshade插件Glamarye_Fast_Effects和_Sebastian_写的ssao代 ...

太强了!请问你是怎么把这个需要获取深度信息的fx成功移植进骑砍的postFX.fx的?我到现在只会移植一些如Tonemap、DPX的纯调色功能

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-4-7 22:45:11 | 显示全部楼层
本帖最后由 fengguoyehao 于 2023-4-7 22:46 编辑
apk43 发表于 2023-4-7 21:12
由于帖子限制,我改了后缀。
可以看看我根据Reshade插件Glamarye_Fast_Effects和_Sebastian_写的ssao代 ...

mb36.jpg mb35.jpg

甚至把原本postFX.fx高光位置过曝的问题解决了!

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-4-7 22:52:03 | 显示全部楼层
apk43 发表于 2023-4-7 21:12
由于帖子限制,我改了后缀。
可以看看我根据Reshade插件Glamarye_Fast_Effects和_Sebastian_写的ssao代 ...

发现了一个无关紧要的小问题,火光会变白,应该是数据调节问题: mb37.jpg

41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-4-7 23:11:18 | 显示全部楼层
apk43 发表于 2023-4-7 21:12
由于帖子限制,我改了后缀。
可以看看我根据Reshade插件Glamarye_Fast_Effects和_Sebastian_写的ssao代 ...

屏幕空间光线追踪全局光照:https://bbs.mountblade.com.cn/thread-2043687-1-1.html
去年我与这个帖子的作者聊过几句。作者说这个画面是通过Marty Mcfly's rt shader和MagicHDR(还有DPX),结合了天空盒子调节出来的。Marty Mcfly's rt shader应该是最好的“伪”光追了。这是包含了所有Marty Mcfly's rt shader版本的文件,麻烦一下,可以帮忙看一看有可能移植到postFX.fx里面吗? RTGI.zip (3.31 MB, 下载次数: 541)


41

主题

908

回帖

410

积分

骑士

Rank: 4Rank: 4

UID
3257703
第纳尔
3491
精华
0
互助
21
荣誉
2
贡献
10
魅力
177
注册时间
2021-8-1

骑砍中文站APP会员勋章

鲜花(89) 鸡蛋(0)
 楼主| 发表于 2023-4-7 23:33:05 | 显示全部楼层
本帖最后由 fengguoyehao 于 2023-4-7 23:38 编辑
apk43 发表于 2023-4-7 23:27
我用过RTGI,虽然效果很好,但是性能骤降。移植估计够呛,太过复杂

我有一个远景模糊的fx,一直想移植,但却一直没有成功,我一直无法获取深度信息。请问可以帮我看一下吗?麻烦了! LightDoF.zip (2.69 KB, 下载次数: 485)
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2025-9-11 03:46 , Processed in 0.109540 second(s), 22 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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