骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 11702|回复: 21

[功能与代码] 【战团】闪电枪?闪电枪!会闪,会动的着色器效果 及讲解

[复制链接]

31

主题

210

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1587
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(58) 鸡蛋(0)
发表于 2024-5-15 01:48:24 | 显示全部楼层 |阅读模式
本帖最后由 战争傀儡阿格兰 于 2024-5-15 02:00 编辑

代码环境1.171
【战团】阿格兰魔球修改器——合集https://bbs.mountblade.com.cn/thread-2097734-1-1.html

很久没发帖子了。一方面是我觉得要修改的地方已经改完了。另一方面是最近沉迷研究着色器语言HLSL。

代码实际效果:
投掷武器,效果见视频


注:闪电是着色器效果,采用拿破仑着色器作为底子。一方面是开源,另一方面是因为兼容性高。这个着色器的缺点,是火把等光源,没有照亮功能。如果你的mod,有除了postfx.fx以外任何fx、fxo这种带fx字样的文件,那都是冲突的。即,只和postfx.fx共存。

代码使用方式:解压缩,然后魔球“工具-物品导入向导”。再之后mb.fx文件,复制到mod根文件夹,就是main.bmp所在的文件夹。
注:替换投掷石子动作为投掷标枪,如果魔球导入后,动作替换失败,在module.ini文件把“load_mod_resource = lightningspear”剪切到第一行复制



游客,如果您要查看本帖隐藏内容请回复


——————————以下是源码——————————

●这次没有ms码了,是着色器HLSL语言中的代码了。

讲下骑马与砍杀战团的着色器的【实战经验】
333.png
第一讲【文件组成】
      除了特殊的postfx.fx文件,其余文件就这么多。就是这么几个简单的文件,不要学霸王奉先“可编程渲染管线shader编程基础环境搭建”,堆叠名词,网上东抄西抄,半点shader都没写出来,啥也不懂就在那里装x,没有可操作性,更加不可能带来实际效果。

第二讲【mb.fx及其源码】
     mb_source.fx是源码,使用HLSL语言。根据专业人士@zz010606的研究,跟C语言类似。使用bat文件后,编译出来的mb.fx文件就是着色器文件了。mb.fx和mb_a,mb_b等各种都是同一个东西,通过优化bat文件,整合后只需出一个,编译后的fx文件。

    注:该步骤没有反编译的可能性。删除源码就能保留技术了。


第三讲【postfx.fx及其特点】
      另外有个postfx.fx文件,这次我没提供。各大mod都有这个,我提供了反而冲突了。这个是也是着色器的一部分,和上述mb.fx的区别是:1、postfx.fx可以直接编辑,无需编译。2、骑砍MS代码中的set_shader_param_int ,set_shader_param_float,set_shader_param_float4,set_shader_param_float4x4 这四个代码,只能发送到mb.fx,不能发送到postfx.fx。

    注:直接在mb.fx里定义好"float aaa = 0.0f;"后,在MS里使用(set_shader_param_float, "@aaa", -2),就能传递过去,实时变化。这就是很多mod,汉化后,着色器失效的原因。汉化后,传递过去的就是中文了,mb.fx就不认识了。

第四讲【实战】
      什么?你问中间的步骤呢?参考m大(弃坑)、九章(弃坑且忘光)、@武安apk43(活跃中)等人的教学贴。我这里都是对他们的补充,实战后的补充。
      想要入门着色器的改编,最重要的就是看懂结构,去抄,去改。如果你是空降过来的HLSL大佬,你肯定就是自己写了。比方我的代码, VertexShader = vs_font_compiled_2_0这个是任何着色器都会有的部分,我就没动。我增加了PS部分,并在定义“技术”(technique lightning_12345)的时候,引用了我新增的技术。
      我选择这一段,是告诉各位,brf里贴图槽12345,并不是固定好了高光就是高光,法线就是法线。这是我新手时期最大的困惑。理解了这一点,才能更好入门。
      WSE2虽然让你加了个什么代码兼容,但是实际上会影响你着色器效果,属于流氓干涉行为。个人建议想要搞好着色器,就不要碰WSE2。
      看不懂的地方,找ai问。因为和C语言类似,所以ai识别率较高。
      如果你想问有没有函数表?不好意思,没人整理,只能靠猜。比方rand系列这种生成随机数的函数,不好意思,hlsl不支持。随机数的话,我是ms生成随机数后,发送给mb.fx。变相解决。



