Unity Shaders 第一个默认程序分析

 1 Shader "Custom/Shader" {
 2     Properties {
 3         _MainTex ("Base (RGB)", 2D) = "white" {}
 4     }
 5     SubShader {
 6         Tags { "RenderType"="Opaque" }
 7         LOD 200
 8
 9         CGPROGRAM
10         #pragma surface surf Lambert
11
12         sampler2D _MainTex;
13
14         struct Input {
15             float2 uv_MainTex;
16         };
17
18         void surf (Input IN, inout SurfaceOutput o) {
19             half4 c = tex2D (_MainTex, IN.uv_MainTex);
20             o.Albedo = c.rgb;
21             o.Alpha = c.a;
22         }
23         ENDCG
24     }
25     FallBack "Diffuse"
26 }

新建Shader默认代码

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点,直接使用颜色信息进行着色。

时间: 2024-08-28 12:56:03

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

U-BOOT第一阶段程序分析(1)

分析移植之前先介绍下我的软硬件环境: 开发板:JZ2440v2板 CPU   :ARM920T SOC   :S3C2440 晶振freq:12MHz NorFlash:2MB => Am29LV160DB NandFlash:256MB => K9F2G08U0A SDRAM:32MB X 2pieces => K4S561632H-T(U)C(16M X 16bit) U-BOOT版本:u-boot-1.1.6.tar.bz2 我移植的uboot是基于nand启动的,所以代码的分析过

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

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

【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 之前学习的各种Shader时,我们从没有考虑在所有平台下的可用性.Unity是一个强大的跨

【Unity Shaders】Vertex Magic —— 访问顶点颜色

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 啦啦啦~我又回来看书啦.文章开始说一些题外话.因为写博客和在群里比较活跃(为什么QQ给我的

【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党可以参考一下这篇文章使代码高亮显示

DWM1000DISCOVERY TWR方式定位程序分析

DWM1000DISCOVERY默认程序使用的是STM32Cube_FW_F0_V1.5.0_DWM1000DISCOVERY_FACTORY_20160412.zip这个版本,这个程序可以在分享的资料的Code目录下找到,改程序是基于STM32官方STM32Cube_FW_F0_V1.5.0程序修改过来的,只保留了MDK工程目录. 对应的DWM1000DISCOVERY开发板请到如下地址查看: https://item.taobao.com/item.htm?spm=a230r.1.14.15

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

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 终于到了本书的最后一章了,好激动有木有!作为压轴章,虽然只有两篇,但每篇的内容是比之前的任

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

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

Android编程权威指南-读书笔记(二)-第一个小程序

Android编程权威指南-读书笔记(二) -第一个小程序 第一个例子介绍 应用名为GeoQuiz.用户通过单击True或False按钮来回答屏幕上的问题,GeoQuiz可即时反馈答案正确与否. 这个例子为我们简单介绍了几个基本组件的使用,以及基本的事件监听.让我们对基本组件的使用和事件的监听有一个基本的了解. 这篇文章分为2个部分,第一部分就是创建简单的UI.第二个部分就是对这个UI增加代码来响应一些操作. (注:所有不明白或者不理解的东西其实都不重要,后面都会有更详细的介绍.) 本章的目标