Unity通过修改内置cg文件来自定义standard Shader

我为什么自定义Standard?

由于我要做一个屏幕泛光效果,需要存储一个alpha值到渲染图里面,然后bloom效果需要这张alpha图来进行亮度控制,standrd上面要一个变量控制

PS:我不喜欢用standrd Shader,因为变体多,我更偏向于美术要什么shader,我这边写出来,而不是用了一大堆standrd然后来补锅,很多东西不是我能决定,哈哈哈哈,好好补锅

 

使用的Unity版本2018.1.6f1

这个自定义Standard,我是添加一个Bloom变量来进行修改

 

1.首先要下载对应版本的内置Shader(直接去官网下)

2.Unity里面创建要用的文件夹

CgIncludes 用于放CG文件

Editor 用于放Standard自定义UI

Shader 用于放Shader

如下图

 

3.把Standrd Shader导入Unity

1.把内置shaderDefaultResourcesExtra目录下的Standard.shader复制到Unity里面Shader文件夹

2.把StandrdShader重命名,也把里面的Shader名字改改,如下图

 

4.把cg文件导入Unity

1.Standrd用到这些CG文件(除了粒子相关3个不要之外),其余复制到Unity CgIncludes 文件夹

2.修改Shader引用CG路径

凡是MyStandrd用到的上面StandrdCG文件,我们这边都要改一下引用路径

因为放到CgIncludes文件夹,所以我们要加../CgIncludes/

#include "../CgIncludes/UnityStandardCoreForward.cginc"

这是其中一处,继续向下看把相关的改改

3.修改CG之间的引用路径

在Unity里面打开导进来的CG文件,我以UnityStandardInput为例

#include "UnityCG.cginc"
#include "../CgIncludes/UnityStandardConfig.cginc"
#include "UnityPBSLighting.cginc" // TBD: remove
#include "../CgIncludes/UnityStandardUtils.cginc"

只改了我们导入CG那些文件路径,没有引用到的就不管,他们会自己读取原来的

4.导入Standrd材质球编辑界面脚本

找到下载的内置shader文件夹/Editor/StandardShaderGUI.cs这个就是Standrd Shader自定义UI

把这个脚本复制到Unity项目Editor目录StandardShaderGUI改成这个名字MyStandardShaderGUI

对应类名改一下也改成MyStandardShaderGUI

修改如下

5.改完之后发现各种报错

主要把EditorGUIUtility.TrTextContent改成new GUIContent

如下图

6.把之前改的MyStandrd里面用到的UI脚本换成MyStandardShaderGUI(如下图)

 

到这里前期工作基本完成

下面是添加属性

需要改动的文件

MyStandard.shader 声明变量

UnityStandardInput.cginc 输入里面声明变量

UnityStandardCore.cginc 主要计算输出

MyStandardShaderGUI.cs 材质球窗口画对应的变量

 

1.在shader声明变量

 

2.在UnityStandardInput声明要用的变量(这个变量和上面的变量名一样)

3.在UnityStandardCore主要计算地方添加alpha存储

4.在MyStandardShaderGUI脚本上加上对应的变量UI

在style里面声明一个bloom

5.然后声明一个MaterialProperty 类型的bloom变量

6.在FindProperties方法里面加入

7.在ShaderPropertiesGUI绘制方法里面加

8.看看用到这个shader的材质球发现多了一个属性

 

最后测试一下Alpha通道是否存起来

渲染同个东西得出来的rendertexture的alpha通道不一样

没改之前的alpha通道图

改了之后的alpha通道图

经过手机测试shader没问题

项目下载地址

链接:https://pan.baidu.com/s/1KkR5tu8cv9p128YMdKqZsw 
提取码:m2st 
 

 

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity的火焰shader可以通过多种方式实现,下面是其中一种实现方式: 1. 创建一个新的材质,并将其shader设置为“Standard”或“Standard (Specular Setup)”。 2. 在材质的属性面板中添加一个新的纹理,用于表示火焰形状的alpha通道。这个纹理可以是一个黑色背景,中心区域是白色火焰形状的灰度图像。 3. 添加一个新的颜色属性,用于定义火焰的颜色。 4. 在shader中添加以下代码: ``` Shader "Custom/Flame" { Properties { _MainTex ("Flame Texture", 2D) = "white" {} _Color ("Flame Color", Color) = (1,1,1,1) _Speed ("Speed", Range(0, 10)) = 1 _Intensity ("Intensity", Range(0, 5)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} LOD 200 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _Color; float _Speed; float _Intensity; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } half4 frag (v2f i) : SV_Target { half4 texColor = tex2D(_MainTex, i.uv); float alpha = texColor.a; float t = _Time.y * _Speed; float sinx = sin(i.uv.x * 20 + t); float siny = sin(i.uv.y * 20 + t + 0.5); float noise = sin(sinx + siny) * 0.5 + 0.5; float intensity = pow(noise, _Intensity); return alpha * _Color * intensity; } ENDCG } } FallBack "Diffuse" } ``` 5. 将这个shader拖到材质中,并将火焰纹理拖到“MainTex”属性中。 6. 调整属性面板中的“Color”、“Speed”和“Intensity”属性,直到得到满意的火焰效果。 这个shader使用了alpha通道纹理来定义火焰形状,并且根据时间和噪声函数来产生火焰动态效果。你可以根据自己的需求和创意来调整shader代码和属性面板中的属性,以得到更加逼真和有趣的火焰效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值