Unity shader学习之逐像素漫反射光照模型

shader如下:

Shader "Custom/Diffuse Fragment-Level"
{
    Properties
    {
        _Diffuse ("Diffuse", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags { "LightMode"="ForwardBase" }        // 只有设置了正确的LightMode,才能访问一些Unity提供的内置变量,如:_LightColor0

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float3 worldNormal : NORMAL;
            };

            float4 _Diffuse;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                float3 wn = mul(v.normal, (float3x3)_World2Object);
                o.worldNormal = normalize(wn);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float3 lightDir = normalize(_WorldSpaceLightPos0);
                float4 diffuseColor = _Diffuse * _LightColor0 * max(0, dot(lightDir, i.worldNormal));
                return UNITY_LIGHTMODEL_AMBIENT + diffuseColor;
            }

            ENDCG
        }
    }

    Fallback "Diffuse"
}

效果如下:

转载请注明出处:http://www.cnblogs.com/jietian331/p/7079005.html

逐像素光照可以得到更新平滑的光照效果,但有一个缺点,在光照无法到达的区域,模型的外观通常是全黑的,没有任何明暗变化,像一个平面一样,无任何模型细节表现,如下图。

为此,有一种改善技术:半兰伯特(Half Lambert)光照模型。

时间: 2024-08-26 12:51:18

Unity shader学习之逐像素漫反射光照模型的相关文章

Unity Shader 学习之旅-初探

Unity Shader 学习之旅-初探 unity shader 图形图像 美丽的梦和美丽的诗一样 都是可遇而不可求的--席慕蓉 最简单的顶点片元着色器 顶点片元着色器基本结构 Unity Shader基本结构:Shader ,Properties,SubShder,Fallback等. 结构 Shader "ShaderName"{  Properties{  //属性,暴露在inspector面板上  }  SubShader{  //针对显卡A的SubShader  Pass{

Unity Shader学习笔记(一)坐标变换

基本问题 试想我们的美术做了一个3D模型,然后渲染引擎把模型渲染到屏幕上.我们还可以选定不同的视角,模拟不同的光照条件去观察模型.现在来分析一下这个过程.如果说我们把这个过程看成一个函数,那么函数的输出就是屏幕上的图像.确切地说,是屏幕上的每个像素.这个函数的主要输入是这个3D模型,我们观察的视角,光照情况等等因素.渲染过程就是给出这些因素决定每个像素值的过程. 首先来看模型.模型通常是由可视化的建模软件制作,看上去是一个"实体".然而从计算机的角度来说,模型文件只不过是包含渲染它所需

Unity shader学习之半兰伯特光照模型

半兰伯特光照模型,为Valve公司在开发游戏<半条命>时提出的一种技术,用于解决漫反射光无法到达区域无任凭明暗变化,丢失模型细节表现的问题. 其公式如下: Cdiffuse = Clight * mdiffuse * ( dot(n, l) * 0.5 +0.5 ) 通过这样的方式,将dot(n, l)的结果从[-1,1]映射到[0,1]的范围. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7083289.html shader如下: Shader

unity shader 学习 (2)Vs【顶点着色器】 和 Ps【像素着色器】

上一章我写了渲染管线,中间提到了shader的作用,我们的大shader同学主要就是负责被CPU指派到GPU中做一些如顶点转换,关照模型,光栅化等操作的. 大shader有两种类型,他们分别是Vs[顶点着色器] 和 Ps[像素着色器].. 他们可以同时存在,也可以分开存在,没有任何使用限制. 当时如果同时存在的话,必须Vs执行完成后再交给Ps处理. 他们两个家伙是配合固定流程管线而存在的.

Unity shader学习之Blinn-Phong光照模型

Blinn-Phong光照模型不用计算反射方向,计算公式如下: h = normalize(v + l); Cspecular = Clight * mspecular * pow(max(0, dot(n, h), gloss)) 转载请注明出处:http://www.cnblogs.com/jietian331/p/7097201.html shader如下: 1 Shader "Custom/Specular Blinn-Phong" 2 { 3 Properties 4 { 5

Unity shader学习之阴影,衰减统一处理

使用unity AutoLight.cginc文件里的内置函数 UNITY_LIGHT_ATTENUATION shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Forward Rendering" { Properties { _MainTex("Main Texture", 2D) = "

Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度

Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 如代码如下: PostEffectRenderer: 1 using UnityEngine; 2 3 [RequireComponent(typeof(Camera))] 4 public abstract class PostEffectRenderer : GameBehaviour 5 { 6 protected abstract string ShaderName { get; } 7 8

Unity shader学习之屏幕后期处理效果之高斯模糊

高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加为1,因此e前面的系数实际不会对结果产生任何影响. 综上,公式简化为: G(x,y) = e-(x*x+y*y)/2 一个5 * 5的高斯核计算代码如下: 1 using System; 2 3 namespace TestShell 4 { 5 class Program 6 { 7 static

【我的书】Unity Shader的书 — 目录(2015.09.04更新)

写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shader的艰难,在群里也见了很多人提出的问题.我觉得学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么好处呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader初学者,但要: 有一定的