0
点赞
收藏
分享

微信扫一扫

[学习笔记]UnityShader入门精要_第13章_使用深度和法线纹理

楠蛮鬼影 2022-04-04 阅读 77
交互

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 再谈边缘检测

罗伯特算子


13.5 扩展阅读

举报

相关推荐

0 条评论