unity shader 有三种形式:表面着色器(Surface Shader),顶点/片元着色器(Vertex/Fragment Shader),固定函数着色器(Fixed Function Shader)

表面着色器是unity自创的一种着色器代码类型,在本质上与顶点/片元着色器是一样的,可以理解为表面着色器是对顶点/片元着色器的以更高一级的抽象。

顶点/片元着色器可以使用CG/HLSL语言编写,它比表面着色器更复杂也更灵活。

由于有些老旧设备(如iphone3)不支持可编程管线着色器,就需要用固定函数着色器,这些着色器往往值能实现一些简单效果。在unity5.2中,固定函数着色器在背后会被编译成顶点/片元着色器。

所以以下只介绍顶点着色器

下为一个简单的顶点/片元着色器

Shader "Custom/NewShader" {
//NewShader为这个着色器的名字,Custer为路径
Properties{
      //Properties为属性,下面会给出各种类型的属性
  _Range("Range",Range(0.0,1))=1
  _Color("Color Tint",Color)=(1,1,1,1)       //_Range和_Color为声明的两个属性
}
SubShader{
      //一个着色器可以有多个SubShader,渲染时如果显卡不能使用第一个SubShader那么显卡会依次查找下一个SubShader,如果都不能使用,
      //那么会使用FallBack的着色器

      Tags{"RenderType"="Opaque"}
      Cull Off
//Tags为一个标签,定义在SubShader下的Tags会对该SubShader下的所有Pass代码块都起作用,
     //也可以在Pass里面为该Pass单独定义Tags,但是不能在Pass下声明SubShader类型的标签。在下面给出SubShader的标签类型      //Cull Off为一个状态,出现在SubShader下还是Pass下与Tags一样,下面给出常见状态设置
Pass{
          //Pass语块,下面给出Pass语块结构
Tags{"LightMode"="ForwardBase"}
               //Pass标签               //开始CG代码片段
CGPROGRAM
              //顶点/片元着色器需要写在CGPROGRAM和ENDCG之间               //该代码片段的编译指令,这里这两条编译指令告诉Unity 名为vert的函数包含了顶点着色器代码,
              //名为frag的函数包含了片元着色器代码
#pragma vertex vert
#pragma fragment frag
  
               //CG代码
              
              //为了能够使用Properties中定义的属性这里要做一个匹配
fixed _Range;
fixed4 _Color;
              
              //顶点着色器,逐顶点执行的
              //就跟一般函数一样有返回值,参数,方法体
float4 vert(float4 v:POSITION):SV_POSITION{
              //float4 v:POSITION,还有后边的SV_POSITION 都是CG/HLSL中的语义,告诉系统用户需要输入那些输入值,以及输出的是什么
              //这里POSITION告诉unity把模型的顶点填充到参数v中,SV_POSITION告诉unity输出的是裁剪空间中的顶点坐标,这些语义不可省略
              //语义以后再说吧...
                   
                  //UnityObjectToClipPos(v)意思就是把顶点v从模型空间转换到裁剪空间
return UnityObjectToClipPos(v);
}               //片元着色器
fixed4 frag():SV_Target{
              //SV_Target语义告诉渲染器把用户的输入颜色存储到一个渲染目标中,这里将输出到默认的帧缓存
              //没有输入,只是简单的输出了表示颜色的fixed4的变量,(0,0,0)表示黑色,(1,1,1)表示白色
return fixed4(_Color)*_Range; }
              //结束CG代码片段
ENDCG
              //其他设置
}
//Pass{}//其他Pass语块
}
//SubShader{}//其他显卡的SubShader
FallBack "Diffuse"//上面所有SubShader在该显卡上都不能使用时使用这个,这里的写法会向其他物体投射阴影,换成FallBack Off就不能,这里不说明了。。。
}

  Properties语义块支持的属性类型

SubShader的标签类型

SubShader的标签是一个键值对,它的键和值都是字符串类型,用来告诉UNITY的渲染引擎我们希望怎么以及何时渲染这个对象

常见的渲染状态设置

这些指令设置显卡的各种状态,比如是否开启混合/深度测试

