Unity Shaders 第一个默认程序

  Shader "Custom/Shader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD CGPROGRAM
#pragma surface surf Lambert sampler2D _MainTex; struct Input {
float2 uv_MainTex;
}; void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
1,Tags  硬件童工这些标签来决定什么时候调用该着色器。
Tags{“RenderType”=“Opaque"}告诉系统应该在渲染非透明物体的时候调用我们。
“RenderType”=“Transparent"表示渲染含有透明效果的物体时候调用。
在这里暗示你得shader输出的是什么。
“IgnoreProjector”=“True” 不被Projectors影响。
“ForceNoShadowCasting”=“True”从不产生阴影。
“Queue”=“xxx"指定渲染顺序队列。
注意:不透明物体可能无法呈现在透明物体之后的情况。可能由于shader渲染顺序不正确导致的。
预定义的Queue有:
Background: 最早被调用的渲染,用来渲染太空盒或背景
Geomery:这是默认值,用来渲染非透明物体。
AlphaTest:用来渲染经过AlphaTest的像素,单独AlphaTest设定一个Queue是出于对效率的考虑。
Transparent:以从后往前的顺序渲染透明物体。
Overlay:用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等效果)。
我们也可以这么写 “Queue”=“Transparent+100”,表示一个在Transparent之后100的Queue上进行调用。通过调用Queue值,我们可以确保某些物体一定在另一些物体之前或之后渲染。
2,LOD 是Level of Detail的缩写。这个值决定我们用什么样的Shader。
当Quality Settings中我们设定的LOD小于subShader中得LOD时,这个SubShader将不可用。
根据设备图形性能来调整画质的时候,可以比较准确的控制。
VertextLit =100
Decal,Reflective VertexLit=150
Diffuse=200
Diffuse Detail,Reflective Bumped Unit,Reflective Bumped VertexLit=250
Bumped,Specular=300
Bumped Specular=400
Parallax=500
Parallax Specular=600
3,编译指令:
#progma surface Func Lambert 声明我们要写的一个表面Shader Func 指定了光照模型。
surface 声明一个表面着色器
Func 着色器方法的名字
Lambert 使用的光照模型。 Lambert 就是普通的diffuse 漫反射 
4,sampler2D 和texture   texture 加载后 储存在 sampler2D类型的对象中。 简单说就是sampler2D就是GLSL中得2D贴图类型。 相应还有sampler1D,sampler3D,samplerCube 
我们每个shader 由两个独立的块组成,外面属性声明,回滚是使用Unity可以直接使用和编译的ShaderLab;而 里面的是 CGPROGRAM…. ENDCG 块,是CG程序。CG程序想访问Properties中所定义的变量的话,必须使用和之前变量名相同的名字的进行声明。 那么CG程序就可以访问这个变量了。
5,CG已经规定好了声明表面着色器方法的参数的类型和名字。就是:
第一个参数是一个Input结构。第二个参数是一个inout的SurfaceOutput 结构。
Input结构是需要我们去定义的结构,可以把所需要的参与计算的数据都放到这个Input结构中,传入surf 函数使用;
第二个SurfaceOutput 是已经定义好了的输出结构,但是一开始的时候内容是空白的,我们需要向里面填写输出,
这样就可以完成着色了。
6,unity中每个贴图变量之前都会加上uv_代表提取它的值是uv值,其实就是代表贴图上点的二维坐标。之后可以在surf程序中访问uv_MainText来获取这张贴图当前需要的点得坐标值了。
7,在计算输出的时候Shader会多次调用surf函数,每次给入一个贴图上的点坐标,来计算输出。第二个参数是一个可写的SurfaceOutput,SurfaceOutput是预设定的输出结构,我们的surf函数的目标就是根据输入把这个结构填上。
SurfaceOutput结构如下:
struct SurfaceOutput{
     half3 Albedo;    //像素的颜色
     half3 Normal;    //像素的法向量
     half3  Emission;//像素的发散颜色
     half     Specular;// 像素的镜面高光 
     half    Gloss;     //像素的发光强度
     half    Alpha;     //像素的透明值
}
8,half4 c = tex2D (_MainTex, IN.uv_MainTex);
text2D函数:用来在一张贴图中对一个点进行采样的方法,返回float4,这里对_MainText上的点进行采样,并将其颜色的rgb值赋予了输出的像素颜色,将a值赋予了透明度。这样着色器 就可以,找到贴图上对应的uv点,直接使用颜色信息进行着色。