找到PS_OUTPUT ps_no_shading_no_alpha这句及紧跟的大括号,找到大括号结尾,另起一行:
//agland
PS_OUTPUT ps_lightning_1(VS_OUTPUT_FONT_X In)
{
        PS_OUTPUT Output;

    float offsetX = 1.25;
    float offsetY = 4.5;
    float slideTime = time_var * 19.3;
        
    float mix1 = clamp(exp(2.0 * sin(slideTime)) - offsetY, 0.0 , 1.0);

    float mix2 = clamp(exp(2.0 * sin(slideTime - offsetX)) - offsetY, 0.0 , 1.0);
   
    float mix3 = clamp(exp(2.0 * sin(slideTime - offsetX * 2.0)) - offsetY, 0.0 , 1.0);
   
    float mix4 = clamp(exp(2.0 * sin(slideTime - offsetX* 3.0)) - offsetY, 0.0 , 1.0);

    float mix5 = clamp(exp(2.0 * sin(slideTime - offsetX* 4.0)) - offsetY, 0.0 , 1.0);
        
        float4 tex_col = tex2D(MeshTextureSampler, In.Tex0)* mix1;
        float4 tex_col2 = tex2D(Diffuse2Sampler, In.Tex0)* mix2;
        float4 tex_col3 = tex2D(NormalTextureSampler, In.Tex0)* mix3;
        float4 tex_col4 = tex2D(EnvTextureSampler, In.Tex0)* mix4;
        //float4 tex_col4 = tex2D(Diffuse2Sampler, In.Tex0)* mix4;
        float4 tex_col5 = tex2D(SpecularTextureSampler, In.Tex0)* mix5;        

        tex_col = tex_col + tex_col2 + tex_col3 + tex_col4 + tex_col5;        

        INPUT_TEX_GAMMA(tex_col.rgb);
        Output.RGBColor =  In.Color * tex_col;
        OUTPUT_GAMMA(Output.RGBColor.rgb);
        return Output;
}
PS_OUTPUT ps_lightning_2(VS_OUTPUT_FONT_X In)
{
        PS_OUTPUT Output;

    float offsetX = 1.25;
    float offsetY = 4.5;
        
    float slideTime = time_var * 18.1;
        
    float mix1 = clamp(exp(2.0 * sin(slideTime)) - offsetY, 0.0 , 1.0);

    float mix2 = clamp(exp(2.0 * sin(slideTime - offsetX)) - offsetY, 0.0 , 1.0);
   
    float mix3 = clamp(exp(2.0 * sin(slideTime - offsetX * 2.0)) - offsetY, 0.0 , 1.0);
   
    float mix4 = clamp(exp(2.0 * sin(slideTime - offsetX* 3.0)) - offsetY, 0.0 , 1.0);

    float mix5 = clamp(exp(2.0 * sin(slideTime - offsetX* 4.0)) - offsetY, 0.0 , 1.0);
        
        float4 tex_col = tex2D(MeshTextureSampler, In.Tex0)* mix1;
        float4 tex_col2 = tex2D(Diffuse2Sampler, In.Tex0)* mix2;
        float4 tex_col3 = tex2D(NormalTextureSampler, In.Tex0)* mix3;
        float4 tex_col4 = tex2D(EnvTextureSampler, In.Tex0)* mix4;
        //float4 tex_col4 = tex2D(Diffuse2Sampler, In.Tex0)* mix4;
        float4 tex_col5 = tex2D(SpecularTextureSampler, In.Tex0)* mix5;        

        tex_col = tex_col + tex_col2 + tex_col3 + tex_col4 + tex_col5;        

        INPUT_TEX_GAMMA(tex_col.rgb);
        Output.RGBColor =  In.Color * tex_col;
        OUTPUT_GAMMA(Output.RGBColor.rgb);
        return Output;
}PS_OUTPUT ps_lightning_3(VS_OUTPUT_FONT_X In)
{
        PS_OUTPUT Output;

    float offsetX = 1.25;
    float offsetY = 4.5;
    float slideTime = time_var * 20.2;
        
    float mix1 = clamp(exp(2.0 * sin(slideTime)) - offsetY, 0.0 , 1.0);

    float mix2 = clamp(exp(2.0 * sin(slideTime - offsetX)) - offsetY, 0.0 , 1.0);
   
    float mix3 = clamp(exp(2.0 * sin(slideTime - offsetX * 2.0)) - offsetY, 0.0 , 1.0);
   
    float mix4 = clamp(exp(2.0 * sin(slideTime - offsetX* 3.0)) - offsetY, 0.0 , 1.0);

    float mix5 = clamp(exp(2.0 * sin(slideTime - offsetX* 4.0)) - offsetY, 0.0 , 1.0);
        
        float4 tex_col = tex2D(MeshTextureSampler, In.Tex0)* mix1;
        float4 tex_col2 = tex2D(Diffuse2Sampler, In.Tex0)* mix2;
        float4 tex_col3 = tex2D(NormalTextureSampler, In.Tex0)* mix3;
        float4 tex_col4 = tex2D(EnvTextureSampler, In.Tex0)* mix4;
        //float4 tex_col4 = tex2D(Diffuse2Sampler, In.Tex0)* mix4;
        float4 tex_col5 = tex2D(SpecularTextureSampler, In.Tex0)* mix5;        

        tex_col = tex_col + tex_col2 + tex_col3 + tex_col4 + tex_col5;        

        INPUT_TEX_GAMMA(tex_col.rgb);
        Output.RGBColor =  In.Color * tex_col;
        OUTPUT_GAMMA(Output.RGBColor.rgb);
        return Output;
}PS_OUTPUT ps_lightning_4(VS_OUTPUT_FONT_X In)
{
        PS_OUTPUT Output;

    float offsetX = 1.25;
    float offsetY = 4.5;
    float slideTime = time_var * 14.9;
        
    float mix1 = clamp(exp(2.0 * sin(slideTime)) - offsetY, 0.0 , 1.0);

    float mix2 = clamp(exp(2.0 * sin(slideTime - offsetX)) - offsetY, 0.0 , 1.0);
   
    float mix3 = clamp(exp(2.0 * sin(slideTime - offsetX * 2.0)) - offsetY, 0.0 , 1.0);
   
    float mix4 = clamp(exp(2.0 * sin(slideTime - offsetX* 3.0)) - offsetY, 0.0 , 1.0);

    float mix5 = clamp(exp(2.0 * sin(slideTime - offsetX* 4.0)) - offsetY, 0.0 , 1.0);
        
        float4 tex_col = tex2D(MeshTextureSampler, In.Tex0)* mix1;
        float4 tex_col2 = tex2D(Diffuse2Sampler, In.Tex0)* mix2;
        float4 tex_col3 = tex2D(NormalTextureSampler, In.Tex0)* mix3;
        //float4 tex_col4 = tex2D(EnvTextureSampler, In.Tex0)* mix4;
        float4 tex_col4 = tex2D(Diffuse2Sampler, In.Tex0)* mix4;
        float4 tex_col5 = tex2D(SpecularTextureSampler, In.Tex0)* mix5;        

        tex_col = tex_col + tex_col2 + tex_col3 + tex_col4 + tex_col5;        

        INPUT_TEX_GAMMA(tex_col.rgb);
        Output.RGBColor =  In.Color * tex_col;
        OUTPUT_GAMMA(Output.RGBColor.rgb);
        return Output;
}PS_OUTPUT ps_lightning_5(VS_OUTPUT_FONT_X In)
{
        PS_OUTPUT Output;

    float offsetX = 1.25;
    float offsetY = 4.5;
    float slideTime = time_var * 15.4;
        
    float mix1 = clamp(exp(2.0 * sin(slideTime)) - offsetY, 0.0 , 1.0);

    float mix2 = clamp(exp(2.0 * sin(slideTime - offsetX)) - offsetY, 0.0 , 1.0);
   
    float mix3 = clamp(exp(2.0 * sin(slideTime - offsetX * 2.0)) - offsetY, 0.0 , 1.0);
   
    float mix4 = clamp(exp(2.0 * sin(slideTime - offsetX* 3.0)) - offsetY, 0.0 , 1.0);

    float mix5 = clamp(exp(2.0 * sin(slideTime - offsetX* 4.0)) - offsetY, 0.0 , 1.0);
        
        float4 tex_col = tex2D(MeshTextureSampler, In.Tex0)* mix1;
        float4 tex_col2 = tex2D(Diffuse2Sampler, In.Tex0)* mix2;
        float4 tex_col3 = tex2D(NormalTextureSampler, In.Tex0)* mix3;
        //float4 tex_col4 = tex2D(EnvTextureSampler, In.Tex0)* mix4;
        float4 tex_col4 = tex2D(Diffuse2Sampler, In.Tex0)* mix4;
        float4 tex_col5 = tex2D(SpecularTextureSampler, In.Tex0)* mix5;        

        tex_col = tex_col + tex_col2 + tex_col3 + tex_col4 + tex_col5;        

        INPUT_TEX_GAMMA(tex_col.rgb);
        Output.RGBColor =  In.Color * tex_col;
        OUTPUT_GAMMA(Output.RGBColor.rgb);
        return Output;
}

