Shader基础(固定管线着色器)
在Shader的编码中,要养成不加空格的习惯,否则会有时候出现一些错误
固定管线着色器:
优点:实现简单
缺点:处理的效果比较差
//设置Shader的路径
Shader "MyFixedShader/FixedShader001"{
//Shader属性(当前材质拥有的属性)
Properties{
//在Shader中写属性名称的时候,一般都会在属性名称前加一个_
//(1)属性名称(“(2)属性在面板的名字”,(3)属性类型)=(4)属性初值
_MyFloat("一个浮点数",Float)=1.5
_MyRange("一个范围浮点数",Range(0.5,5)=3
_MyVector("一个四维数",Vector)=(1,0,0,1)
_MyColor("一个颜色",Color)=(1,0,0,1)
//二阶贴图:贴图的宽高比是2的n次幂 例如256*256,128*128
//二阶贴图在渲染的时候 Tiling表示缩放 offset表示偏移量 相当于UVRect
_My2DTexture("一个2阶贴图",2D)=""{}
_MyRectTexture("一个非二阶贴图",Rect)=""{}
_MyCubeTexture("一个立方体贴图",Cube)=""{}
}
//子着色器,可以有多个,一般只有一个子着色器
//每个子着色器相当于一个渲染方案
//当有多个子着色器的时候,会做出选择,既当这个子着色器不能渲染的时候,会选择下一个
SubShader{
//通道:可以通过多通道的方式渲染正面,反面等
Pass{
}
}
}
在Pass通道中给材质球增加一个颜色
Color(1,0,0,1) //固定颜色
Color[_MainColor]//可调颜色
漫反射:对应的是镜面反射,表面光滑的物体在反射的时候会有光斑,是镜面反射;表面粗糙的物体反射的时候角度是不固定的,会出现漫反射的效果。
镜面反射和漫反射的最大区别是:镜面反射的物体表面比较光滑,有一个高光效果
SubShader{
Pass{
//漫反射需要打开光照
Lighting On
//开启镜面反射(默认的是漫反射,需要镜面反射的时候需要打开镜面反射)
SeparateSpecular On
Material
{
Diffuse(1,0,0,1)//固定漫反射
Diffuse[_MainColor]//可调漫反射
//当漫反射调成白色,就可以看出环境光的效果
Ambient[_AmbientColor]//可调环境光颜色
Emission[_EmissionColor]//自发光颜色,强度比较高
//下面是镜面反射
//高光颜色
Specular[_SpecularColor]
//光泽度(range)调整光泽度的时候一般都先关闭自发光(自发光的强度高,影响效果)
Shininess[_Shininess]
}
}
}
设置多边形剔除(一般都是通过多通道进行剔除,剔除后的效果是正面和反面的颜色不同)
Pass{
//剔除正面
Cull Front
}
Pass{
//剔除反面
Cull Back
}
//不剔除
//Cull Off
渲染队列(Render Queue):既渲染的先后顺序
一般的,距离摄像机越远的物体越先渲染,越近的物体最后渲染。但有时候需要一个物体在任何情况下都最后去渲染,不想任何物体挡住,这时候就需要在Shader里面手动的设置渲染队列
在使用渲染队列的时候,需要关闭深度测试(深度测试和深度缓存(ZWrite On/Off)默认都是开启的)
SubShader{
//设置渲染队列
Tags{"Queue"="BackGround+500"}
//关闭深度测试
ZText Off
}
Alpha透明混合:当前材质球遇到其他一些材质,会出现的透明的效果
Pass{
//开启透明混合
Blend SrcAlpha OneMinusSrcAlpha
//开启顶点光照
Lighting On
Material{
Diffuse[_Color]
}
}
其他的混合:乘法的混合颜色较深,加法的混合颜色较浅
Blend One One:一种相加的混合。没有透明通道,调节透明度没有作用,背面透明,正面是正常颜色,当与其他物体混合的时候,颜色会发生变化
Blend One OneMinusDstColor:柔和相加混合。与其他物体混合的时候,只会和比该物体先渲染的物体进行混合。
Blend DsrColor Zero:乘法混合,混合后的颜色比较深
Blend DsrColor SrcColor:二倍乘法混合,比乘法混合颜色稍浅
Pass{
//
Blend One One
}
在材质球上添加一些图片后渲染
Primary指的是前面写的漫反射和镜面反射,自发光等
Previous:在纹理的贴图在渲染的时候可能有很多张贴图,要想融合以前的贴图,就需要在这张贴图的基础上再加一张贴图,Privious指的是当前这张贴图与上一张贴图进行的混合。
Constant:在纹理上加一个颜色的混合
SubShader{
Pass{
Color[_MainColor]
SetTexture[_MainTexture]{
constantColot[_MainColor]
//当需要图片只跟一个颜色进行混合的时候用到constant
combine Constant-Texture
//combine Primary+Texture Double
}可以用作给一个角色换皮肤,中间有一个平滑的过渡
//
SetTexture[_MainColor]{
constantColor[_LerpColor]
combine Texture lerp(Constant) Previous
}
}
}
设置完Shader后,用脚本实现代码如下:
public class SkipLerp : MonoBehaviour {
private MeshRenderer meshRenderer;
ptivate float targetAlpha = 0;
private float speed = 3f;
void Awake(){
meshRender = GetComponent<MeshRenderer>();
}
void Update(){
if(Input.GetButtonDown(0)){
if(targetAlpha ==0){
targetAlpha = 1;
}else{
targetAlpha = 0;
}
//获取插值颜色
Color currentColor = meshRenderer.material.GetColor("_LerpColor");
//计算下一帧的Alpha值
float currentAlpha = Mathf.Lerp(currentColor.a, targetAlpha, Time.deltaTime*speed);
//设置新的Alpha
currentColor.a = currentAlpha;
//设置新的颜色值
meshRenderer.material.SetColor("_LerpColor");
}
}
}
AlphaText:每个像素的透明度是不一样的,同通过Alpha测试可以调节渲染什么样的透明度
在项目中可以在死亡动画结束后进行融解,然后再销毁(需要纹理贴图有一个透明度的区别)
Pass{
//表示当前纹理大于_AlphaRange的进行渲染
AlphaText Greater[_AlphaRange]
}
Shader基础(固定管线着色器)的更多相关文章
- Shader开发之三大着色器
固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader &qu ...
- (译)Minimal Shader(最小的着色器)
(原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basi ...
- OpenGL 4.0的Tessellation Shader(细分曲面着色器)
细分曲面着色器(Tessellation Shader)处于顶点着色器阶段的下一个阶段,我们可以看以下链接的OpenGL渲染流水线的图:https://www.opengl.org/wiki/Rend ...
- 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.
- Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合
一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...
- (原)Unreal渲染模块 管线 - 着色器(1)
@author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...
- Unity3D学习笔记(三十四):Shader着色器(1)
一.GPU:图形处理器,Graphics Processing Unit 显卡的处理器就是图形处理器.与CPU类似. GPU和CPU的区别? 1.CPU主要是为了串行指令设计,GPU则是为了大规模 ...
- 第二章 Unity Shader基础
[TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...
- 编写Unity3D着色器的三种方式
不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...
随机推荐
- tpc资料汇总
官方资料 TPC官网 http://www.tpc.org/ 配置文档 大家一起来测试,benchmark起来(MySQL下的TPC-C,TPC-H,TPC-W) http://www.itpub ...
- 学习笔记:webpack
http://wiki.jikexueyuan.com/project/webpack-handbook/ Webpack 中文指南 http://www.itzjt.cc/2017/04/09/we ...
- 16.纯 CSS 创作一个渐变色动画边框
原文地址:https://segmentfault.com/a/1190000014785816 感想:边框是伪元素::after来的: HTML代码: <div class="box ...
- 转:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是以经纬度为单位的都是地理坐标系,因为它归根结底是一个椭球体,只不过各个国家为了反映该国家所在区域地球的真实形状,而 ...
- django之urlresolver
>>> from django.utils.regex_helper import normalize >>> bits=normalize(r'^static/( ...
- <面试> PHP 常见算法
排序算法 1. 冒泡排序(数组排序) 基本思想:对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样每遍历一次,最小的数值就 ...
- 选择、操作web元素-2
11月3日 等待web元素的出现 例子:百度搜索松勤网,点击操作后不等待页面刷新,下面选择页面元素的时候,该元素还是未出现 sleep方案的弊病:固定的等待时间,导致测试用例执行时间很长 为什么cli ...
- fb发布打包外部资源
将资源放在src文件夹下面即可 然后在打包那就会看到资源,勾上即可
- 树莓派安装centos7
引用:https://blog.csdn.net/elesos/article/details/80514659 1,格式化 https://www.sdcard.org/downloads/form ...
- Redis使用认证密码登录
Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...