Unity Shaders 第一个默认程序分析的更多相关文章

  1. 【Unity Shaders】学习笔记——SurfaceShader(一)认识结构

    [Unity Shaders]学习笔记——SurfaceShader(一)认识结构 转载请注明出处:http://www.cnblogs.com/-867259206/p/5595747.html 写 ...

  2. 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇

    我的唠叨 不知不觉,从发表第一篇关于<Unity Shaders and Effects Cookbook>已经快十个月了.一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免 ...

  3. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  4. 【Unity Shaders】学习笔记——SurfaceShader(六)混合纹理

    [Unity Shaders]学习笔记——SurfaceShader(六)混合纹理 转载请注明出处:http://www.cnblogs.com/-867259206/p/5619810.html 写 ...

  5. 【Unity Shaders】学习笔记——SurfaceShader(四)用纹理改善漫反射

    [Unity Shaders]学习笔记——SurfaceShader(四)用纹理改善漫反射 转载请注明出处:http://www.cnblogs.com/-867259206/p/5603368.ht ...

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

    [Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...

  7. 【Unity Shaders】学习笔记——渲染管线

    [Unity Shaders]学习笔记——Shader和渲染管线 转载请注明出处:http://www.cnblogs.com/-867259206/p/5595924.html 写作本系列文章时使用 ...

  8. 【Unity Shaders】游戏性和画面特效——创建一个夜视效果的画面特效

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  9. 【Unity Shaders】游戏性和画面特效——创建一个老电影式的画面特效

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

随机推荐

  1. UVA - 11604 General Sultan 题解

    题目大意: 有若干模式串,将某些模式串拼接起来(一个可以使用多次)形成一个长模式串,判断能否有两种或更多种不同的拼法拼成相同的模式串. 思路: 神奇的构图,暴力的求解. 可以发现,若有不同的拼法,则一 ...

  2. .NET CLI 命令

    您可以立即使用的部分通用 .NET CLI 命令 命令 说明 dotnet new 使用 C# 语言初始化用于类库或控制台应用程序的有效项目. dotnet restore 还原在指定项目的 proj ...

  3. js与多行字符串

    JS里并没有标准的多行字符串的表示方法,但是在用模板的时候,为了保证模板的可阅读性,我们又不可避免的使用多行字符串,所以出现了各种搞法,这里以一段jade的模板作为示例,简单总结和对比一下. 字符串相 ...

  4. Salesforce注册开发者账号

    在对Salesforce进行了简单的了解之后,我们现在来注册Salesforce的开发者账号,开始Salesforce的学习 一.注册前的准备 首先点击网址:https://developer.sal ...

  5. WINFORM 输出txt文件

    SaveFileDialog saveFile1 = new SaveFileDialog(); saveFile1.Filter = "文本文件(.txt)|*.txt"; sa ...

  6. android 之HttpURLConnection的post,get方式请求数据

    get方式和post方式的区别: 1.请求的URL地址不同: post:"http://xx:8081//servlet/LoginServlet" get:http://xxx: ...

  7. OHSCE_V0.1.22 Beta,跨平台高可靠性通信框架

    Open HI-REL Signal Communication Engine(简称OHSCE)是一款高可靠性跨平台的PHP通信框架,Windows友好且同时支持Linux和OS X.对TCP.UDP ...

  8. Excel数据导入数据库的SQL快速生成

    =CONCATENATE("insert into table_name(id, code, name, remark) values (uuid(),'",B2,"', ...

  9. 输入框三种输入方式(selenium webdriver 干货)

    在机票预定的页面,输入出发城市和到达城市输入框的时候, 发现直接使用sendkeys不好使, 大部分情况出现输入某城市后没有输入进去, 经过几天的研究,发现可以采取三种方式: 1. 先点击输入框,待弹 ...

  10. ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”

    在Linux上运行ASP.NET网站或WebApi的传统步骤是,先安装libgdiplus,再安装mono,然后安装Jexus.在这个过程中,虽然安装Jexus是挺简便的一件事,但是安装mono就相对 ...