【Unity】デプス(Depth of Field)素材の作り方

unity-depth-of-field-shader

思いつきで調べて、デプス素材(Depth of Field・被写界深度用の素材)を作ってみました。

※そこまで調べてないので、もっと良い物があるかもしれません。

スポンサーリンク

デプス素材の作成

デプスシェーダーの作成

シェーダーを作成。

マテリアルを作成してCustom/DepthGrayscaleを選択して、オブジェクトにアサイン

o.scrPos.y = 1 – o.scrPos.y;は画面が反転したのでコメントアウト

DepthGrayscale.shader

Shader "Custom/DepthGrayscale" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _CameraDepthTexture;
struct v2f {
float4 pos : SV_POSITION;
float4 scrPos:TEXCOORD1;
};
//Vertex Shader
v2f vert (appdata_base v){
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.scrPos=ComputeScreenPos(o.pos);
//for some reason, the y position of the depth texture comes out inverted
//o.scrPos.y = 1 - o.scrPos.y;
return o;
}
//Fragment Shader
half4 frag (v2f i) : COLOR{
float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
half4 depth;
depth.r = depthValue;
depth.g = depthValue;
depth.b = depthValue;
depth.a = 1;
return depth;
}
ENDCG
}
}
FallBack "Diffuse"
}

カメラに下記のスクリプトをつける。

Add Componentした後はデプス用のマテリアルを登録

PostProcessDepthGrayscale.cs

using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class PostProcessDepthGrayscale : MonoBehaviour {
public Material mat;
void Start () {
camera.depthTextureMode = DepthTextureMode.Depth;
}
void OnRenderImage (RenderTexture source, RenderTexture destination){
Graphics.Blit(source,destination,mat);
}
}

ニアファーを調整

カメラのニアファーを調整して、白黒のグラデーションを調整

f:id:min0124:20160927083405j:plain

※ちなみにAEで合成する時は白黒を反転した素材を使うことになると思います。

スポンサーリンク

参考

William Chyr | Unity Shaders - Depth and Normal Textures (Part 1)

コメント