CommandBuffer 描边效果(附加颜色空间的一些记录)
- 设置渲染目标
buf.Blit(); buf.SetRenderTarget();
// 下面用于清理,经过测试RT不会自动清理上次渲染的信息,所有这里需要手动清理下。
// RenderTexture.GetTemporary()和CommandBuffer.GetTemporaryRT()
// 全局的通过new RenderTexutre()出来的对象都需要进行清理。
buf.ClearRenderTarget(true, true, Color.black);
没有设置渲染目标:
buf.GetTemporaryRT(_TEMP1, -1, -1, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); //buf.Blit(BuiltinRenderTextureType.CurrentActive, _TEMP1);//buf.ClearRenderTarget(true, true, Color.black);
buf.DrawRenderer(renderer, mMaterial, 0, 1);
渲染效果:

当没有设置渲染目标的时候CommandBuffer直接把图元写在了原始图像上
设置渲染目标但是没有清理图元
buf.GetTemporaryRT(_TEMP1, -1, -1, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); buf.Blit(BuiltinRenderTextureType.CurrentActive, _TEMP1);//buf.ClearRenderTarget(true, true, Color.black); buf.DrawRenderer(renderer, mMaterial, 0, 1);
渲染效果:

CommandBuffer把对象的图像信息写入新的RT,因为没有清理新RT的原始信息, 所以左上角图像Object对象没有单独渲染出来
设置渲染目标并且清理目标图元
buf.GetTemporaryRT(_TEMP1, -1, -1, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); buf.Blit(BuiltinRenderTextureType.CurrentActive, _TEMP1); buf.ClearRenderTarget(true, true, Color.black); buf.DrawRenderer(renderer, mMaterial, 0, 1);
渲染效果

由此也可以看到CommandBuffer的当前RenderTarget可以通过Blit来设置,即Blit后就是CommandBuffer当前渲染目标(RenderTarget)。
Shader中判断颜色空间的宏定义
BuiltinShaderDefine.UNITY_COLORSPACE_GAMMA
宏定义详细地址: https://docs.unity3d.com/ScriptReference/Rendering.BuiltinShaderDefine.html
Shader中颜色空间值变换:
m = LinearToGammaSpace(m);
m = GammaToLinearSpace(m);
C# 中颜色空间值变化
m = Mathf.LinearToGammaSpace(m);
m = Mathf.GammaToLinearSpace(m);
浙公网安备 33010602011771号