unity3d shader 学习笔记1

在unity中我们经常会使用shader,但是从来没有深究过,最近在做项目时遇到相关问题,无从下手,决定系统学习一番,在此前提下把我学习的过程做一个记录。学习过程中参考了浅墨和风宇冲两位高人的博客,本文有不对的地方,还望指正。

按照学习技术的习惯,在第一次接触shader时,我们首先会想这两个个问题,

问题一:什么是shader,它能做什么?

问题二:unity中shader使用的语言是什么?

问题一:shader,也就是着色器,它本质就是一段程序,这段程序的作用是把Mesh(网格)以指定的方式以及指向的贴图或颜色等处理后,然后通过绘制把处理后的图像显示在屏幕上。所以简而言之:

什么是shader,shader就是一段处理颜色,贴图纹理并且进行计算和变换到渲染器的程序。

unity中shader分两类:Surface Shader(表面着色器)和Vertex Shader &Fragment Shader(顶点着色器&片段着色器)以及Fixed Function
Shader(固定功能着色器)下面会讲如何在区分。

shader能做什么呢,比如光影特效,颜色变换等。暂时只想到这些

问题二:unity中的shader使用的是一种shaderLab的语言编写的。它的语法风格类似NVIDIA的CgFX和Direct3D,它具备了显示材质(Material)所需要的一切信息。

下面我们来看一段unity的shader代码。打开unity,Assets->Create->Shader,会在Assets路径下创建了一个shader脚本,可以用文本编辑工具打开,我使用的是一个VS的shader插件,可以显示语法高亮。代码如下:

Shader "Custom/NewShader" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200

		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"
}

我们先来看看这段代码的结构,它大体分四块Shader “Custom/NewShader” ,Properties和SubShader以及FallBack “Diffuse”。

<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;"></span></span>

简单的可以用如下的形式来概括:

Shader "name" { [Properties] SubShaders[Fallback] }

用图来说

Shader “Custom/NewShader” :它定义了我们自定义的这个shader的目录结构,Custom下名字叫做NewShader。目录和它的名字我们可以随意修改 ,并且不必和文件名相同。    “/”用来构建子菜单,作用便于管理,如Custom/canglang/NewShader那么在 Inspector 
检视窗口就会显示成这样

Properties:unity圣典的解释是:

Shaders can define a list of parameters to be set by artists in Unity’s material inspector. The Properties block in
the shader file definesthem.我简单理解为属性定义并且属性会将display
name显示在材质检视器中,显示GUI元素,包括纹理,颜色,滑动条,float值等,能够很便利的让我们进行修改

语法结构为:Properties { Property [Property ...] } 

定义属性块,其中可包含多个属性,其定义如下:

