# introduction
- 这伙人以前做了TressFX
- 本来是想做个extension,用来搞草,渲染invididual grass blade,用rigid bodies和wind来搞interaction
# 26.2 Render Grass Blades
- 前人“Rendering Grass in Real Time with Dynamic Light Sources.”的方法是用抛物线(parabolic)来procedure生成草的形状,但是也有问题那就是太单一
- 这里的办法:用instancing,5个type,每个type的草16个knot
- 产生variance的办法:
- length按照normal distribution分布
- 不同的草出现频率不同
- 从stem到blade。stem只是line segment,要把line segment变成quad
- expansion direction follows binormal of grass blade
- width chosen by user,这样又不同宽度的草
- 本来想的是用geometry shader从真line segment生成2个triangle,结果发现性能不行,改成输入就是2个degraded triangle,VS里把他们改成需要的样子。用vertexid来mod2,让重合的2个点往不同方向expand
- shading model
- cheap的phong,但是ambient用hemispherical ambient light(大概就是说有个sky向量,根据normal和这个的dot来决定这个表面多么对这天,然后天和地各有一个ambient light)
- 试过了screen-space translucency,但是效果没多大提升还多了50个指令,所以没用
- 双面的问题:这里为了能正反面用不同的texture还需要用SV_IsFrontFace
# 26.3 Simulation
- 感觉好像默认大家都知道TressFX所以说得很简单
- 3 constraits,integrating gravity
- edge length
- global shape
- local shape
- 比起TressFX的一些简化
- head transform不用
- global shape constraint不用
- 就只要length constraint和local shape constraint就好
- 防止草入地,就是让所有vertex都比blade root vertex高就行
## 26.3.1 master slave
- 就是有些草是master,有些草是slave。master是自己动的,slave跟着master动,但是会加个perturbation
## 26.3.2 distance sort
- 使用compute shader做sort,用radix sort在gpu上做,而且距离是quantized.如果quant成8bit就只需1pass,32bit要4pass
- 还需要获得近于一个distance的草总共有多少这样的数据。用来控制simulation
## 26.3.3 Wind
- TressFX里,vertex收到wind和edge vector的影响。草简化,只是让vertex沿着wind vector的方向移动
- global tidal:附近的草move together,sweep the grass field with large cylindrical bar(这个是直接用了collision system)