开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1963

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 877|回复: 2

[哪来的胖子] ShaderLab 替代渲染

[复制链接]  [移动端链接]
排名
1195
昨日变化
1

34

主题

105

帖子

1909

积分

Rank: 9Rank: 9Rank: 9

UID
35368
好友
19
蛮牛币
127
威望
0
注册时间
2014-7-20
在线时间
712 小时
最后登录
2017-11-17

专栏作家活力之星

QQ
发表于 2016-11-28 18:28:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 哪来的胖子 于 2016-12-5 21:28 编辑

内容说明:
    替代渲染的简单说明。
    可能使用的unity的生命周期相关知识,可在这里查看:http://www.unitybeginner.com/?p=350
    在最开始的课程中,我们讲了subshader的自定义标签是用来做替代渲染的。我们可以通过Camera的RenderWithShader 和 SetReplacementShader来进行替代渲染的操作。
1.1 RederWithShader渲染说明
    我们下看下RederWithShader的用法:
    Cam.RenderWithShader(useShader,replacebyTag);  
    01.jpg
    replacebyTag 是Key。
    Unity会对场景中的所有物体的材质查找其是否有replacebyTag标签,如果没有,则不渲染,如果有其值是否和useShader某一个SubShader相同,如果一样则用此SubShader替换。如果没有相同值也不渲染。我们在代码中使用一个为enable的相机来实现该功能。代码如下:

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
    public string replacebyTag = "MyTag";
    public Shader useShader;
    public RenderTexture rt;
    public Camera rtCam;
    public Material mat;

    void Start()
    {
        if (!rtCam)
        {
            GameObject g = new GameObject("render with Shader Cam");
            rtCam = g.AddComponent<Camera>();
            rtCam.renderingPath = RenderingPath.Forward;
            rtCam.enabled = false;
            rtCam.hideFlags = HideFlags.HideAndDontSave;
        }
        rt = new RenderTexture(Screen.width, Screen.height, 16, RenderTextureFormat.ARGB32);
    }

    void Update()
    {
        mat.SetTexture("_MainTex", rt);
    }

    void OnPreCull()
    {
        rtCam.CopyFrom(this.GetComponent<Camera>());
        rtCam.backgroundColor = new Color(0, 0, 0, 0);
        rtCam.targetTexture = rt;
        rtCam.RenderWithShader(useShader, replacebyTag);
        mat.SetTexture("_MainTex", rt);
    }
}

我们正常渲染的shader(有demo里面有三个,就是MyTag的值不一样):
[C#] 纯文本查看 复制代码
Shader "Custom/Demo001"
{
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _Color("Base Color of Object",color)=(1,1,1,1)
        }
        SubShader {
                Tags { "MyTag"="1"}
                LOD 200
                CGPROGRAM
                #pragma surface surf Lambert
                sampler2D _MainTex;
                float4 _Color;
                struct Input {
                        float2 uv_MainTex;
                };
                void surf (Input IN, inout SurfaceOutput o) {
                        half4 c = tex2D (_MainTex, IN.uv_MainTex);
                        o.Albedo = c.rgb*_Color.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
        } 
        FallBack Off
}


我么替代渲染需要使用的shader:
[C#] 纯文本查看 复制代码
Shader "Unlit/Test"
{
        SubShader {
                Tags { "MyTag"="1" }
                pass{
                        color(1,1,1,1)
                }
        }
}


我们看下结果:
02.jpg

我们可以把三个都渲染出来不,我们更该下我们的替代渲染的Shader:
[C#] 纯文本查看 复制代码
Shader "Unlit/Test"
{
        SubShader {
                Tags { "MyTag"="1" }
                pass{
                        color(1,0,0,1)
                }
        }
        SubShader {
                Tags { "MyTag"="2" }
                pass{
                        color(0,1,0,1)
                }
        }
        SubShader {
                Tags { "MyTag"="3" }
                pass{
                        color(0,0,1,1)
                }
        }
}


我们在看下:
03.jpg

在说明下属性,如果正常渲染的shader和替代渲染的shader有相同名字的属性,会被直接传递过来,同名原则。
    我们来更该下替代渲染的shader

[C#] 纯文本查看 复制代码
Shader "Unlit/PTest"
{
        Properties {
                _MainTex ("Base", 2D) = "white" {}
        }

        SubShader {
                Tags { "MyTag"="1" }
                pass{
                        SetTexture[_MainTex] { combine  texture }
                }
        }
        SubShader {
                Tags { "MyTag"="2" }
                pass{
                        SetTexture[_MainTex] { combine  texture }
                }
        }
        SubShader {
                Tags { "MyTag"="3" }
                pass{
                                SetTexture[_MainTex] { combine  texture }
                }
        }
}


我们来看下效果:
04.jpg

1.2 SetReplaceMentShader 和 ResetReplacementShader
    用法与RenderWithShader的方法异同,只不过回事相机的正常渲染使用此函数提供的Shader和标签来渲染。使用ResetReplacementShader可以会发渲染。
    我们来看下C#的代码:

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
public class SetReplacementShader : MonoBehaviour
{
    public Shader replaceShader;
    string btnStr = "SetReplacementShader";
    bool setRS = true;
    void OnGUI()
    {
        if (GUI.Button(new Rect(0,0,300,80), btnStr))
        {
            if (setRS)
            {
                GetComponent<Camera>().SetReplacementShader(replaceShader, "MyTag");
                setRS = false;
                btnStr = "ResetReplacementShader";
            }
            else
            {
                GetComponent<Camera>().ResetReplacementShader();
                setRS = true;
                btnStr = "SetReplacementShader";
            }
        }
    }
}


我们来看下效果:
05.jpg

06.jpg

项目下载地址 http://pan.baidu.com/s/1hrAjwtm
更多教程请访问 http://www.unitybeginner.com/





回复

使用道具 举报

5熟悉之中
999/1000
排名
2134
昨日变化
10

0

主题

249

帖子

999

积分

Rank: 5Rank: 5

UID
180505
好友
2
蛮牛币
739
威望
0
注册时间
2016-11-3
在线时间
220 小时
最后登录
2017-11-17
QQ
发表于 2016-11-29 21:57:37 | 显示全部楼层
一看 就知道很厉害

回复 支持 反对

使用道具 举报

4四处流浪
359/500
排名
11021
昨日变化
11

0

主题

200

帖子

359

积分

Rank: 4

UID
171023
好友
0
蛮牛币
119
威望
0
注册时间
2016-9-22
在线时间
95 小时
最后登录
2017-11-16
发表于 2017-6-17 17:11:31 | 显示全部楼层
学习,学习,感谢分享 !!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

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