name ("display
name", type) =Defaultvalue

type的类型有7种:Range(min,max),Color
,2D,Rect,Cube,Float,Vector
,每一种的具体含义及定义如下:

name ("display name", Range (min, max)) =number

定义浮点数属性,在检视器中可通过一个标注最大最小值的滑条来修改。

name ("display name", Color) =(number,number,number,number)

定义颜色属性

name ("display name", 2D) = "name" {options }

定义2D纹理属性

name ("display name", Rect) = "name"{ options }

定义长方形(非2次方)纹理属性

name ("display name", Cube) = "name"{ options }

定义立方贴图纹理属性

name ("display name", Float) = number

定义浮点数属性

name ("display name", Vector) =(number,number,number,number)

定义一个四元素的容器(相当于Vector4)属性

例如_MyColor ("My
Color", Color) =(1,1,1,0)为例,

_MyColor ------Internal
name(内部名称)

My
Color-------Inspector title(Inspector窗口显示的名称)

Color-----------Property
type(属性类型)

(1,1,1,0)--------Default
value(默认值)

注意:

1、Properties块内的语法都是单行的。每个属性都是由内部名称开始,后面括号中是显示在检视面板(Inspector)中的名字和该属性的类型。等号后边跟的是默认值。

2、对于Range和Float类型的属性只能是单精度值。

3、对于Color和Vector类型的属性将包含4个由括号围住的数描述。

4、对于纹理(2D, Rect, Cube) 缺省值既可以是一个空字符串也可以是某个内置的缺省纹理:"white",
"black", "gray" or"bump"

SubShader:子着色器,是shader代码的主体,一个shader可以包含一个或多个子着色器,每个子着色器可以包含一个或多个pass,但是在运行时具体能不能执行或者限制性哪个子着色器完全由运行平台决定。因为机子不同,运行的显卡支持环境也不同。所以多个子着色器的作用就在于此,例如对于一个效果,预想想好ABC多套方案,A在牛逼机子上能运行,B在一般机子上能运行,C在烂机子上运行。全都不行了还有FallBack呢。而且在运行时系统也会把子着色器中代码分成多个合适的pass。

具体结构如下:

SubShader

{

pass

{

}

}

FallBack “Diffuse”:回滚,也称备胎,作用是处理所有SubShader都不能运行的情况,以防万一,留个备胎,不然显示不了咋办呢。这里设的备胎是Diffuse(漫反射)。

注意:SubShader在Shader代码中必须有,而properties和fallback是可以不写的

明天继续。。。

时间: 2024-10-10 12:15:11

unity3d shader 学习笔记1的相关文章

Unity Shader学习笔记(一)坐标变换

基本问题 试想我们的美术做了一个3D模型,然后渲染引擎把模型渲染到屏幕上.我们还可以选定不同的视角,模拟不同的光照条件去观察模型.现在来分析一下这个过程.如果说我们把这个过程看成一个函数,那么函数的输出就是屏幕上的图像.确切地说,是屏幕上的每个像素.这个函数的主要输入是这个3D模型,我们观察的视角,光照情况等等因素.渲染过程就是给出这些因素决定每个像素值的过程. 首先来看模型.模型通常是由可视化的建模软件制作,看上去是一个"实体".然而从计算机的角度来说,模型文件只不过是包含渲染它所需

unity3d shader 学习

[浅墨Unity3D Shader编程] 着色器参考 [Unity Shaders]

u3d shader学习笔记1

促使我学习SHADER的重要原因是希望深入理解3D渲染的机制,在此基础上可以灵活达到某种效果与性能的平衡,开发出具有良好体验的VR应用. 因为VR应用体验的好坏,直接由游戏的帧率决定,而游戏的帧率则受到渲染一帧画面所花时间的影响,因此如何提升渲染时间,而又可以得到期望的效果,必须要对SHADER或者说渲染机制有深入的理解. 一.在U3D中,shader是什么?shader即“着色器”,我们之所以能够看到屏幕上丰富多彩的3D画面,正是得益于它.U3D中与shader相关的概念以及它们同shader

Shader学习笔记-0

shader基本结构: shader"name"{ [Propertise]--------------------------(1)属性 Subshaders---------------------------(2)sub片段 [FallBack]------------------------------(3)回滚 } Shader "Custom/Test" { Properties { -----------属性 _MainTex ("Base

Shader学习笔记_基础知识_分量

分量 矢量的分量名称:{x,y,z,w}表示顶点: {r,g,b,a}表示颜色:{s,t,p,q}表示纹理坐标. 每个分量用点号连接(例如v2.x(一个float变量),v3.rg(一个vec2变量)). 不同组的分量不能混合使用(例如v4.xgba不合法),但是顺序可以任意,可以重复(例如v3.yyxx(一个vec4变量)),但不能超过4个,因为编译器不知道转化成什么类型(例如v4.xyzwxy不合法). 矩阵的分量就是用下标表示,注意的是矩阵是以列优先的. mat4 m; m[1] = ve

Unity3D 骨骼动画原理学习笔记

最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1.骨骼动画详解 :http://blog.csdn.net/ccx1234/article/details/6641944,不过这篇文章的原文已经被csdn封了:D,可以看看对应的转载的文章也行 2.OpenGL10-骨骼动画原理篇:http://www.cnblogs.com/zhanglitong

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我们以最初的添加了First Person Controller的PFB_Straight为整个场景的中心点来展开.我们先从Project中Prefabs文件夹拖出来

Unity3D学习笔记之八为场景添加细节(一)

这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我花了30分钟做了一个中等大小的迷宫场景,不知道大家自己发挥,做的场景大小如何. 在完成场景之后,我们看到Hierarchy视图里面的东西已经满了,所以我们先来整理一下Hierarchy视图.创建一个空的游戏物体命名为Environment. 然后来到Hierarchy视图,先讲First Person Controller找到,挪到最上方,然后选中第一个物体,按住

Unity3D学习笔记九为场景添加细节(二)

上节为场景中添加了第一块带有碰撞器的石头,本节我们来利用Prefab,将场景细节都添加进去,并且做的更完善. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 继续来到那块已经成形的石头--Boulder旁边,我们可以制作很多石头的Prefab,这样对于丰富我们巨大的场景很有利,我们先来创建第一个石头的Prefab按下Control+D复制一块石头,按住坐标轴拖动出来,按下R调整到缩放工具,按住中心的白色立方体缩小