technique lightning_1
{
        pass P0
        {
                VertexShader = vs_font_compiled_2_0;
                PixelShader = compile ps_2_0 ps_lightning_1();
        }
}
technique lightning_2
{
        pass P0
        {
                VertexShader = vs_font_compiled_2_0;
                PixelShader = compile ps_2_0 ps_lightning_2();
        }
}
technique lightning_3
{
        pass P0
        {
                VertexShader = vs_font_compiled_2_0;
                PixelShader = compile ps_2_0 ps_lightning_3();
        }
}
technique lightning_4
{
        pass P0
        {
                VertexShader = vs_font_compiled_2_0;
                PixelShader = compile ps_2_0 ps_lightning_4();
        }
}
technique lightning_5
{
        pass P0
        {
                VertexShader = vs_font_compiled_2_0;
                PixelShader = compile ps_2_0 ps_lightning_5();
        }
}

//agland



评分

参与人数 2第纳尔 +40 互助 +3 魅力 +30 收起 理由
幼稚园殺手 + 20 + 2 + 10 您的帖子很有价值!
Aomine Daiki + 20 + 1 + 20 您的帖子很有价值!

查看全部评分

鲜花鸡蛋

ggfgfgf  在2024-5-18 13:56  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
ggfgfgf  在2024-5-18 13:56  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
幼稚园殺手  在2024-5-18 13:34  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
幼稚园殺手  在2024-5-18 13:34  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
huagao  在2024-5-15 19:27  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
路过的罗格  在2024-5-15 13:35  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
815208129  在2024-5-15 13:06  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
815208129  在2024-5-15 13:06  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
815208129  在2024-5-15 13:06  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
815208129  在2024-5-15 13:06  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下

