13.1 获取深度和法线纹理
G-buffer
A screen space representation of geometry and material information, generated by an intermediate rendering pass in deferred shading rendering pipelines.
几何体和材质信息的屏幕空间表示,由延迟着色渲染管道中的中间渲染通道生成。
13.1.2 如何获取
13.1.3 查看深度和法线纹理
13.2 再谈运动模糊
用深度纹理重建世界坐标
C#
Camera
depthTextureMode
previousViewProjectionMatrix
camera.projectionMatrix
// Set an off-center projection, where perspective's vanishing
// point is not necessarily in the center of the screen.
//
// left/right/top/bottom define near plane size, i.e.
// how offset are corners of camera's near plane.
// Tweak the values and you can see camera's frustum change.
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class ExampleClass : MonoBehaviour
{
public float left = -0.2F;
public float right = 0.2F;
public float top = 0.2F;
public float bottom = -0.2F;
void LateUpdate()
{
Camera cam = Camera.main;
Matrix4x4 m = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
cam.projectionMatrix = m;
}
static Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far)
{
float x = 2.0F * near / (right - left);
float y = 2.0F * near / (top - bottom);
float a = (right + left) / (right - left);
float b = (top + bottom) / (top - bottom);
float c = -(far + near) / (far - near);
float d = -(2.0F * far * near) / (far - near);
float e = -1.0F;
Matrix4x4 m = new Matrix4x4();
m[0, 0] = x;
m[0, 1] = 0;
m[0, 2] = a;
m[0, 3] = 0;
m[1, 0] = 0;
m[1, 1] = y;
m[1, 2] = b;
m[1, 3] = 0;
m[2, 0] = 0;
m[2, 1] = 0;
m[2, 2] = c;
m[2, 3] = d;
m[3, 0] = 0;
m[3, 1] = 0;
m[3, 2] = e;
m[3, 3] = 0;
return m;
}
}
ExecuteInEditMode
Shader
UNITY_UV_STARTS_AT_TOP
13.3 全局雾效
13.3.3 实现
C#
GetComponent
Component.GetComponent
GameObject.GetComponent
OnEnable
SetRow
material.SetMatrix
// Use this shader on an object together with the above example script.
// The shader transforms texture coordinates with a matrix set from a script.
Shader "RotatingTexture"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
};
float4x4 _TextureRotation;
v2f vert (float4 pos : POSITION, float2 uv : TEXCOORD0)
{
v2f o;
o.pos = UnityObjectToClipPos(pos);
o.uv = mul(_TextureRotation, float4(uv,0,1)).xy;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
}
Normalize
13.4 再谈边缘检测
罗伯特算子