Unity Shader 概述
目录
前言
正文
什么是Shader?
Shader分为两类:
Shader编程语言
在Unity中有3种Shader(其实就是三种不同的写法):
一个Unity Shader的基本结构如下:
材质和Unity Shader的桥梁
答疑解惑
Unity Shader和CG/HLSL之间的关系
GLSL
参考文档
前言
Shader,中文名为着色器,对很多开发者来说它是⼀个神秘的存在,想学但是不知道如何去学,或者学了一段时间发现Get不到它的点,始终感觉游离在外,无法开窍。那么本文将讲下如何从零基础入门Shader,目的在于让初学Shader的程序员或者美术师可以快速进入这个丰富多彩的世界。
正文
什么是Shader?
虽然上面简单说了Shader就是着色器,但还是有必要详细说明⼀下具体什么是Shader。
Shader其实就是专门用来渲染图形的⼀种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。小到每⼀个像素点,大到整个屏幕,比如下面这两个游戏内比较常见的效果:
Shader分为两类:
1.顶点Shader(3D图形都是由⼀个个三角面片组成的,顶点Shader就是计算每个三角面片上的顶点,并为最终像素渲染做准备)
2.像素Shader,顾名思义,就是以像素为单位,计算光照、颜色的⼀系列算法。
几个不同的图形API都有各自的Shader语言,在DirectX中,顶点shader叫做Vertex Shader,像素Shader叫做Pixel Shader;在OpenGL中,顶点Shader也叫做Vertex Shader,但像素Shader叫做Fragment Shader,也就是我们常说的片断Shader或者片元Shader。说白了,Shader其实就是一段代码,这段代码的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。
Shader编程语言
既然Shader是一段代码,那必然要用一种语言来书写它,目前主流的有三种语言:
1.基于OpenGL的OpenGL Shading Language,简称 GLSL。
2.基于DirectX的High Level Shading Language,简称 HLSL。
3. 还有NVIDIA公司的C for Graphic,简称 Cg语言。
GLSL与HLSL分别是基于OpenGL和Direct3D的接口,两者不能混用。而 Cg语言是用于图形的C语言,这其实说明了当时设计人员的一个初衷:
让基于图形硬件的编程变得和C语言编程一样方便、自由,让基于图形硬件的编程变得和C语言编程一样方便、自由。(正如 C++ 和 Java 的语法是基于C的,Cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的)
Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等。Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL和Cg其实是同一种语言。
(有关基础语法可以先移步至unity shader 之基础五 基本语法_TO_ZRG的博客-CSDN博客)
Unity Shader严格来说并不是传统上的Shader,而是Unity自身封装后的一种便于书写的Shader,又称为Shader Lab。
在Unity中有3种Shader(其实就是三种不同的写法):
Surface Shaders 表面着色器
Vertex Fragment Shaders 顶点/片断着色器
Fixed Function Shaders 固定管线着色器
其中Fixed Function Shaders已经被淘汰,完全没有学习的必要了。
Surface Shader其实就是Unity对Vertex Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。
一个Unity Shader的基本结构如下:
Shader "ShaderName"
{
Properties {//属性 }
SubShader {//显卡A使用的子着色器 }
SubShader {//显卡B使用的子着色器}
}
而Unity会在背后根据使用的平台来把这些结构编译成真正的代码和Shader文件。
材质和Unity Shader的桥梁
Properties语义块中包含了一系列属性(Property),这些属性将会出现在材质面板中。
Properties { Name {"Display name", PropertyType} } = DefaultValue
其中Name是Shader中调用需要的属性,display name是出现在材质面板山的名字,PropertyType则是属性的类型。
答疑解惑
Unity Shader和CG/HLSL之间的关系
Unity Shader是用Shader Lab语言编写的,但对于表面着色器和顶点/片元着色器,我们可以在ShaderLab内部嵌套CG/HLSL语言来编写着色器代码。
通常CG代码块是位于Pass语义块内部的,如下所示:
GLSL
Unity Shader同样支持用GLSL进行编写,但是编写的产品则只能上架支持OpenGL的平台。
参考文档
NVIDIA提供的CG文档
NVIDIA提供的系列教程
Unity官方手册提供的Shader教学文档
Unity Shader 概述相关推荐
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...
- 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...
- Unity Shader入门精要——第3章 Unity Shader基础
Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...
- 《 Unity Shader 入门精要》 第3章 Unity Shader 基础
第3章 Unity Shader 基础 3.1 Unity Shader 概述 材质与 Unity Shader 在 Unity 中我们通常需要将材质(Material) 和 Unity Shader ...
- Unity Shader入门精要第3 章 Unity Shader 基础
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity Shader 概述 二.使用步骤 1.3.1.2 Unity 中的材质 2.Unity 中的Shader 3.Unity ...
- Unity Shader入门笔记
学习资料:https://onevcat.com/2013/07/shader-tutorial-1/猫都能学会的Unity3D Shader入门指南(一)(二) 学习资料:http://98jy.n ...
- 【Unity Shader】屏幕后处理2.0:实现Sobel边缘检测
边缘检测是描边效果的一种实现方法,关于描边效果其实还有更好的基于深度+法线纹理实现的方法,这里就先以边缘检测为主进行学习. 1 理解卷积 参考:深入理解卷积(卷积核到底要不要翻卷) [深度学习]深度学 ...
- 【Unity Shader】用Cubemap实现天空盒和环境映射
1 关于Cubemap Cubemap在实时渲染中有很多应用,最常见的就是实现天空盒(Skybox)和环境映射(Environment Mapping). 2 实现天空盒 2.1 实现原理 天空盒不陌 ...
- Unity3D学习笔记3——Unity Shader的初步使用
文章目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. ...
最新文章
- python官网下载手机版步骤-Python
- python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc
- 教室工资管理系统c语言课程设计csdn,工资管理系统(C编写)
- 基于sklearn.decomposition.TruncatedSVD的潜在语义分析实践
- java机器PDF_机器人制作入门(第3版)PDF 下载
- elasticsearch删除索引后再新建时踩的坑
- docker运行redis命令
- linux wps 微软雅黑字体,微软雅黑字体下载,微软雅黑字体下载应用到wps
- Beyond Compare 4 “授权秘钥已被吊销“ 的解决办法
- c++闭区间内的素数
- WPS格式文件转图片格式如何进行操作
- Istio:服务发现和Pilot的架构机制
- 经典BBS语录2007贺岁版
- 电脑黑屏只有鼠标箭头怎么修复 电脑开机黑屏的修复办法
- php 标点符号,php 过滤英文标点符号及过滤中文标点符号代码_PHP教程
- ORBSLAM3中的MLPnP在重定位时计算当前帧和候选帧的位姿变换
- c语言基础-变量(字符型)
- 【2019年05月16日】A股最便宜的股票
- [转载] Linux架构
- 哈工大、哈工程被禁用「工科神器」MATLAB,美国「实体名单」影响深入校园