shader之——单光源漫反射

Shader "Unlit/long"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
//Always: 总是渲染;没有光照模式。
//ForwardBase: 适用于前渲染、环境、主要方向灯、光/sh光和烘焙图。
//ForwardAdd: 适用于前渲染, 叠加每一盏灯,每一盏灯就多一个pass。
//Deferred: 延迟渲染,渲染g缓冲区 。
//ShadowCaster:将物体深度渲染到阴影贴图或者深度纹理上 。
//PrepassBase: 用于传统的延迟光照,渲染法线和高光效果。
//PrepassFinal:用于传统的延迟光照,通过结合文理、灯光、和法线来渲染最终的结果。
//Vertex:当对象不是光映射时,用于遗留顶点的渲染,所有顶点灯都被利用。
//VertexLMRGBM: 当对象被光映射时,在遗留的顶点上使用渲染,在LightMap是RGBM编码的平台上(pc和控制台)。
//VertexLM: 当对象被光映射时,在遗留的顶点上使用渲染,在LightMap是双idr编码的(移动平台)平台上。
            Tags { "RenderType"="Opaque" "LightMode" = "ForwardBase"}/////
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            //fwdadd:ForwardBase显示阴影; 必须结合fall back,两者缺一不可
            #pragma multi_compile_fwdadd_fullshadows/////
             //衰减以及阴影的实现
            #include "AutoLight.cginc"/////

            sampler2D _MainTex;
            float4 _MainTex_ST;
            //定义一个灯光,名字为固定格式,会自动取场景中灯光
            float4 _LightColor0;/////

            struct appdata
            {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                    float4 normal:NORMAL;/////
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos: SV_POSITION;
                float3 normal :TEXCOORD1;/////
                LIGHTING_COORDS(3,4) ///// #include "AutoLight.cginc"
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos= UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.normal = v.normal;/////
                TRANSFER_VERTEX_TO_FRAGMENT(o) ///// #include "AutoLight.cginc"
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //物体法向量转化为世界法向量
                float3 N = normalize(UnityObjectToWorldNormal(i.normal));
                //世界光向量:unity封装好的光向量,会自动调用场景里面的存在的灯光
                float3 L = normalize(_WorldSpaceLightPos0.xyz);/////
                float atten = LIGHT_ATTENUATION(i); ///// #include "AutoLight.cginc"
                fixed4 col = tex2D(_MainTex, i.uv);
                //最终颜色 = 主颜色 x (灯光颜色 x 漫反射系数x衰减系数  + 环境光)
                col.rgb = col.rgb *( _LightColor0.rgb * saturate(dot(N,L)) *atten + UNITY_LIGHTMODEL_AMBIENT);/////
                return col;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

时间: 2024-10-14 12:05:05

shader之——单光源漫反射的相关文章

shader之——多光源漫反射以及阴影

Shader "Unlit/MulLight" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { //一盏主灯 Pass { //Always: 总是渲染:没有光照模式. //ForwardBase: 适用于前渲染.环境.主要方向灯.光/sh光和烘焙图. //ForwardAdd: 适用于前渲染, 叠加每一盏灯,每一盏灯就多一个pass. //Deferred:

解读Unity中的CG编写Shader系列八(多光源漫反射)

转自http://www.itnose.net/detail/6117338.html 前文中完成最简单的漫反射shader只是单个光源下的漫反射,而往往场景中不仅仅只有一个光源,那么多个光源的情况下我们的物体表面的漫反射强度如何叠加在一起呢?前文打的tag "LightMode"="ForwardBase"又是什么意思呢? Unity内置的DiffuseShader,也就是我们创建一个Material出来时默认的Shader也是多光源的,所以这篇文章完成的shad

解读Unity中的CG编写Shader系列8——多光源漫反射

前文中完成最简单的漫反射shader只是单个光源下的漫反射,而往往场景中不仅仅只有一个光源,那么多个光源的情况下我们的物体表面的漫反射强度如何叠加在一起呢?前文打的tag "LightMode"="ForwardBase"又是什么意思呢? Unity内置的DiffuseShader,也就是我们创建一个Material出来时默认的Shader也是多光源的,所以这篇文章完成的shader与默认的diffuse shader基本效果一致. 首先引入几个概念 渲染路径 Re

解读Unity中的CG编写Shader系列6——漫反射

如果前面几个系列文章的内容过于冗长缺乏趣味着实见谅,由于时间原因前面的混合部分还没有写完,等以后再补充,现在开始关于反射的内容了. 折射与反射 在物理世界中,光的反射与折射往往是同时存在的,光源由真空或者空气中射入一种材料,光在进入这种材料的同时就发生了折射,折射的程度与各个介质的折射率有关,使光的传播路线偏离原来的路线: 继而如果光在通过不同传播介质的表面时,会像乒乓球一样弹回来,我们人眼能够看到东西,都是因为东西会反射光源,如果一种物质无法反射光,或者没有光源,我们就看不到东西.同样对于不同

【Shader拓展】Illustrative Rendering in Team Fortress 2

写在前面 早在使用ramp texture控制diffuse光照一文就提到了这篇著名的论文.Valve公司发表的其它成果可见这里.这是Valve在2007年发表的一篇非常具有影响力的文章,我的导师也提到过这篇,既然这么有名.我就去拜读了下,结果真是读到头大啊啊啊啊!事实上半年前就读了这篇文章.差一点读完.后来一比赛一考试一放假就没完毕,对自己非常愧疚. ..时隔这么久希望能把之前的理解整理出来,顺便看看能不能有很多其它收获.(又要读一遍E文!) 这篇博客在翻译这篇论文的基础上.会在Unity S

解读Unity中的CG编写Shader系列9——镜面反射

讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知识,加深理解镜面反射与漫反射的区别. 引用一下一位前人博文中的一些基础概念,特别是关于冯氏反射模型的: 平行光(directional light) 一种是从特定方向射入并只会照亮面对入射方向的物体,我们称之为平行光(directional light). 环境光(ambient light) 另一种光是来自所有方向并且会照亮所有物体,不管这些物体的朝向如何,我们称之为环境光(ambi

【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 之前学习的各种Shader时,我们从没有考虑在所有平台下的可用性.Unity是一个强大的跨

Strumpy Shader Editor入门教程

对于3D游戏来说,有很多绚丽的效果,都是靠shader(着色器)来实现的.不过很多朋友估计都不会编写shader,阿赵我自己也只是看了个入门,明白了它的原理,很多具体的效果都写不出来的.这次来介绍一个Unity3D的第三方shader编辑器:Strumpy.这个编辑器是完全可视化编辑,使用起来相对简单一点. 先来看看我们这次需要做的例子: 我们需要使用Strumpy,编辑出这样一个shader:包括了漫反射通道.法线通道.高光通道,以及在模型的边缘运动的光效. 很显然,Unity3D自带的sha

shader forge初级篇|反射材质的运用

反射效果在制作游戏场景时是经常需要的,特别是在大理石.陶瓷类材质上有助于提升场景质感与氛围. 说道反射,游戏中常见做法就是利用当前场景cubemap作为反射源 而cubemap又是当前场景+Skybox的作用结果. 一 制作CubeMap 天空球[网上可以下载到很多.unitypackage,只说明unity新版本5.0之后将skybox移到了Lightmap下设置,旧版本在RenderSettings下设置] cubemap[5.3.4版本在这里如图第三级资源目录下创建cubemap ,旧版本