您的位置:首页 > 移动开发 > Unity3D

Unity中Shader的个人理解

2015-07-03 15:46 148 查看

一、概念

材质:shader、贴图、颜色选择、参数

Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出

简单讲:shader:贴图+颜色+参数设定

二、分类

(1)表面着色器

(2)片着色器

三、结构

【着色器组成】

1.属性定义:指定代码有哪些输出

2.子着色器:N个子着色器,具体执行哪个有平台决定,这个是代码的主题

3.回滚:用来处理Subshader都不能运行的情况

四、实例讲解

Shader "Custom/Diffuse Texture" {

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"

}

1:Properties{}:属性定义

(1)语法定义:_Name("Display Name", type) = defaultValue[{options}]

(2)例子: _MainTex ("Base (RGB)", 2D) = "white" {}

(3)_Name:属性的名字,就是个变量,在下面的代码会用到

(4)Display Name :在在Unity的材质编辑器中作为Shader的使用者可读的内容

(5)type : 这个属性的类型可以包括(Color ,2D ,Rect ,Cube ,Range(min, max),Float ,Vector )

(6)defaultValue:定义一个属性的默认值(如果是Color -(1,1,1,1);如果是2D/Rect/Cube -tint颜色的字符串,可以是空字符串或者”white”,”black”,”gray”,”bump”中的一个)

(7)2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{}

2: SubShader {}:程序主题

3:Tags:表面着色器可以被若干的标签(tags)所修饰,而硬件将通过判定这些标签来决定什么时候调用该着色器。

(1)告诉系统什么时候调用我们

(2){ "RenderType"="Opaque" }:渲染非透明物体时调用

(3){"RenderType"="Transparent"}:含有透明效果的物体时调用

(4){"IgnoreProjector"="True"}:不被Projectors影响

(5){"ForceNoShadowCasting"="True"}:从不产生阴影

(6){"Queue"="xxx"}:指定渲染序列如果你使用Unity做过一些透明和不透明物体的混合的话,很可能已经遇到过不透明物体无法呈现在透明物体之后的情况。这种情况很可能是由于Shader的渲染顺序不正确导致的。Queue指定了物体的渲染顺序

<1>Background - 最早被调用的渲染,用来渲染天空盒或者背景

<2>Geometry - 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)

<3>AlphaTest - 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑

<4>Transparent - 以从后往前的顺序渲染透明物体

<5>Overlay - 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)

4.LOD很简单,它是Level of Detail的缩写

5.CGPROGRAM开始,ENDCG结束

6.#pragma surface surf Lambert

(1)#pragma surface surfaceFunction lightModel [optionalparams]

(2)surface - 声明的是一个表面着色器

(3)surfaceFunction - 着色器代码的方法的名字(下面就会用到这个方法)

(4)lightModel - 使用的光照模型

7.sampler2D _MainTex:因为前面定义了变量,这里还要在重新定义下,才能在后面使用。(sampler2D就是GLSL中的2D贴图的类型)

8.void surf(){}:这个是要进行处理的方法

(1)这个方法是已经定义好的,必须这样写才行,参数的类型

(2)Input IN:是个结构(输入)

(3)inout SurfaceOutput o:是个结构(输出)

(4)_MainTex:贴图变量

(5)uv_MainTex:贴图变量的坐标值

(6)在计算输出时Shader会多次调用surf函数,每次给入一个贴图上的点坐标,来计算输出

(7) half4 c = tex2D (_MainTex, IN.uv_MainTex):在一张贴图中对一个点进行采样的方法,返回一个float4

(8) o.Albedo = c.rgb:并将其颜色的rbg值赋予了输出的像素颜色

(9)o.Alpha = c.a:将a值赋予透明度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: