Unity的shader学习2

下面继续看基于surface的shader代码,基本与Vertex&Fragment shader差不多,只是不能写pass,然后只需要声明surface函数,就能处理所有的事情。

 1 Shader "T1/Hero/Diffuse" {
 2     Properties {
 3         _MainTex ("Base (RGB)", 2D) = "white" {}
 4         _Color ("Main Color", Color) = (1,1,1,1)
 5         [HideInInspector]_BlendColor("_Blend Color", Color) = (1, 1, 1, 0)
 6         [HideInInspector]_BlendIntensity ("BlendColorShininess", Range (1, 4)) = 1
 7     }
 8     SubShader {
 9         Tags { "Queue" = "Geometry+20" "RenderType"="Opaque"}
10         LOD 200
11
12         CGPROGRAM
13        // #include "T1.cginc"
14         #pragma surface surf LambertT1HeroSideLight
15         #pragma only_renderers d3d9 opengl
16
17         sampler2D _MainTex;
18         fixed4 _Color;
19
20         struct Input {
21             float2 uv_MainTex;
22         };
23
24         #include "T1.cginc"
25
26         void surf (Input IN, inout SurfaceOutput o) {
27             half4 c = tex2D (_MainTex, IN.uv_MainTex) ;
28             #if defined (UNITY_PASS_FORWARDBASE) || defined (UNITY_PASS_PREPASSFINAL)
29                 o.Albedo =  lerp (c.rgb* _Color.rgb, _BlendColor * _BlendIntensity,  _BlendColor.a);
30             #else
31                 o.Albedo =  c.rgb* _Color.rgb;
32             #endif
33             o.Alpha = 0;
34             o.Emission = c.rgb * _heroSelfIllumin;
35         }
36         ENDCG
37     }
38     FallBack "Hidden/T1/VertexLit-Hero"
39 }

第3行的_MainTex声明后,就可以在第17行中引用到。

第5-6行的HideInInspector意思是不在编辑器的属性界面显示,隐藏起来。然后_BlendColor表示一个颜色,_BlendIntensity表示0-1的值。看后面的意思可以得知是混合颜色和混合强度。

第9行的RenderType=Opaque表示声明是一个不透明的物体,具体解释在这里,然后"Queue" = "Geometry+20"其实就是说渲染层次是2000+20,就是比一般的不透明物体层次要高一点。

第10行的LOD这个数值决定了我们能用什么样的 Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。Unity 内建Shader定义了一组LOD的数值。具体解释在这里。200是默认的diffuse值。

第14行的#pragma surface surf Lambert,它声明了我们要写一个表面Shader,并指定了光照模型。它的写法是这样的

  #pragma surface surfaceFunction lightModel [optionalparams]

  • surface - 声明的是一个表面着色器
  • surfaceFunction - 着色器代码的方法的名字
  • lightModel - 使用的光照模型。

Lambert就是普通的diffuse漫反射光照模型。

第15行#pragma only_renderers d3d9 opengl表示限制这个shader只编译在d3d9和opengl上。具体解释在这里

第17行sampler2D就是GLSL中的2D贴图的类型,相应的,还有sampler1D,sampler3d,samplerCube等等格式。不啰嗦了

第18行的fixed4主要用来表示颜色rgba四个数值。

第20行的Input声明后,主要是用来给surf函数来使用的。

第26行-34行主要是CG规定了声明为表面着色器的方法(就是我们这里的surf)的参数类型和名字,因此我们没有权利决定surf的输入输出参数的类型,只能按 照规定写。这个规定就是第一个参数是一个Input结构,第二个参数是一个inout的SurfaceOutput结构。

这里用到了一个tex2d函数,这是CG程序中用来在一张贴图中对一个点进行采样的方法,返回一个float4。这里对_MainTex在输入点上进行了采 样,并将其颜色的rbg值赋予了输出的像素颜色。

28行的主要意思见这里。这里主要是前向渲染或者延迟渲染的话,物体颜色就需要考虑混合的颜色和混合的亮度,否则就直接取颜色。

33行,设置无透明。

34行表示自发光,这个值是图片的颜色乘以t1定义的自发光亮度常量。

Unity的shader学习2,布布扣,bubuko.com

时间: 2024-12-12 05:53:05

Unity的shader学习2的相关文章

Unity之Shader学习基础篇《一》

最近在学习Shader,将学习的一些心得和案例以及基础知识罗列了一下.这一篇是unity之Shader的基础篇之基础,更多的是一些概念.该篇将分以下几个部分: 1.什么是Shader? 2.GPU和Cg语言 3.Unity中使用Cg语言如何编写Shader? 1.什么是Shader? 1.1.Shder的概念:Shader即着色器,是一款运行在GPU上的程序,用以对三维物体进行着色处理,光与影的计算,纹理颜色的呈现等,从而将游戏引擎中一个个作为抽象的几何数据存在的模型.场景和特效,以和真实世界类

【Unity】Shader学习资料

http://www.cnblogs.com/polobymulberry/p/4314147.html http://www.sikiedu.com/my/course/37

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, 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模型,我们观察的视角,光照情况等等因素.渲染过程就是给出这些因素决定每个像素值的过程. 首先来看模型.模型通常是由可视化的建模软件制作,看上去是一个"实体".然而从计算机的角度来说,模型文件只不过是包含渲染它所需

【浅墨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,而

【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型

[Unity Shaders]学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水平有限,难免有谬误之处,望指出. LitSphere(Matcap) 发光球体光照模型就是将发光球体的纹理映射在球体上,来实现光照效果.这可以创造一些效果细腻的发光球体效果,但是它不受

【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射

[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水平有限,难免有谬误之处,望指出. Unity内置的高光函数 Unity内置了一种高光光照模型——BlinnPhone. 使用方法如下: Shader "Custom/BlinnPhong"{ Properties { _MainTex ("Base (RGB)", 2D

【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型

[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698.html 写作本系列文章时使用的是Unity5.3. 写代码之前: 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧? 阅读本系列文章之前你需要有一些编程的概念. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示