由于外出取材,断更了两天,强迫症患者的我表示太难受了。
但是可不能半途而废了,还是得续上。
作为研究SSS材质的前置知识点,要先研究深度图,从雾效的例子开始实现比较容易入手。
Shader "MyShader/SS_27"
{
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _CameraDepthTexture;
fixed4 frag_depth(v2f_img i) : SV_Target
{
float depthTextureValue = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
return 1 - depthTextureValue;
}
ENDCG
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag_depth
ENDCG
}
}
}
其中_CameraDepthTexture是unity内置的参数,可以获取摄像机的深度图。而根据深度图可以获取片元的深度值。
然后是一个通用格式的屏幕特效控制脚本:
using UnityEngine;
[ExecuteInEditMode]
public class SS_27 : MonoBehaviour
{
private Material postEffectMat = null;
private Camera currentCamera = null;
public Camera CurrentCamera
{
get
{
if (currentCamera == null)
{
currentCamera= GetComponent<Camera>();
}
return currentCamera;
}
set
{
currentCamera = value;
}
}
void OnEnable()
{
if (postEffectMat == null)
postEffectMat = new Material(Shader.Find("MyShader/SS_27"));
CurrentCamera.depthTextureMode |= DepthTextureMode.Depth;
}
void OnDisable()
{
CurrentCamera.depthTextureMode &= ~DepthTextureMode.Depth;
}
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (postEffectMat == null)
{
Graphics.Blit(source, destination);
}
else
{
Graphics.Blit(source, destination, postEffectMat);
}
}
}
返回目录:https://blog.csdn.net/yzy1987523/article/details/107561997