今天就这么灵感迸发结合Shader,RenderTexture搞出了一套摄像机特效
,废话不多说上图

这个特效是将摄像机渲染的图像转换为黑白的还是挺实用的,现在讲一下偶的思路,摄像机
不是有个TargetTexture吗,里面可以放一个RendererTexture不过这个RendererTxture不能是右键Create出来的是由代码new出来的,右键出来的无法做到自适应所以需要new出来的,后面我会贴出代码,继续讲思路首先我必须在主摄像机下嵌一个摄像机(Reset一下到和主摄像机重合),将该摄像机渲染的RenderTexture通过Shader处理传到主摄像机的最终
渲染通道里,对了次摄像机的深度必须设为比主摄像机小这样不会覆盖了主摄像机的画面
看到图中主摄像机的脚本了吗CameraEffect现在贴出其代码:
using UnityEngine;
using System.Collections;
public class CameraEffect : MonoBehaviour {
public Material mat;
public Camera cam;
private RenderTexture texture;
void Start()
{
texture = new RenderTexture(Screen.width,Screen.height,24);
cam.targetTexture = texture;
}
void OnRenderImage(RenderTexture source,RenderTexture destination)
{
if(mat)
{
Graphics.Blit(texture,destination,mat,0);
}
}
void OnDisabled()
{
texture.Release();
}
}
代码很简单关键就是函数OnRenderImage,将次摄像机渲染的RendererTexture通过mat材质球渲染后赋予主摄像机的destination输出渲染纹理,Public的Camera就是次摄像机,mat
需要自己创建将Shader选为BlackAndWhiteShader(这是我起的名字)下面贴出这个Shader代码:
Shader "Custom/BlackAndWhiteShader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags{"Queue" = "Transparent" "RenderType"="Transparent"}
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR
{
half4 SourceColor = tex2D(_MainTex,i.uv);
half ColorT = (SourceColor.x + SourceColor.y + SourceColor.z)/3;
half4 DestinationColor = half4(ColorT,ColorT,ColorT,SourceColor.w);
return ColorT;
}
ENDCG
}
}
FallBack "Diffuse"
}
好了,这个Shader代码我也不过多解释了不知道直接Ctrl+C/Ctrl+V贴吧,差不多了这个教程就这样了其实我还在其基础上有新的花样就不贴了万变不离其中


这个特效是将摄像机渲染的图像转换为黑白的还是挺实用的,现在讲一下偶的思路,摄像机
不是有个TargetTexture吗,里面可以放一个RendererTexture不过这个RendererTxture不能是右键Create出来的是由代码new出来的,右键出来的无法做到自适应所以需要new出来的,后面我会贴出代码,继续讲思路首先我必须在主摄像机下嵌一个摄像机(Reset一下到和主摄像机重合),将该摄像机渲染的RenderTexture通过Shader处理传到主摄像机的最终
渲染通道里,对了次摄像机的深度必须设为比主摄像机小这样不会覆盖了主摄像机的画面
看到图中主摄像机的脚本了吗CameraEffect现在贴出其代码:
using UnityEngine;
using System.Collections;
public class CameraEffect : MonoBehaviour {
public Material mat;
public Camera cam;
private RenderTexture texture;
void Start()
{
texture = new RenderTexture(Screen.width,Screen.height,24);
cam.targetTexture = texture;
}
void OnRenderImage(RenderTexture source,RenderTexture destination)
{
if(mat)
{
Graphics.Blit(texture,destination,mat,0);
}
}
void OnDisabled()
{
texture.Release();
}
}
代码很简单关键就是函数OnRenderImage,将次摄像机渲染的RendererTexture通过mat材质球渲染后赋予主摄像机的destination输出渲染纹理,Public的Camera就是次摄像机,mat
需要自己创建将Shader选为BlackAndWhiteShader(这是我起的名字)下面贴出这个Shader代码:
Shader "Custom/BlackAndWhiteShader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags{"Queue" = "Transparent" "RenderType"="Transparent"}
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR
{
half4 SourceColor = tex2D(_MainTex,i.uv);
half ColorT = (SourceColor.x + SourceColor.y + SourceColor.z)/3;
half4 DestinationColor = half4(ColorT,ColorT,ColorT,SourceColor.w);
return ColorT;
}
ENDCG
}
}
FallBack "Diffuse"
}
好了,这个Shader代码我也不过多解释了不知道直接Ctrl+C/Ctrl+V贴吧,差不多了这个教程就这样了其实我还在其基础上有新的花样就不贴了万变不离其中
