unity3d shader 自定义光照函数

希望实现一个根据摄像机朝向与网格法向关系控制光照亮度的双面shader。

代码如下

Shader "Custom/UnlitOP" {
    Properties{
        _Color("Main Color", Color) = (1,1,1,1)                  //渲染需要外部设置的颜色
        _MainTex("Base (RGB)", 2D) = "white" {}                  //材质
        _CamDir("Camera Dirction",Vector) = (0.1,0.2,0.3,0.4)          //摄像机的朝向

    }
        SubShader{
        Tags{ "RenderType" = "Opaque" "Queue" = "Geometry"}
        ZWrite On  
        LOD 200
        Cull Off            //双面shader
        CGPROGRAM
#pragma surface surf myLightModel    //用了自定义的光照模型

    sampler2D _MainTex;          
    float4 _Color;
    float4 _CamDir;            //摄像机朝向变量
    //命名规则:Lighting接#pragma suface之后起的名字
    //lightDir :点到光源的单位向量   viewDir:点到摄像机的单位向量   atten:衰减系数
    float4 LightingmyLightModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten)
    {
        float4 c;
        float3 cr;
        cr = _CamDir.xyz;

        float diffuseF = max(0, abs(dot(s.Normal, cr)/2.0));    //由于是双面shader,所以正反面的颜色应该一样,否则会不同,/2是让dot结果在0-1之间。

        c.rgb = s.Albedo*_LightColor0.rgb*(diffuseF);        //_LightColor0是内置的属性,应该跟当前光照有关。
        c.a = s.Alpha;
        return c;
    }

    struct Input {
        float2 uv_MainTex;
        float4 _Color;
    };

    void surf(Input IN, inout SurfaceOutput o) {
        //half4 c = tex2D(_MainTex, IN.uv_MainTex)*_Color;
        o.Albedo = _Color.rgb;
        o.Alpha = _Color.a;
    }
    ENDCG
    }
        FallBack "Diffuse"
}

下面是有透明效果的版本,基本一样,就是要注意Tags的写法,以及关闭ZWrite,开启Ztest,使用Blend。另外在调试中发生了一点意外,完全一样的代码,开始时始终透明物体被渲在了所有不透明物体后面,怎么改代码都没用,后来将材质的shader都改成standard试试好用,再改回来就正常了。这点事弄了半下午......

Shader "Custom/UnlitTR" {
    Properties{
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Base (RGB)", 2D) = "white" {}
    _CamDir("Camera Dirction",Vector) = (0.1,0.2,0.3,0.4)

    }
        SubShader{
        Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
        ZWrite Off
        ZTest On
        LOD 200
        Blend SrcAlpha OneMinusSrcAlpha
        CGPROGRAM
#pragma surface surf myLightModel alpha  

    sampler2D _MainTex;
    float4 _Color;
    float4 _CamDir;

    //命名规则:Lighting接#pragma suface之后起的名字
    //lightDir :点到光源的单位向量   viewDir:点到摄像机的单位向量   atten:衰减系数
    float4 LightingmyLightModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten)
    {

        float4 c;
        float3 cr;
        cr = _CamDir.xyz;
        float diffuseF = max(0, abs(dot(s.Normal, cr) / 2.0));
        c.rgb = s.Albedo*_LightColor0.rgb*(diffuseF);
        c.a = s.Alpha;
        return c;
    }

    struct Input {
        float2 uv_MainTex;
        float4 _Color;
    };

    void surf(Input IN, inout SurfaceOutput o) {
        //half4 c = tex2D(_MainTex, IN.uv_MainTex)*_Color;
        o.Albedo = _Color.rgb;
        o.Alpha = _Color.a;
    }
    ENDCG
    }
        FallBack "Diffuse"
}
时间: 2024-10-13 12:46:11

unity3d shader 自定义光照函数的相关文章

【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 文章开头,先给自己诚求个游戏研发实习的好去处. 浅墨今年1月.明年上半年有近半年的空暇时间可供实习. 近5年游戏编程经验,能够胜任全职的游戏开发工作.仅仅拿实习生的工资(性价比非常高有

SurfaceShader自定义光照

[SurfaceShader自定义光照] 1.在pragma中添加自定义光照函数名:  #pragma surface surf BasicDiffuse 2.实现自定义光照函数.下面就是Lambert光照模型. _LightColor0是Unity提供的变量. 3.有3种类型的光照函数可以选择: 1) 2) 3)  

【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)——自定义光照模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=183 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的自定义光照模式的写法. 上篇文章中我们已经说到,表面着色器将分为两次讲解,上

【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本篇文章中,我们学习了Unity Shader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照.材质与颜色的具体写法.写了6个Shader作为本文S

[小明学Shader]4.自定义光照----RampTexture

上一篇讲了自定义光照的HalfLambert,这一次和它有些类似,但是计算的时候,不再用方向和atten相乘了. 将光入射方向与法相的点乘积HalfLam作为坐标,找到RampTexture中(HalfLam,HalfLam)点的rgb值作为混合值与s.的Albedo和入射光颜色相乘. 代码如下: Shader"Custom/11.26/2"{ Properties{ _RampTex("Ramp Texture",2D)="white"{} _

【浅墨Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)&屏幕水幕特效的实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/49556461 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1 概要:本文主要介绍了Unity5中的标准着色器,并且也涉及到了基于物理的着色.延迟渲染等高级着色技术,而在文章后半部分,也对屏幕水幕特效的实现方法进行了讲解与分析. 依然是附上

【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/41175585 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本文介绍了Unity中子着色器.通道和标签相关的详细概念与写法,以及纹理的设置方法,基本的纹理混合写法,写了5个Shader作为本文Shader讲解的实战内容,最后创建了一个梦幻的光之

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

【浅墨Unity3D Shader编程】之十 深入理解Unity5中的Standard Shader(二)&屏幕油画特效的实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/49719247 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1 概要:本文讲解了Unity中着色器编译多样化的思路,并对Standard Shader中正向基础渲染通道的源码进行了分析,以及对屏幕油画特效进行了实现. 众所周知,Unity官