23.Shader-RenderTexture和玻璃效果
目录:
1,渲染纹理 RenderTexture
2,玻璃效果和GrabPass
渲染纹理-RenderTexture
将相机的渲染目标指定为的一张RT(RenderTexture)
假镜子效果
思路: 相机渲染->RT上->反转uv采样
核心代码
完整代码 Texture_RTMirror.shader
相机设置
在Asset中创建一个RT, 并将它设为一个新相机的输出

效果

观察者视角变化时, 因为RTCam角度没跟着变化, 导致画面不变化, , 只能算假镜子
目前比较主流的镜子实现是SSR(Screen Space Reflection)

玻璃效果和GrabPass
说明
GrabPass: Unity中的特殊Pass,它用于捕捉当前的画面存储到一张纹理中。
Queue一般设为Transparent , 用于保证所有不透明物体都渲染完成
GrabPass通常用来制作玻璃的透射效果。
比起透明度混合,GrabPass可操作更多的细节,比如使用法线来模拟折射。
核心代码
GrabPass{"_GrabPassTexture"} 指定纹理名, GrabPass会将屏幕内容输出到纹理上
效果

但对于玻璃, 并不需要显示整个屏幕, 所以需要对uv坐标做映射处理
需要将顶点从裁剪空间坐标->屏幕坐标->uv坐标
最后将屏幕纹理采样
效果

可以叠加纹理

完整代码 Texture_GrabPass.shader
扩展: ComputeGrabScreenPos的源码
UNITY_UV_STARTS_AT_TOP Direct3D的平台使用值1;OpenGL的平台使用值0
所以需要scale调整坐标系

渲染纹理vs. GrabPass
GrabPass用法简单, 而渲染纹理效率高


所有完整代码: https://github.com/smartgrass/MyCodes/tree/main/ShaderLearning
下一篇: 时间动画
shader基础最后一篇了