本篇讨论SRP中的RenderTexture

RT的用途

我们在很多地方都用到了RT,RT是主要的存储渲染数据的手段,下面是一些例举:
cmd.SetRenderTarget(...); //作为颜色和深度的写入目标
float4 color = tex2D(MainTex, i.uv0); //作为颜色读取目标 采样
将RT保存为图片 序列化
cmd.GetTemporaryRT(...); //申请一个临时RT 作为读写目标

RenderTexture:用于引用一个RT实例
RenderTextureDescriptor:用于描述一个RT,可用来准确创建一个RT。

属性名RenderTextureRenderTextureDescriptor
像素宽度widthwidth
像素高度heightheight
保存在Gamma空间sRGBsRGB
动态分辨率useDynamicScaleuseDynamicScale
MSAA级别antiAliasingmsaaSamples
?volumeDepthvolumeDepth
mipmap数量自构时指定mipCount
直接采样MS贴图bindTextureMSbindMS
颜色缓冲格式formatgraphicsFormat/colorFormat
深度缓冲格式depthdepthBufferBits
stencil data格式stencilFormatstencilFormat
纹理类型dimensiondimension
??shadowSamplingMode
?vrUsagevrUsage
??flags
不保存到RAMmemorylessModememoryless
标记为拥有mipmapuseMipMapuseMipMap
自动生成mipmapautoGenerateMipsautoGenerateMips
(SM4.5)随机读写enableRandomWriteenableRandomWrite
是否为当前读写目标active?
转化为描述descriptor?
采样时过滤方式Bilear??Point??-
重复模式repeat?clamp?-

动态分辨率

当GPU繁忙时,降低RT分辨率,提高渲染速度,需要开启性能分析。
参考:动态分辨率系统允许根据GPU的负载动态缩放RT的分辨率,在相机组件开启;

stencilFormat

设置stencil data的格式
设置stencilFormat将导致stencil data可以作为Texture采样(在受支持的平台);
受支持的格式有:R8_UInt(dx11/dx12),R8_UNorm(PS4)
并不设置stencil buffer的格式,stencil buffer由RenderTexture.depth决定

纹理类型(TextureDimension) 默认值Tex2D

一般我们使用的都是Tex2D类型,其他类型可能用于特殊情况(VR/探针);
参考:dimension

mipmap相关

autoGenerateMips 默认值true
当开启了mipmap(useMipMap = true),此RT结束被绘制(更换active RT)时自动生成mipmap。

useMipMap 默认值false
是否生成mipmap,要求RT宽高为2的指数。

MSAA

开启MSAA会导致贴图的格式产生变化,需要转化为正常纹理,或者使用MSAA贴图的采样语法:
LOAD_TEXTURE2D_MSAA(_CameraDepthAttachment, uv, sampleIndex)


关注成长,注重因果。