渲染管線踊沸、渲染流水線(Rendering Pipeline)
- 數(shù)據(jù)輸入
- 可編程頂點(diǎn)處理器
- 曲面細(xì)分(外殼著色器、曲面細(xì)分岛蚤、域著色器)
- 幾何著色器
- 光柵化
- 像素著色器(可編程片段處理器)
- 數(shù)據(jù)輸出
不常見的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個(gè)quad、10個(gè)triangle
-
貼圖
- 草體顏色 color layer (tex1)
- 草體輪廓 alpha layer(tex2) Alpha通道圖
- 不使用Blend瑰剃,使用alpha to coverage
-
草地網(wǎng)格
- Height Map 單個(gè)Mesh頂點(diǎn)的上限為65000
-
生成草根
- 根據(jù)高度信息+隨機(jī)生成root point
- Unity的Mesh默認(rèn)PrimitiveType = triangle
- 設(shè)置indexbuffer時(shí)可以指定topology為point
-
動(dòng)態(tài)草地
- 三角函數(shù)+隨機(jī)性
- 風(fēng)對(duì)草體的不同部位有不同的影響
- 修改坐標(biāo)
參考鏈接:
- https://github.com/chenjd/Realistic-Real-Time-Grass-Rendering-With-Unity
- https://zhuanlan.zhihu.com/p/29632347
Compute Shader
- 利用GPU并行計(jì)算的能力實(shí)現(xiàn)一些菲渲染任務(wù)
- D3D 11 DirectCompute
- Unity: ComputeShader類
通過腳本執(zhí)行ComputeShader
#pragma kernel CSMain
//kernel指令用來指名計(jì)算函數(shù)齿诉,可以定義多個(gè)kernel函數(shù)
//Creat a RenderTexture with enableRandomWrite flag and set it with cs.SetTexture
RWTexture2D<float4> Result;
//RWTexture2D為可讀寫紋理,在cs中還可以操作數(shù)據(jù)類型buffer
[numthreads(8,8,1)] //定義線程組內(nèi)的線程模型
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將并行計(jì)算的問題分解成了多個(gè)線程組晌姚,每個(gè)線程組內(nèi)又包含了多個(gè)線程粤剧。
執(zhí)行Compute Shader
-
在C#腳本中準(zhǔn)備、傳送數(shù)據(jù)挥唠,分配線程組并執(zhí)行Compute Shader抵恋,最后數(shù)據(jù)再?gòu)腉PU傳遞回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); ......
大群落的行為模擬
- 群體中的個(gè)體包括三種基本行為:
- Separation,個(gè)體會(huì)規(guī)避周圍其他個(gè)體懊烤。
- Alignment梯醒,作為具有前進(jìn)方向的群體中的個(gè)體,可以根據(jù)自己周圍的同伴的前進(jìn)方向獲取一個(gè)前進(jìn)的方向腌紧。
- Cohesion茸习,群體需要具有向心力,個(gè)體需要能夠根據(jù)自己周圍同伴的位置信息獲取一個(gè)向中心聚攏的方向壁肋。