1.Shader初识
找了下网上适合入门shader的教材
https://blog.csdn.net/u014732824/article/details/102959342
https://www.zhihu.com/column/unityTA
什么是shader?
shader就是着色器,简单来说就是由开发者来自定义游戏里物体的渲染方式
类似下下面小球的效果(来自知乎tae)
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++和 Java的语法是基于C的,Cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等。
Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL和Cg其实是同一种语言。
cg语言有很好的跨平台性,是属于glsl和hlsl的上层,可以在directx和opengl上被广泛支持,即Cg程序是运行在OpenGL和DirectX标准顶点和像素着色的基础上的。
什么是Unity Shader
显卡有NVIDIA、ATI、Intel等等。。。
图形API有OpenGL、DirectX、OpenglES、Vulkan、Metal等等。。。
Shader编程语言有GLSL、HLSL、Cg等等。。。
是不是有点头晕,该怎么去选择呢?在Unity中我们又应该如何做呢?
其实在Unity中反而一切变的简单起来了,我们只需关心如何去这实现我们想要的效果就好了,其余的事情全部交给Unity来自动处理。因为我们在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言,那么我们在Unity中应该用什么语言来书写Shader呢?
官方的建议是用Cg/HLSL来编写,当然你也可以使用GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使用Cg/HLSL来编写Shader程序。
Unity Shader严格来说并不是传统上的Shader,而是Unity自身封装后的一种便于书写的Shader,又称为ShaderLab。
在Unity中有3种Shader(其实就是三种不同的写法):
- Surface Shaders 表面着色器(unity独有)
- Vertex/Fragment Shaders 顶点/片断着色器
- Fixed Function Shaders 固定管线着色器
其中Fixed Function Shaders已经被淘汰,完全没有学习的必要了。
Surface Shader其实就是Unity对Vertex/Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。
surface shader 和 Vertex/Fragment Shader的区别就是 前者不一定能实现后者所实现的效果,后者一点能shixian实现前者能实现的效果。
并且在Unity2018后的版本中推出了Unity官方自己的可视化Shader工具(Shader Graph)。从生成的代码上来看,也全部是用的Vertex/Fragment Shader,那是不是可以理解为在今后的可编程渲染管线中,Unity自己也抛弃了Surface Shader,而全部采用了Vertex/Fragment Shader?
另外,学会Shader也会给我们带来很多的好处:
1. 游戏中模型显示粉色的情况你一定碰到过吧,是Shader丢失呢,还是Shader不符合当前平台呢,又或者是Shader上有语法的错误呢?如果我们有了解并学会Shader的话,这些问题就不会再是一脸懵逼啦。
2. 內建Unity Shader仅仅只是“通用”用例,不足以满足我们所有的画面表现需求。
3. 一旦掌握Shader,可以为游戏/应用创造独一无二的视觉享受。根据实际需求,为游戏和应用实现特定功能的Shader。
4. 能大大的帮助我们做渲染上的性能优化,因为通过Shader可以控制渲染什么以及如何渲染。
5. 撰写Shader的能力对于游戏团队非常重要,掌握Shader技能的开发一直是炙手可热的职位。现在一个不争的事实就是,技术美术永远是各大厂商的稀缺资源。
1.Shader初识相关推荐
- 初识Unity Shader 流光闪烁效果
初识Unity Shader 流光闪烁效果 // An highlighted block Shader "Custom/mistake" {Properties {_node_1 ...
- 【猫猫的Unity Shader之旅】之初识屏幕特效
Shader除了可以处理模型的显示效果外,还有一个腻害的功能就是对要渲染的画面进行整体的处理,也就是屏幕特效.常见的比如<鬼泣4>里的动态模糊效果,景深效果,还有一些全局的颜色矫正,比如可 ...
- 第一篇 初识庐山真面目 ——Unity 3D Shader(2)
文章目录 第二章 Unity中的Shader(着色器)的形态 2.1 Unity通过ShaderLab来组织Shader 2.1.1 关键字 Shader 2.1.2 使用SubShader组织Sha ...
- 第一篇 初识庐山真面目 ——Unity 3D Shader(4)
文章目录 第四章 基本的光照模型 4.1 光源对物体照明的分类 4.1.1 间接照明 4.1.2 直接照明 4.2 照明的计算方式:光照模型 4.2.1 漫反射和Lambert 4.2.2 镜面高光和 ...
- 大神驾到 | 麒麟子带你初识Cocos Shader
一.什么是Cocos Shader 可能有朋友会感到奇怪,百度上搜不到Cocos Shader. 那就对了,因为Cocos Shader 是 Cocos Creator 3D Shader的简称. 是 ...
- 初识OpenGL (3)片段着色器(Fragment Shader)
step1. 片段着色器 计算像素最后的颜色输出. 片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来. #version 330 core o ...
- GPU处理图像 Shader的入门
from:http://www.jianshu.com/p/8687a040eb48 字数2901 阅读316 评论0 喜欢3 Shader着色器 Shader出现在OpenGL ES 2.0中,允许 ...
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是 ...
- DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
目录 1.前言及本章内容提要 2.初识DirectXMath库 3.使用独立堆创建常量缓冲 4.理解管线状态对象 5.理解围栏同步 6.完整代码 1.前言及本章内容提要 经过了之前3篇教程的跨度有点大 ...
最新文章
- Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法...
- 玩转oracle 11g(17):命令学习5
- 实例31:python
- VC编写和调用DLL的简单例子
- python面向对象编程(2)
- shell脚本100例
- [黑科技] 使用Word和Excel自制题库自判断答题系统
- 通俗理解三维向量的点乘与叉乘
- 如果将编程语言变成女孩子,你更“喜欢”哪些呢?
- Apache POI 之 初学实战篇 (四) --- 文本对齐
- Win10笔记本WIFI的标志突然变成了一个地球的解决方案(二)
- php撤回一步,PS怎么撤回很多步
- java动物识别_java编写的专家系统(人工智能)动物识别
- [CSP-J 2019] 加工零件题解
- ARM Linux设备树
- Mathematica绘制动态蔓叶线
- vdd和vss有什么区别
- 吴会计的烦恼,网络推广没效果
- 视网膜数据集(4)HRF
- 微信公众号开发环境搭建(一)
热门文章
- 游戏技巧-《我的世界》地图存档简介及使用
- 一种更易用的视频播放器的UI设计
- 【论文阅读】Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks
- 【二分法】POJ3258-River Hopscotch
- 英特尔12代酷睿架构,十二代酷睿架构
- ServletContext对象
- 关于百度云推送加厂商进行app离线推送的步骤小记
- 变态的windows----OERR: ORA-27100 shared memory realm already exists
- videojs重播_Video.js:最后显示大播放按钮
- 获取中国省、市、区数据(调用高德API)