【Unity】Shader编程 基础总结
来源:互联网 发布:nga宁芙淘宝店名 编辑:程序博客网 时间:2024/05/22 11:55
Shader编程一直是一个比较难入门难上手的主题,本篇对Unity Shader编程的一些基础和要点进行了总结。
包括Shader编程相关知识图谱、Shader编程相关数据类型、Shader核心结构体等(后续继续补充)。
每个部分相互独立,可以单独参考,亦可作为一个整体参考。
博文首发&持续更新:http://blog.csdn.net/duzixi
一、 Shader编程知识图谱
(.xmind源文件下载地址:http://www.duzixi.com/doc/ShaderStudy.xmind)
之所以屏幕上能够看到一个模型物体,一个是要有这样的“形”,这个信息保存在网格(Mesh)里,另一方面就是有颜色,也就是材质(Material)材质。
当然还有一个前提,就是这个物体在可视范围之内,也就是Camera(摄像机)。
决定材质如何上色的方式,就是Shader(着色器),Shader编程中涉及到的一些基本概念与这三者紧密相关。
首先,网格的顶点坐标会直接影响像素着色的位置,法线和切线会影响光照阴影的呈现方式,而uv坐标决定了贴图采样的颜色等。
其次,Unity引擎中用脚本对Shader复制的方式是通过Material类(材质)的SetXXXX系列方法来实现的,它是脚本与Shader的重要接口之一。
最后,摄像机的位置决定了视线和世界坐标转视图坐标的矩阵值,而组件属性中渲染路径的选择也会决定Shader渲染所选择的通道。
即使没有编写过Shader,我们都在有意无意的使用Shader。
Unity引擎内置的Shader主要依据用途和呈现效果划分,
普通(Nromal)、透明(Transparent)、自发光(Self Illuminated)、反射(Reflective)这一部分内容官方文档已经解释得很详细了。
此外,粒子(Particle)这个系列的Shader特别值得一提。
为什么粒子特效会如此靓丽炫酷,带来视觉效果呢?
其实粒子材质,即Shader和贴图发挥了很大的作用。
Shader中的颜色模型是大家熟知的RGBA模型,单一颜色光的取值范围在0~1之间。
值越大,说明光越强,也就越亮;反之越暗。(0,0,0,1)为黑色,(1,1,1,1)为白色。
这决定了两种基本的颜色叠加模式:加法(Additive)和乘法(Multiply)。
前者越叠加越亮,后者越叠加越暗(可在Particle的内置Shader中找到)。
一个立体的3D模型,在一定的光照情况下,会是什么样子?
画面对“光”的呈现,是靠“影”来完成的。而英文中的“影”就是shade,是指有影的东西,按照英文语法习惯就是shader了。
所以着色器(Shader)的出发点和本元,应该是如何更好的产生阴影。
在计算机中,阴影的计算是靠光照模型完成的。
光照模型有很多,最基本的是以下两种:
- Lambert
- Blinn-Phong
二、 Shader编程数据类型
有了基本的Shader编程知识之后,就可以尝试自己动手写Shader了。
Shader编程中比较麻烦的一点是,同一个变量在不同的语法阶段表示的方式不同,常用变量类型对照如下:
硬件平台
CPU
(Inspector面板设置)
GPU
变量类型
C#脚本语言
ShaderLab 属性
Cg语言
纹理贴图
Texture
2D
sampler2D
颜色
Color
Color
fixed4 / half4
3D贴图
Cubemap
Cube
sampleCUBE
4元素向量
Vector4
Vector
float4
浮点数
float
Float
float
浮点范围
float
Range
float
矩形纹理
Texture
Rect
sampleRect
Cg语言中颜色类型使用4维向量表示的,根据精度选择,可选用fixed4或者half4等。
三、 Shader核心结构体
(1)顶点着色器输入结构体
结构体也可以自定义,但是必须有位置信息
成员类型
成员名
结构体名:
appdata_base
appdata_tan
appdata_full
appdata_img
float4
vertex
位置
1
1
1
1
float3
normal
法线
1
1
1
float4
tangent
切线
1
1
fixed4
color
顶点颜色
1
float4
texcoord
纹理坐标0
1
1
1
1
fixed4
texcoord1
纹理坐标1
1
(2)表面着色器输出结构体
SurfaceOutput
half3
Abedo
反射光
half3
Normal
法线
half3
Emission
自发光
half
Specular
高光
half
Alpha
透明度
参考资料:
【1】Unity 官方文档: Manual -> Graphics -> Graphics Reference -> Shader Reference
【2】Unity内建Shader下载地址:http://unity3d.com/unity/download/archive
【3】Nvidia开发者入口:https://developer.nvidia.com
【4】AMD开发者入口:http://developer.amd.com/tools-and-sdks/
- 【Unity】Shader编程 基础总结
- 【Unity】Shader编程 基础总结
- 【Unity】Shader编程 基础总结
- Unity Shader 基础2---编程基础
- HLSL Shader编程基础总结
- Unity Shader学习总结(基础篇)
- 【Unity Shader】基础光照
- Unity Shader基础
- 【Unity Shader】UnityShader基础
- unity shader:数学基础
- Unity Shader入门基础
- Unity Shader编程(2)Unity Shader初步
- Unity Shader 编程之一
- unity基础开发--shader基础知识
- Unity Shader 基础1---理论
- Unity&Shader基础篇-概述
- Unity Shader 之一 语法基础
- Unity Shader基础(1)
- pyQT指定窗口截图
- std::set作为一个有序集合
- easyui datagrid 避免二次加载
- Windows server2012 桌面设置
- SylixOS ARM BSP 文件结构
- 【Unity】Shader编程 基础总结
- ORACLE定期清理INACTIVE会话
- 共享微信JSSDK的access_token.json
- Windows 7 默认情况下没有 tftp 和 telnet 命令.
- Android创建快捷方式
- usr/bin/ld: cannot find 错误解决方法
- 密码找回漏洞总结
- 修改tomcat项目的图标
- NSPredicate --(谓词查询) Foundation提供的类,它指定数据被获取或者过滤的方式