下面着重分析一下surface shader中是如何使用BlinnPhong光照模型的,为以后写代码做铺垫。源文件取自Unity3D官网下载的builtin_shaders, 源文件名为Normal-Glossy.shader,描述了最基本的镜面反射是如何设计的

**/

Shader "Specular" 
{
    Properties 
    {
        // 主色调,用于定义物体的基色
        _Color ("Main Color", Color)                = (1,1,1,1)
        // 高光颜色,如果使用BlinnPhong光照模型,则定义高光时必须命名为_SpecColor,并且,只有变量定义,在surface shader中看不到是在哪里使用的,使用该变量的地方被隐藏了
        _SpecColor ("Specular Color", Color)        = (0.5, 0.5, 0.5, 1)
        // 材质的光泽度,反映物体表面的光泽程度,又叫高光指数,定义范围(0, 1]之间,其值越大,反射光越集中
        _Shininess ("Shininess", Range (0.01, 1))    = 0.078125
        // 主纹理,用于定义物体基色
        _MainTex ("Base (RGB) Gloss (A)", 2D)        = "white" {}
    }

SubShader 
    {
        // 绘制类型,只是用于Replaced Shaders的标记,并不是必须的。
        // 如果需要定义对象的绘制顺序,请使用Queue标记
        Tags { "RenderType"="Opaque" }
        LOD 300

CGPROGRAM
        // 定义着色器类型为surface,着色器入口方法为surf(),光照模型为BlinnPhong
        #pragma surface surf BlinnPhong

sampler2D    _MainTex;
        fixed4        _Color;
        half        _Shininess;

struct Input
        {
            // Unity3D中shader的默认规则,纹理定义前面加uv前缀代表是对应的纹理坐标
            float2 uv_MainTex;
        };

void surf (Input input, inout SurfaceOutput output) 
        {
            // 取主纹理的对应当前像素点的值
            fixed4 tex        = tex2D(_MainTex, input.uv_MainTex);

// Albedo反照率,即物体反射光的数量与外来光数量的比值。
            // Albedo = 主纹理 x 主色调,反映了物体的基色,与任何光相关的信息(比如diffuse, shiness等)无关
            output.Albedo    = tex.rgb * _Color.rgb;

// Gloss光滑度[0, 1],用于控制反射的模糊程度,值越大,高光反射越清晰,反之则越模糊。
            // 光滑度的“滑”是面的概念,代表物体整体的光滑程度
            // 比如说,同样一块金属,在它生锈的过程中,其反射就会慢慢变弱,可以通过Gloss值控制
            // 实际上它是针对高光计算结果的附加系数
            output.Gloss    = tex.a;

// Alpha,不透明度[0, 1]:Alpha=0,代表物体完全透明;Alpha=1,代表物体完全不透明
            output.Alpha    = tex.a * _Color.a;

// Shininess光泽度[0, 1],又叫高光指数或镜面反射指数,注意,它在SurfaceOutput结构中的命名(Specular)很容易让人误解为它是高光强度,其实不然,它是高光指数
            // 光泽度的“泽”是点的概念,代表物体某个高光点的光泽程度
            output.Specular    = _Shininess;
        }
        ENDCG
    }

// 如果当前GPU不支持本shader,默认使用VertexLit
    Fallback "VertexLit"
}

SurfaceOutput的更多相关文章

  1. 【译】Unity3D Shader 新手教程(4/6) —— 卡通shader(入门版)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 暗黑系 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想了解更多有关表面着色器的细节知识. 你想实现一个入门 ...

  2. 【译】Unity3D Shader 新手教程(3/6) —— 更加真实的积雪

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你满足以下条件,我建议你阅读这篇教程: 你想知道如何在表面着色器中进行混色(blend colour) 你想实 ...

  3. 【译】Unity3D Shader 新手教程(2/6) —— 积雪Shader

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的 ...

  4. 【译】Unity3D Shader 新手教程(1/6)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...

  5. Lambert(朗伯)光照模型 和Half Lambert的区别

    Lambert-它不包括任何任何镜面属性,对粗糙物体来说,这项属性是非常有用的,它不会反射出周围的环境.Lambert材质可以是透明的,在光线追踪渲染中发生折射,但是如果没有镜面属性,该类型就不会发生 ...

  6. Unity Shaders 第一个默认程序分析

    Unity Shaders 第一个默认程序 Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)&quo ...

  7. 简易的轮廓边生成(N和V dot点乘方式)(surface方式和vs ps 方式的分别实现)

    一.前面心情 1.公司我的架构发生变动,从技术中心到项目组了,但不管怎么样,该看的还要看,总会用到 二.实现 三.参考: http://blog.csdn.net/cubesky/article/de ...

  8. u3d_Shader_effects笔记6 第二章 animating sprite

    1.前面的心情 上班看shader我也是醉了.写完这篇看代码去了,不过看着看着恐怕就会困.... 还有就是上天,我该怎么做,下一步,大懒: 2.参考源头 http://blog.csdn.net/ca ...

  9. unity之初识shader

    自己做个总结先.当然文中很多内容都是从各位大神的文档当中看的.我只是站在巨人的肩膀上.       首先什么是shader?其实就是一个在显示屏当中的显示程序,俗称着色器.它可以定义物体在硬件显示屏当 ...

随机推荐

  1. 回归测试---junit

    回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误. JUnit是一个Java语言的单元测试框架. http://blog.csdn.net/andycpp/ar ...

  2. mongodb配置

    Mongodb1. 安装2. CRUD3. 索引4. 副本及(replica sets)5. 分片(sharding) nosql 简单数据模型 元数据和应用数据分离 弱一致性 优势: 避免不必要的复 ...

  3. Velocity模板引擎语法

    Velocity 模板引擎介绍 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java ...

  4. Ubuntu(14.04)远程连接windwos(server2008 r2)

    只需安装rdeasktop即可, sudo apt-get install rdesktop rdesktop 192.168.1.100 -g 800x600 其他参数 -f 其实用Ubuntu自带 ...

  5. 在SQLite Expert上用日期类型字段作为条件查询时注意日期的格式化

    经验之谈: 情况一:没有查询结果 and R_CheckInTime > '2015-7-12 18:47:00' and R_CheckInTime < '2015-7-18 18:48 ...

  6. 获取乌云补天指定关键字的漏洞并输出URL和标题

    #coding=utf-8 import urllib2 import re import time def timestamp():         return str(time.strftime ...

  7. .net程序员的学习计划

    .net程序员的学习计划 与其说是计划,不如说是抄来的课程表.基于最近老大要求写一份一年的职业规划.我是一个向来没什么规划的人,不是职场规划,就连平时的规划都没有,基本上就是有什么任务就去完成.回想起 ...

  8. 从NSGA到 NSGA II

    NSGA(非支配排序遗传算法).NSGAII(带精英策略的非支配排序的遗传算法),都是基于遗传算法的多目标优化算法,都是基于pareto最优解讨论的多目标优化,遗传算法已经做过笔记,下面介绍paret ...

  9. 卸载cygwin

    1.下载takeown.exe(貌似win自带,你可以打开cmd 输入takeown.exe查看,貌似不行)所以还是去网上下载吧,亲测http://download.csdn.net/download ...

  10. 【iOS】Foundation框架 学习笔记

    1.数组 OC数组不能存放nil值OC数组只能存放OC对象.不能存放非OC对象类型,比如int.struct.enum等 ====================================== ...