在Unity官方文档的介绍中,SetRenderTarget可以设置渲染目标。
- 屏幕的渲染目标可以通过Graphics.activeColorBuffer和Graphics.activeDepthBuffer获取。
其中Graphics.activeDepthBuffer当中包括了stencilbuffer和depthbuffer。
- commandbuffer当中同样可以使用BuiltinRenderTextureType.Color和BuiltinRenderTextureType.depth来访问对应的渲染目标,但是BuiltinRenderTextureType.depth是不包括stencilbuffer的。
- 如果想要复用包含stencilbuffer的Graphics.activeDepthBuffer,是不能通过SetRenderTarget和自定义的ColorBuffer组合的,会报错。因为screen的buffer和rendertarget的buffer不能混合使用。
- 如果只需要复用同一张depth,只需要使用BuiltinRenderTextureType.depth和自定义的colorbuffer即可。
- 如果需要复用同一张depth/stencil,必须要在一开始修改渲染目标为自定义的RenderTarget,例如:SetRenderTarget(selfColorBuffer, selfDepthBuffer) ,同时selfDepthBuffer的深度位数必须为24或32. 如果是16 则不支持stencilbuffer。
关于延迟渲染(deferred)渲染目标(RenderTexture)的问题
- 延迟渲染的RenderTarget目前没有找到方法设置。
- 延迟渲染的内容可以通过commandbuffer通过BuiltinRenderTextureType.Gbuffer获取出来。
- BuiltinRenderTextureType.Gbuffer3当中保存了整个渲染流程的结果,包括了Forwardpass。
- 在渲染结束后,会将BuiltinRenderTextureType.Gbuffer3当中的内容拷贝到最终渲染目标当中。
- SetRenderBuffers()中的多个渲染目标并不是Gbuffer,而是从shader直接输出的内容。
- CameraEvent.beforelighting可以看到Gbuffer3组合了无光照内容和自发光内容和全局光照,还没有环境反射,不过在AfterGbuffer时还没有自发光内容。
- 延迟渲染的环境反射是在完成渲染目标切换之后,才进行渲染的,比天空球还晚。(前向渲染是伴随物体光照同时计算的)
延迟渲染过程中的深度提取
- 如果使用BuiltinRenderTextureType.Depth无法获取到stencil纹理,在deferred当中无存在,如果使用会报错:built-in renderTexture type3 not found…
- deferred过程需要使用BuiltinRenderTextureType.ReolvedDepth,不过使用默认深度和自定义 深度大小很容易不匹配
- 在ResolvedDepth中存在完整的深度信息。在deferred第一步先计算延迟物体深度(也就是Gbuffer填充阶段),然后计算前向物体深度,当在延迟渲染中设置depthbuffer时,代替的就是ResolvedDepth。
- ResolvedDepth中的Stencil,延迟光照阶段最多会使用高四位,并且进入前向阶段后不会清零。
- 在延迟渲染阶段,前向物体深度计算时会在stencilbuffer当中以207为mask写入内容。这表示高两位和第四位是都可以用的。并且Stencil写入和深度写入在同一个阶段。
*注:当使用commandbuffer绘制一般的物体时,目前的CameraEvent都是不包含光照信息的,所以绘制出来的内容始终是黑色的。