17

主题

633

回帖

345

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2385
精华
0
互助
30
荣誉
0
贡献
0
魅力
74
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(55) 鸡蛋(0)
发表于 2024-5-15 12:29:24 来自手机 | 显示全部楼层
给劲       来自: Android客户端

23

主题

339

回帖

299

积分

见习骑士

Rank: 3

UID
3189500
第纳尔
2709
精华
0
互助
26
荣誉
6
贡献
20
魅力
437
注册时间
2020-6-13
鲜花(68) 鸡蛋(0)
发表于 2024-5-15 18:18:45 来自手机 | 显示全部楼层
可以啊阿格兰,期待更多骚操作来自: Android客户端

3

主题

148

回帖

125

积分

见习骑士

Rank: 3

UID
3500189
第纳尔
830
精华
0
互助
14
荣誉
1
贡献
10
魅力
235
注册时间
2023-3-30
鲜花(50) 鸡蛋(0)
发表于 2024-5-15 18:44:55 | 显示全部楼层
WSE2属于流氓干涉行为,我十分赞同这句话。

4

主题

18

回帖

7

积分

平民

Rank: 1

UID
3559852
第纳尔
10
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2023-9-9
鲜花(0) 鸡蛋(0)
发表于 2024-5-16 10:34:19 来自手机 | 显示全部楼层
这个效果很帅!!!!来自: iPhone客户端

1

主题

25

回帖

8

积分

平民

Rank: 1

UID
3284052
第纳尔
467
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2021-11-3

骑砍中文站APP会员勋章

鲜花(10) 鸡蛋(0)
发表于 2024-5-16 12:51:35 来自手机 | 显示全部楼层
很棒,学习了来自: Android客户端

46

主题

628

回帖

492

积分

骑士

Rank: 4Rank: 4

UID
3398051
第纳尔
1845
精华
0
互助
48
荣誉
5
贡献
10
魅力
341
注册时间
2022-8-13
鲜花(57) 鸡蛋(0)
发表于 2024-6-30 15:42:05 | 显示全部楼层
研究下

9

主题

52

回帖

93

积分

男爵[见习版主]

Rank: 6Rank: 6

UID
3588356
第纳尔
651
精华
0
互助
15
荣誉
0
贡献
25
魅力
70
注册时间
2023-12-7
鲜花(16) 鸡蛋(0)
发表于 2024-7-1 13:20:37 | 显示全部楼层
好厉害

0

主题

9

回帖

3

积分

平民

Rank: 1

UID
92176
第纳尔
69
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2008-9-16
鲜花(0) 鸡蛋(0)
发表于 2024-7-3 03:20:03 | 显示全部楼层
.                                                                      。

0

主题

61

回帖

23

积分

随仆

Rank: 1

