目录
一. 引子
从 DirectX10 开始 Direct3D 引入了 Stream Output 功能(下称 SO ),它能利用 GPU 进行一些模型操作,其中利用 SO 受益最大的就是 Skinning Animation。在没有 SO 之前蒙皮动画要不就是由 CPU 完成,要不就是每次渲染的时候都需要重新做一次蒙皮,这在多光源光照渲染 Shadow Map 中是非常耗时的,引入 SO 之后只要进行一次蒙皮动画所得到的 Vertex Buffer 可以重用,这样既节省了 CPU 又获得了 GPU 加速。
二.一切从 CreateGeometryShaderWithStreamOutput 说起
1. D3D11 / D3D10 与 Stream Output
D3D10 和 D3D11 使用 SO 的时候需要调用 CreateGeometryShaderWithStreamOutput 函数。虽然看函数名这个函数是要创建一个 Geometry Shader(下称 GS ),但是在实际使用的时候并不一定需要给出 GS 的 Binary Code。像 Skinning 这种操作实际上只需要在 Vertex Shader(下称 VS ) 中就能完成,根本不需要 GS。在调用 CreateGeometryShaderWithStreamOutput 的时候 pShaderBytecode 参数给的是 VS 的 Binary Code,创建好的 ID3D11GeometryShader 对象其实并没有实际代码,只是用来对应 SO 之后数据输出的信息。
把 VB / IB / VS / GS 设置进渲染管