渲染管线、渲染流水线(Rendering Pipeline)
- 数据输入
- 可编程顶点处理器
- 曲面细分(外壳着色器、曲面细分、域着色器)
- 几何着色器
- 光栅化
- 像素着色器(可编程片段处理器)
- 数据输出
不常见的Shader
Geometry Shader
[maxvertexcount(NumVerts)]
void shaderName(PrimitiveType DataType Name[NumElements], inout StreamOutputObject);
//PrimitiveType的操作单位为图元,包括point,line,triangle
//StreamOutputObject包括PointStream, LineStream, TriangleStream
示例:草体制作
传入图元point(v0 - v11)
以传入的point为根,生成草体,即 5个quad、10个triangle
-
贴图
- 草体颜色 color layer (tex1)
- 草体轮廓 alpha layer(tex2) Alpha通道图
- 不使用Blend,使用alpha to coverage
-
草地网格
- Height Map 单个Mesh顶点的上限为65000
-
生成草根
- 根据高度信息+随机生成root point
- Unity的Mesh默认PrimitiveType = triangle
- 设置indexbuffer时可以指定topology为point
-
动态草地
- 三角函数+随机性
- 风对草体的不同部位有不同的影响
- 修改坐标
参考链接:
- https://github.com/chenjd/Realistic-Real-Time-Grass-Rendering-With-Unity
- https://zhuanlan.zhihu.com/p/29632347
Compute Shader
- 利用GPU并行计算的能力实现一些菲渲染任务
- D3D 11 DirectCompute
- Unity: ComputeShader类
通过脚本执行ComputeShader
#pragma kernel CSMain
//kernel指令用来指名计算函数,可以定义多个kernel函数
//Creat a RenderTexture with enableRandomWrite flag and set it with cs.SetTexture
RWTexture2D<float4> Result;
//RWTexture2D为可读写纹理,在cs中还可以操作数据类型buffer
[numthreads(8,8,1)] //定义线程组内的线程模型
void CSMain(unit3 id:SV_DispatchThreadID)
{
Result[id.xy] = float4(id.x & id.y, (id.x &15)/15.0, (id.y &15)/15.0, 0.0);
}
- Compute Shader将并行计算的问题分解成了多个线程组,每个线程组内又包含了多个线程。
执行Compute Shader
-
在C#脚本中准备、传送数据,分配线程组并执行Compute Shader,最后数据再从GPU传递回CPU
this.kernelHandle = cshader.FindKernel("CSMain"); ...... cshader.SetBuffer(this.kernelHandle, "boidBuffer", buffer); //Boid行为模拟, Boid = bird-oid object,类似鸟的物体(1986年Craig Reynolds提出,大群落行为模拟) ...... cshader.Dispatch(this.kernelHandle, this.boidsCount, 1,1); buffer.GetData(this.boidsData); ......
大群落的行为模拟
- 群体中的个体包括三种基本行为:
- Separation,个体会规避周围其他个体。
- Alignment,作为具有前进方向的群体中的个体,可以根据自己周围的同伴的前进方向获取一个前进的方向。
- Cohesion,群体需要具有向心力,个体需要能够根据自己周围同伴的位置信息获取一个向中心聚拢的方向。