SurfaceOutput
下面着重分析一下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的更多相关文章
- 【译】Unity3D Shader 新手教程(4/6) —— 卡通shader(入门版)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 暗黑系 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想了解更多有关表面着色器的细节知识. 你想实现一个入门 ...
- 【译】Unity3D Shader 新手教程(3/6) —— 更加真实的积雪
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你满足以下条件,我建议你阅读这篇教程: 你想知道如何在表面着色器中进行混色(blend colour) 你想实 ...
- 【译】Unity3D Shader 新手教程(2/6) —— 积雪Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的 ...
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- Lambert(朗伯)光照模型 和Half Lambert的区别
Lambert-它不包括任何任何镜面属性,对粗糙物体来说,这项属性是非常有用的,它不会反射出周围的环境.Lambert材质可以是透明的,在光线追踪渲染中发生折射,但是如果没有镜面属性,该类型就不会发生 ...
- Unity Shaders 第一个默认程序分析
Unity Shaders 第一个默认程序 Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)&quo ...
- 简易的轮廓边生成(N和V dot点乘方式)(surface方式和vs ps 方式的分别实现)
一.前面心情 1.公司我的架构发生变动,从技术中心到项目组了,但不管怎么样,该看的还要看,总会用到 二.实现 三.参考: http://blog.csdn.net/cubesky/article/de ...
- u3d_Shader_effects笔记6 第二章 animating sprite
1.前面的心情 上班看shader我也是醉了.写完这篇看代码去了,不过看着看着恐怕就会困.... 还有就是上天,我该怎么做,下一步,大懒: 2.参考源头 http://blog.csdn.net/ca ...
- unity之初识shader
自己做个总结先.当然文中很多内容都是从各位大神的文档当中看的.我只是站在巨人的肩膀上. 首先什么是shader?其实就是一个在显示屏当中的显示程序,俗称着色器.它可以定义物体在硬件显示屏当 ...
随机推荐
- 【转】MySQL数据库MyISAM和InnoDB存储引擎的比较
MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...
- Spring单实例、多线程安全、事务解析
原文:http://blog.csdn.net/c289054531/article/details/9196053 引言: 在使用Spring时,很多人可能对Spring中为什么DAO和Se ...
- S3C2440 裸机程序之音频
mini2440之Main分析 2012-03-17 20:51:29 分类: 嵌入式 /****************************************************** ...
- [原创]java WEB学习笔记100:Spring学习---Spring Bean配置:SpEL详细介绍及代码演示
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- PL301 matrix内部模块
ASIB中的valid信号,有两部分,一部分add产生的地址映射,到main中的default addr.(vect) 一部分由Dmu和Cdas组成,到main中的build. Dmu:interco ...
- PHP排序函数
/** * 对查询结果集进行排序 * http://www.onethink.cn * /Application/Common/Common/function.php * * @access publ ...
- 在linux中的info手册的用法
就是一些快捷键 空格键向下翻页,当处在当前节点的底部时,空格键跳转到下一个节点. <DEL> 或者 <BACKSPACE> 向上翻页,当处在当前节点的顶部的时候,这两个键可以跳 ...
- Qt之自定义信号和槽函数
自定义信号和槽函数: 1.类的声明和实现分别放在.h和.cpp文件中: 2.类声明包含Q_OBJECT宏: 3.信号只要声明不要设计其的实现函数 4.发射信号用emit关键字 5.自定义槽的实现与普通 ...
- Spring MVC 学习资料
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Jav ...
- 常见Oracle HINT的用法
1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_I ...