Unity&Shader基础篇-概述
来源:互联网 发布:华为网络助手在哪里 编辑:程序博客网 时间:2024/06/06 13:07
- 应用程序阶段:使用高级编程语言(C、C++、Java等)进行开发,主要和CPU进行打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等景等经典算法在此阶段执行
- 几何阶段:主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU进行运算,在该阶段之后得到了经过变化和投影之后的顶点坐标、颜色以及纹理坐标——《实时计算机图像学》
- 光栅阶段:基于几何阶段的输出数据,为像素正确配色,以便绘制完整的图形,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(Color buffer或者Frame buffer)中,光栅化得到的屏幕坐标值通常都是浮点型的而像素都是整数表示,通常最后绘制到屏幕上的都是这两个整数点之间进行插值得到线段上某些点上。
2.2、GPU上的两个组件:Vertex Program和Fragment Program
Vertex Program:从GPU中提取图元信息(顶点位置、法向量、纹理坐标等)完成顶点坐标空间转换,法线向量空间转换光照计算等操作。
Fragment Program:将Vertex Program的输出作为输入对每个片段的颜色进行计算,最后将处理后的数据送光栅操作模块进行光栅化。
什么是片段,它和像素有什么不一样?:片段其实就是所有的三维顶点在光栅化之后得到的数据集合,这些数据没有经过深度值的比较,而在屏幕上显示的像素都是经过深度值比较的。
- Object Space,模型坐标空间:这个过程才有真正意义上的投影,投影主要有两种方法:正投影(也称为平行投影)和透视投影。而裁剪是一个较大的概念,为了减少需要绘制的顶点个数,而识别指定区域内或区域外的图形部分的算法都称之为裁剪,裁剪算法包括:视域剔除、背面剔除、遮挡剔除和视口裁剪。
- World Space,世界坐标空间:顶点法向量的计算在此过程
- Eye Space,观察坐标空间,在Unity中即为虚拟摄像机坐标空间:以虚拟摄像机为原点,由视线方向、视角和远近平面共同组成一个梯形的三维空间
- Clip and Project Space,屏幕坐标空间
- float,32位浮点数据
- half,16位浮点数据
- int,32位整形数据
- fixed,12位定点数
- bool,布尔数据
- sampler*,纹理对象的句柄:sampler、sampler1D,sampler2D,sampler3D,samplerCUBE,samplerRECT
- string,字符类型
- float4为float类型的4元向量,bool3为bool类型的三元向量,向量最长不能超过4元
- Cg中向量、矩阵与数据是完全不同的、向量和矩阵是内置的数据类型,而数据是一种数据结构,在其他高级语言中数组,向量和矩阵都是一种数据结构
2.3.3、Cg表达式与控制语句:关系操作符、逻辑操作符、数学操作符、位移操作符以及Swizzle操作符:
float4(a, b, c, d).xyz 等价于 float3(a, b, c)
float4(a, b, c, d).xyy 等价于 float3(a, b, b)
float4(a, b, c, d).wzyx 等价于 float4(d, c, b, a)
float4(a, b, c, d).w 等价于 float d
中float a 和float1 a是基本等价的,两者可以进行类
型转换;float、bool、half等基本类型声明的变量也可以使用swizzle操作符。例
如:
float a = 1.0;
float4 b = a.xxxx;
2.3.4、Cg语言的其他一些特性
- 数组形参:Cg中不存在指针机制,数组作为函数形参传递的是数组的完全拷贝注意:形参数组不必指定长度,如果指定了长度在调用函数是实参数组的长度和形参数组的长度必须一致,最好不要指定长度。
- CG函数重载方式和C++基本一致
- 由于着色程序分为定点程序很片段程序,两者对应着图形流水线上的不同阶段,所以两个程序各有且只有一个入口函数,当程序今夕编译时必须要指定入口函数,除非入口函数为main.
- 如何确定定点和片段程序的入口函数?顶点程序:接收应用程序传递的顶点数据(通常位于模型坐标空间)进行坐标空间转换和光照处理,输出投影坐标和计算得到的光照颜色片段程序:接收从顶点程序输出的数据并进行像素颜色计算。
- 所以通常通过观察程序的输入输出语义绑定就可以区分函数对应的是顶点程序还是片段程序
齐次坐标的本质是什么?
1、两条平行线是否可以相交一点?
在欧氏几何空间,同一平面的两条平行线不能相交,这是我们都熟悉的一种场景。
然而,在透视空间里面,两条平行线可以相交,例如:火车轨道随着我们的视线越来越窄,最后两条平行线在无穷远处交于一点。
2、为什么叫齐次坐标?
简而言之,齐次坐标就是用N+1维来代表N维坐标
3、齐次坐标的本质是什么?
我们可以在一个2D笛卡尔坐标末尾加上一个额外的变量w来形成2D齐次坐标,因此,一个点(X,Y)在齐次坐标里面变成了(x,y,w),并且有
X = x/w
Y = y/w
例如,笛卡尔坐标系下(1,2)的齐次坐标可以表示为(1,2,1),如果点(1,2)移动到无限远处,在笛卡尔坐标下它变为(∞,∞),然后它的齐次坐标表示为(1,2,0),因为(1/0, 2/0) = (∞,∞),我们可以不用”∞"来表示一个无穷远处的点了
证明两条直线可以相交:
3、Unity中如何使用Cg编写Shader
3.1、Shader程序的基本结构:首先是一些属性定义,用来指定这段代码将有哪些输入。接下来是一个或者多个的子着色器,在实际运行中,哪一个子着色器被使用是由运行的平台所决定的。子着色器是代码的主体,每一个子着色器中包含一个或者多个的Pass。在计算着色时,平台先选择最优先可以使用的着色器,然后依次运行其中的Pass,然后得到输出的结果。最后指定一个回滚,用来处理所有Subshader都不能运行的情况(比如目标设备实在太老,所有Subshader中都有其不支持的特性)。
3.2,Shader的程序:
Shader
"Cg basic shader"
{
// 定义Shader的名字
SubShader{
// Unity会选择最适合GPU的subshader块
Pass{
// 一个shader会有多个Pass块
CGPROGRAM
// 开始Unity的shader
#pragma vertex vert //定义一个顶点程序,名为vert
#pragma fragment frag//定义一个片段程序,名为frag
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
return
mul(UNITY_MATRIX_MVP, vertexPos);
//这行代码的作用是使用Unity内置的矩阵UNITY_MATRIX_MVP将顶点输入参数vertexPos进行转换,并将转换后的值作为返回顶点程序的输出参数,片段程序的输入参数
}
float4 frag(
void
) : COLOR
// f片段程序
{
return
float4(1.0, 0.0, 0.0, 1.0);)
//该片段程序返回一个片段输出参加(也即语义COLOR),该代码的意思是设置一个不透明的红色((red = 1, green = 0, blue = 0, alpha = 1))
}
ENDCG
// here ends the part in Cg
}
}
}
- Unity&Shader基础篇-概述
- 【Unity Shaders】Surface Shader 概述
- Unity Shader学习总结(基础篇)
- Unity&Shader基础篇-Cg语法
- Unity&Shader基础篇-“Hello Cg”
- Unity&Shader基础篇-绘制网格+圆盘
- Unity&Shader基础篇-绘制网格+圆盘
- Unity&Shader基础篇—轮廓增强
- 【Unity Shader】基础光照
- Unity Shader基础
- 【Unity Shader】UnityShader基础
- unity shader:数学基础
- Unity Shader入门基础
- unity基础开发--shader基础知识
- 【Unity】Shader编程 基础总结
- Unity Shader 基础1---理论
- 【Unity】Shader编程 基础总结
- Unity Shader 之一 语法基础
- 使用python处理中文csv文件,并让excel正确显示中文
- 蓝牙模块
- 建造者模式
- Android学习一(windows安装Git)
- 计蒜客-程序设计竞赛入门
- Unity&Shader基础篇-概述
- 手机卫士开发第二天
- usaco 2006 nov poj3255 严格次短路
- 沙盒路径、拼接路径、将字符串,二进制Data、照片写入到文件中或读取
- 2016.7训练题目索引
- Window attributes属性详解
- generator自动生成mybatis配置和类信息
- K8s现货交易软件,领先的交易系统
- 在日期数据上加一天