Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

镜面效果

一、镜面效果的原理

  1. 摄像机看到的画面渲染到渲染纹理中
  2. 再 Shader 中利用该纹理进行翻转渲染即可

二、准备工作

  1. 创建一个摄像机用来得到镜子看见的画面
  2. 创建一个 Custom Render Texture 将其关联

三、Custom Render Textuer 的参数

2024-10-26 114234.png
  1. Dimension 渲染维度
    • 2D 2D 纹理
    • 2D Array 2D 数组纹理
    • Cube 立方体纹理
    • 3D 3D 纹理
  2. Size 像素尺寸
  3. Anti-aliasing 抗锯齿效果
  4. Enable Compatible Format 是否启用兼容格式 避免由于特定硬件或者驱动不支持某些格式而引起渲染问题
  5. Color Format 渲染纹理格式
  6. Depth Stencil Format 深度模板格式
  7. Enale Mip Maps 是否允许渲染纹理的使用
  8. Dynamic Scaling 动态缩放 许渲染纹理根据显示分辨率或其他条件动态调整其大小。 启用此选项可以帮助优化性能,特别是在高分辨率显示设备上。
  9. Random Write 随机写入 允许在计算着色器(Compute Shader)或其他 GPU 程序中进行随机写操作。 这对于需要进行复杂计算或并行处理的任务非常有用,例如粒子系统、流体模拟或其他基于 GPU 的运算
  10. Wrap Mode 纹理平铺模式
    • Repeat 重复
    • Clamp 拉伸
    • Mirror 镜像
    • Mirror Once 镜像一次
    • Per-axis UV 指定轴向
  11. Filter Mode 拉伸时的过滤模式
    • point 块状过滤
    • Bilinear 模糊过滤
    • Trilinear 类似于 Bilinear,但是纹理也在不同的 Mip 级别之中过滤
  12. Shadow Sampling Mode 用于处理自定义纹理在阴影计算中的采样模式
    • None 不使用,自定义渲染我呢里将不会用于阴影的贴图采样
    • Compare Depths 使用深度比较进行阴影采样。这种模式通常用于标准阴影映射技术,比较光源深度与当前像素深度以确定阴影
  13. Material 自定义纹理材质
  14. Initialization Mode 初始化纹理频率
    • OnLoad:创建时初始化一次
    • Realtime:每一帧初始化纹理
    • OnDemand:通过脚本按需初始化纹理
  15. Source 纹理如何初始化
    • Texture and Color 叠加颜色来初始化纹理
    • Material 使用材质初始化纹理
  16. Update Mode 自定义渲染纹理的频率
  17. Double Buffered 启用双缓冲技术 这可以在某些应用场景中提升性能和稳定性 双缓冲技术涉及使用两个缓冲区来交替存储和处理数据,从而减少由于直接读写同一个缓冲区引起的竞争和冲突
  18. Wrap Update Zones 控制更新区域的环绕方式 对于处理需要特定边缘处理或重复性内容的渲染效果非常有用
  19. Updte Zone Space 用于控制纹理坐标更新方式的选项。 它主要影响如何在 Shader 中处理纹理坐标,特别是在对应于动态纹理的情况下

四、效果实现

1.实现思路

  1. 结合单张纹理_颜色显示的 Shader
  2. 在顶点着色器中,让 UV 坐标的 x 反向(坐标范围为 0~1,所以直接 1 - UV.x 即可)
  3. 将渲染纹理应用到 Shader 中即可

2.实现示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Shader "Unlit/Mirror"
{
Properties
{
//主纹理
_MainTex("MainTex",2D) = ""{}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
//映射对应的纹理属性图片相关属性
sampler2D _MainTex;
//映射对应纹理属性的 缩放 平(偏)移数据
float4 _MainTex_ST;//xy代表缩放 zw代表平移


v2f_img vert (appdata_base v)
{
v2f_img data;
data.pos = UnityObjectToClipPos(v.vertex);

/*
v.texcood.xy //代表UV坐标
v.texcood.zw //代表一些额外信息
*/
//方法一 固定计算
data.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

//由于是镜面效果 所以需要让纹理坐标的x坐标反向
data.uv.x = 1 - data.uv.x;
//方法二 内置宏
//data.uv = TRANSFORM_TEX(v.texcoord.xy,_MainTex);
return data;
}

fixed4 frag (v2f_img i) : SV_Target
{
fixed4 color = tex2D(_MainTex,i.uv);
return color;
}
ENDCG
}
}
FallBack "Diffuse"
}

评论