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

查看法线纹理

1.如何查看法线纹理


我们可以在屏幕后处理中使用我们学习过的获取深度纹理信息的知识点
将法线值作为颜色的RGB值显示在屏幕上
感受深度纹理中存储的内容

2.实现效果

1.shader部分

1.)实现思路

  1. 声明变量
    • _CameraDepthNormalsTexture 获取深度+法线纹理
    • depth 用于存储深度信息
    • normals 用于存储法线信息
  2. 顶点着色器 只需要修改传入结构体类型
  3. 片元着色器
    1. 对于深度和法线纹理进行采样depthNormal(其中xy是法线信息,zw是深度信息)
    2. 将非线性的值 转化到观察空间下 并将像素点到摄像机的距离转换到[0,1]区间内
      • 一次性处理:DecodeDepthNormal(depthNormal,depth,noramls);
      • 单独得到深度:DecodeFloatRG(depthNormal.zw);
      • 单独得到法线:DecodeViewNormalStereo(depthNormal);
  4. Fallback off

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
Shader "Unlit/DepthNormalTexture"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
//深度+法线纹理
sampler2D _CameraDepthNormalsTexture;
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.vertex, _MainTex);
return o;
}

fixed4 frag (v2f i) : SV_Target
{
//直接采样 获取到的是裁剪空间下的法线和深度信息
float4 depthNormal = tex2D(_CameraDepthNormalsTexture,i.uv);
fixed depth;
fixed3 normals;
DecodeDepthNormal(depthNormal,depth,normals);
//需要将法线-1~1之间 变换到0~1之间
return fixed4(normals * 0.5 + 0.5,1);
}
ENDCG
}
}
Fallback Off
}

2.C#部分

1.)实现思路

  1. 继承PostEffetBase
  2. 在Start函数中设置深度法线纹理模式

2.)实现示例

1
2
3
4
5
6
7
public class DepthNormalTexture : PostEffectBase
{
void Start()
{
Camera.main.depthTextureMode = DepthTextureMode.DepthNormals;
}
}

评论