Pass语块结构

Pass{

[Name]

[Tags]

[RenderSetup]

//其他代码

}

通过Pass的名称(如 Name "MyPass")可以使用ShaderLab的UsePass命令类直接使用其他unity shader 的Pass提高代码复用

如 UsePass "MyShader/MYPASS",注意,使用UsePass命令是必须使用大写

Pass标签,也是告诉引擎怎么渲染物体的,下为Pass标签类型

渲染状态设置,SubShader中的设置同样适用于Pass

效果图如下

unity shader入门(一):基本结构话痨版的更多相关文章

  1. Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

    转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...

  2. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...

  3. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

  4. Unity Shader入门精要学习笔记 - 第11章 让画面动起来

    转自 冯乐乐的 <Unity Shader入门精要> Unity Shader 中的内置变量 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化.Unity ...

  5. Unity Shader入门精要学习笔记 - 第9章 更复杂的光照

    转载自 冯乐乐的<Unity Shader入门精要> Unity 的渲染路径 在Unity里,渲染路径决定了光照是如何应该到Unity Shader 中的.因此,如果要和光源打交道,我们需 ...

  6. Unity Shader入门精要学习笔记 - 第8章 透明效果

    转载自 冯乐乐的 <Unity Shader入门精要> 透明是游戏中经常要使用的一种效果.在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道.当开启透明混合后,当一个物体被渲染 ...

  7. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色. 在美术 ...

  8. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  9. Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

    摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...

随机推荐

  1. 关于使用sudo找不到环境变量的问题

    参考这里:https://www.cnblogs.com/zhongshiqiang/p/10839666.html 使用sudo -E 保留当前用户环境,这时就不会存在找不到环境变量的问题了.

  2. Un-Error-ASP.NET:无法加载协定为“YlbService.MMSHServicesSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。

    ylbtech-Error-ASP.NET:无法加载协定为“YlbService.MMSHServicesSoap”的终结点配置部分,因为找到了该协定的多个终结点配置.请按名称指示首选的终结点配置部分 ...

  3. vue 专题 vue2.0各大前端移动端ui框架组件展示

    Vue 专题 一个数据驱动的组件,为现代化的 Web 界面而生.具有可扩展的数据绑定机制,原生对象即模型,简洁明了的 API 组件化 UI 构建 多个轻量库搭配使用 请访问链接: https://ww ...

  4. LR 算法总结--斯坦福大学机器学习公开课学习笔记

    在有监督学习里面有几个逻辑上的重要组成部件[3],初略地分可以分为:模型,参数 和 目标函数.(此部分转自 XGBoost 与 Boosted Tree) 一.模型和参数   模型指给定输入xi如何去 ...

  5. Docker入门-docker运行springboot应用(二)

    环境准备 jdk8 安装docker 镜像加速器配置 docker私有仓库 springboot工程的jar包 docker部署项目 dockfile Dockfile是一种被Docker程序解释的脚 ...

  6. Visual-Based Autonomous Driving Deployment from a Stochastic and Uncertainty-Aware Perspective

    张宁 Visual-Based Autonomous Driving Deployment from a Stochastic and Uncertainty-Aware Perspective Le ...

  7. WMS 162服务器空间满,清日志

    /usr/local/tomcat-ibus/logs/usr/local/tomcat-ibus/bin/logs/usr/local/tomcat-api/bin/logs/usr/local/t ...

  8. Python爬取视频指南

    摘自:https://www.jianshu.com/p/9ca86becd86d 前言 前两天尔羽说让我爬一下菜鸟窝的教程视频,这次就跟大家来说说Python爬取视频的经验 正文 https://w ...

  9. github 被强了!太丧心病狂了!

    github 不强了! github 不能访问了! github 打不开了! github 被封了... - ping 都 ping 不通, 本地 ping 不通, 服务器 ping 不通. - 本地 ...

  10. ShoeBox一个超级好用的图片切割工具

    下载地址:http://renderhjs.net/shoebox/ ShoeBox是一个图片处理软件,体积很小. 我主要用第三个功能拆开图片.根据大图上的小图空白间隙来处理的. 导出后变成很多小图