Shader介绍
Shader是可编程图形管线的算法片段,它主要分为两类,Vertex Shader和Fragment Shader。
圣典shader总目录(在最下方)
相关书籍:
- 《Unity Shaders and Effects Cookbook》,下载,博客 ,英文书(有一定英文基础)
- 《unity shader入门精要》 下载 , 彩色插图 ,源码 ,第4章勘误章.pdf(勘误列表); 适合初学者学习
- 《GPU 编程与CG 语言之阳春白雪下里巴人》,下载,可以帮助你了解硬件,此书作者水平很高
- 《Real-Time Rendering 3rd》,下载,这本书更多资料,博客,相关介绍,笔记,经典之作,不过不适合入门,《Real-Time Rendering 4th》,将于2018年8月15号面世
- 《Physically Based Rendering:From Theory to Implementation》(PBRT),pbrt网站,下载(第三版),勘误表,书上的例子,Wikipedia网页
- 《Advanced Global Illumination》,Wikipedia网页,下载
- 《untiy3d ShaderLab实战详解》 下载,适合入门学习
- 《3D数学基础:图形与游戏开发》 下载,如果真的想学好shader,学数学是必须的,比较全面,适合入门学习
- 《GPU编程精粹》 知乎专栏,《GPU Gems》1~3 (Web版)、《GPU Pro》1~7 以及《GEM Zen》组成的GPU精粹系列书籍,书籍,这个大神可以试试,初学者不太适合学习
- 《Unity5.X从入门到精通》 下载
- 《全局光照技术:从离线到实时渲染》
相关网站:
渲染管线
渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。一个流水线式一序列可以并行和按照固定顺序进行的阶段。每个阶段都从它的前一阶段接收输入,然后把输出发给随后的阶段,就像一个在同一时间内,不同阶段不同的汽车一起制造的装配线,传统的图形硬件流水线以流水方式处理大量的顶点、几何图元和片段。
Shader Language
基于OpenGL的OpenGL Shading Language, 简称GLSL。语法体系自成一家。
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
基于DirectX的High Level Shading Language,简称HLSL。移植性较差。
DirectX,(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛使用于Microsoft Windows、Microsoft XBOX、Microsoft XBOX 360和Microsoft XBOX ONE电子游戏开发,并且只能支持这些平台。最新版本为DirectX 12,创建在最新的Windows10。
还有NVIDIA公司的C for Graphic ,简称Cg语言。可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。
Shader Reference(圣典)
- SurfaceShader(表面着色器):Untiy自己发扬光大的一项使书写门槛降低和更容易的技术。把Shader的复杂性包装起来,书写过程更便捷和易用。
- Vertex Shader and Fragment Shader(顶点着色器&片段着色器):顶点着色器---->产生纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。片段着色器---->进行纹理查找,决定什么时候执行纹理查找,是否进行纹理查找,及把什么作为纹理坐标。
- FixedFunction Shader(固定功能着色器):Unity为Shader的书写自带的一层壳,Unity已经在内部为我们做了大量的工作,我们只要稍微记住一些关键字、一些规范就可以实现很多不错的效果。固定功能着色器是我们初学Unity Shader的最贱几篇文章中的主要学习对象。而后面的表面着色器、顶点着色器以及片段着色器就是在固定功能着色器的基础上嵌套了CG语言的代码而成的更加复杂的着色器。
区别:
- 没有嵌套CG语言,也就是代码段中没有CGPROGARAM和ENDCG关键字,就是固定功能着色器。
- 嵌套了CG语言,代码段中有surf函数的,就是表面着色器。
- 嵌套了CG语言,代码段中有#pragma vertex name和 #pragma fragment frag 声明的,就是顶点着色器&片段着色器
Shader---->路径(直接决定shader在material里出现的路径 )
Shader "Custom/LogoShader" {
}
Properties---->属性面板
2D:一张2的阶数大小的贴图,这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终显示出来。
Cube:即Cube map texture(立方体文理),简单说就是6张有联系的2D贴图的结合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应的采样。
对于贴图来说,默认值可以是空字符或者"White"、"Black"、"Gray"、"Bump"中的一个,另外{},它只对2D、Rect、Cube贴图有关,当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔,
name ("display name", 2D) ="name" { options }
注:包含在纹理属性的大括号中的选项Options是可选的,可能选项如下:
- TexGen纹理生产类型:即纹理的自动生成纹理坐标时的模式,可以是ObjectLinear, EyeLinear,SphereMap, CubeReflect, CubeNormal的其中之一;这些模式和OpenGL纹理生成模式相对应。注意如果使用自定义顶点程序,那么纹理生成将被忽略。如下面的例子。
- LightmapMode光照贴图模式:如果我们给出这个选项,纹理将能被渲染器的光线贴图属性所影响。纹理不能被使用在材质中,而是取自渲染器的设定。
_MainTex ("Albedo (RGB)", 2D) = "white" {TexGen ObjectLinear}
关键字 | 类型 | 对应Cg类型 | 例 |
---|---|---|---|
Float | 浮点数 | float | _MyFloat ("My float", Float) = 0.5 |
Range | 浮点数 (在指定范围内) | float | _MyRange ("My Range", Range(0.01, 0.5)) = 0.1 |
Color | 浮点四元组 | float4 | _MyColor ("Some Color", Color) = (1,1,1,1) |
Vector | 浮点四元组 | float4 | _MyVector("Some Vector",Vector) = (1,1,1,1) |
2D | 2的阶数大小的贴图 | sampler2D |