ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Unity的RenderTexture 笔记

Unity的RenderTexture 笔记 一、先了解两个位数“颜色缓冲区的位数” 和 “深度缓冲区的位数”所谓位数就是存储一个像素所有通道如 R、G、B、A所需的总比特数。举例24 位与 16 位的核心区别1. RGB 24 位无 Alpha 的“真彩色”这是最接近标准图片格式的格式每个颜色通道红、绿、蓝各占 8 位。表现能显示约1670 万种颜色色彩过渡自然质量高。特点没有 Alpha透明度通道。它通常是一个“源格式”上传到 GPU 时为了硬件兼容性往往会被自动转换成RGBA 32 位每通道 8 位来处理。内存在磁盘上约占 3 MB1024x1024但在 GPU 显存中通常按 4 MB 的 32 位格式计算。2. RGB 16 位 / ARGB 16 位量化色彩总位数为 16 位通常采用RGB565红 5 位、绿 6 位、蓝 5 位或ARGB4444每通道 4 位的分布。表现色彩精度较低。RGB565 能显示约6.5 万种颜色ARGB4444 每个通道只有 16 个级别。在色彩渐变区域容易出现“色带”或“断层”现象。特点部分 16 位格式如 ARGB4444支持 Alpha 通道且不增加额外内存开销。内存非常节省1024x1024 的贴图仅占2 MB是 24/32 位格式的一半。RenderTextureFormat format决定的是颜色缓冲区Color Buffer的格式也就是你看到的画面颜色、透明度的精度。int depth决定的是深度缓冲区Depth Buffer的位数也就是用来做深度测试谁遮挡谁的数据精度。两者是互补关系而不是竞争关系。例子depth 24 RGB565当你写new RenderTexture(1024, 1024, 24, RenderTextureFormat.RGB565)时Unity 会创建两个独立的资源颜色部分按照RGB565格式创建每个像素占 16 位红 5、绿 6、蓝 5没有 Alpha 通道。用于最终画面的颜色输出。深度部分按照24位创建深度缓冲区附带模板缓冲用于渲染时的深度测试和模板操作。它们互不干扰。深度测试决定了像素“该不该被画出来”而颜色格式决定了“画出来的像素长什么样”。拿播放Mp4视频用的渲染贴图举例深度缓冲区Depth Buffer设置为 “No depth buffer” 或0。视频播放只需要颜色信息深度测试在这里没有意义。设置深度缓冲区只会白白浪费显存对画面没有任何帮助。格式RenderTextureFormat通常保持默认的Default在大多数平台会落到ARGB32即可这对 MP4 的 8 位色深视频来说精度足够。不需要为了“省内存”去用RGB565等 16 位格式因为视频播放的主要开销在解码和像素拷贝颜色格式省下的那点显存微乎其微反而可能带来色带问题。尺寸SizeRenderTexture 的 Width 和 Height必须与视频源文件完全一致。例如视频是 1920x1080RenderTexture 就应设为 1920x1080不要随意缩放这样才能获得最佳播放性能并避免不必要的像素重采样。在考虑Unity中渲染贴图的颜色格式时格式对于内存和性能的占用可以按以下顺序进行排序UNORM无符号归一化类型通常是最常用的格式具有较高的优化和支持尤其适合颜色值影响相对较小。SNORM有符号归一化类型占用资源和性能略高于UNORM尤其在涉及法线计算时可能引入额外的计算开销。总体来说性能影响较小。UINT无符号整数类型由于它是整数格式可能需要更多的计算资源来转换和处理因此性能和内存占用比UNORM和SNORM略高。SINT有符号整数类型占用资源和性能开销最大因为需要处理负值的整数且在某些情况下可能会引入更多计算复杂性。总结从资源性能的占用来看排序为UNORM资源最少SNORMUINTSINT资源最多这只是一个一般的指导具体的性能影响还会因具体的硬件、渲染管线以及使用场景而异。
返回列表