UID
3110714
第纳尔
429
精华
0
互助
1
荣誉
0
贡献
0
魅力
1
注册时间
2019-10-8
鲜花(7) 鸡蛋(0)
发表于 2024-7-5 10:36:50 | 显示全部楼层
鱼和熊掌不可兼得的问题太难受了,很多东西都因为优化而被迫放弃了,什么时候T社能来个砍一重置HD?

1

主题

12

回帖

4

积分

平民

Rank: 1

UID
3016597
第纳尔
69
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2018-7-24
鲜花(0) 鸡蛋(0)
发表于 2024-7-9 10:32:02 | 显示全部楼层
66666666666666666666呀

0

主题

3

回帖

6

积分

平民

Rank: 1

UID
3231208
第纳尔
2
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2021-4-7
鲜花(0) 鸡蛋(0)
发表于 2024-7-13 18:01:02 | 显示全部楼层
66666666666

3

主题

31

回帖

40

积分

扈从

Rank: 2Rank: 2

UID
1643873
第纳尔
1272
精华
0
互助
4
荣誉
1
贡献
0
魅力
31
注册时间
2013-11-2

霸主正版勋章骑士精神之文韬勋章

鲜花(24) 鸡蛋(0)
发表于 2024-7-20 12:11:10 | 显示全部楼层
感谢,刚好在mod里想制作阳光之枪和闪电箭

46

主题

628

回帖

492

积分

骑士

Rank: 4Rank: 4

UID
3398051
第纳尔
1845
精华
0
互助
48
荣誉
5
贡献
10
魅力
341
注册时间
2022-8-13
鲜花(57) 鸡蛋(0)
发表于 2024-7-30 19:50:29 | 显示全部楼层
本帖最后由 ggfgfgf 于 2024-7-30 19:51 编辑

关于随机数我说一句,float random = frac(sin(vWorldPos.x * vWorldPos.y) * 10000.0f); // 生成随机数  frac函数,根据精度,这是一个伪随机

8

主题

204

回帖

64

积分

扈从

Rank: 2Rank: 2

UID
1178658
第纳尔
1170
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2013-1-27

骑砍中文站APP会员勋章原版正版勋章战团正版勋章维京征服正版勋章有生之年勋章

鲜花(4) 鸡蛋(0)
发表于 2024-8-15 21:34:33 来自手机 | 显示全部楼层
大佬发的每个贴都是精品啊一个一个赞过来来自: Android客户端

8

主题

57

回帖

20

积分

随仆

Rank: 1

UID
3093752
第纳尔
681
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2019-8-6
鲜花(3) 鸡蛋(0)
发表于 2024-8-20 14:25:26 | 显示全部楼层
66666666666666666666666

31

主题

915

回帖

2414

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2755938
第纳尔
6208
精华
11
互助
12
荣誉
97
贡献
85
魅力
242
注册时间
2016-7-5

骑砍中文站APP会员勋章

鲜花(236) 鸡蛋(0)
发表于 2024-9-10 15:49:04 | 显示全部楼层
好分享,研究的很细致!

0

主题

25

回帖

8

积分

平民

Rank: 1

UID
3696271
第纳尔
0
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2024-9-14
鲜花(0) 鸡蛋(0)
发表于 2024-9-28 14:14:24 | 显示全部楼层
这是好东西,留言支持下

2

主题

35

回帖

11

积分

随仆

Rank: 1

UID
3476600
第纳尔
120
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2023-1-18
鲜花(0) 鸡蛋(0)
发表于 2024-10-19 17:04:26 来自手机 | 显示全部楼层
66666666666666666666来自: Android客户端

2

主题

20

回帖

7

积分

平民

Rank: 1

UID
3689471
第纳尔
0
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2024-8-18
鲜花(0) 鸡蛋(0)
发表于 2024-10-29 19:28:01 来自手机 | 显示全部楼层
1111111111111111来自: Android客户端

1

主题

7

回帖

2

积分

平民

Rank: 1

UID
3683508
第纳尔
0
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2024-8-1
鲜花(0) 鸡蛋(0)
发表于 2024-11-27 11:40:12 来自手机 | 显示全部楼层
大佬怎么不更了,真的非常有帮助来自: Android客户端

10

主题

64

回帖

32

积分

扈从

Rank: 2Rank: 2

UID
3476407
第纳尔
29
精华
0
互助
2
荣誉
0
贡献
0
魅力
0
注册时间
2023-1-17
鲜花(5) 鸡蛋(0)
发表于 2024-12-5 15:35:37 | 显示全部楼层
好教程
期待.
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-12-26 22:01 , Processed in 0.166643 second(s), 61 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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