我有一个灰度着色器,适用于材质。 我想将它应用于相机渲染的内容。
我发现了一些教程 void OnRenderImage(RenderTexture source,RenderTexture destination)
但是我无法与我合作。
着色器:
Shader "Custom/Grayscale" {
SubShader {
Pass{
CGPROGRAM
#pragma exclude_renderers gles
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
fixed4 frag(v2f_img i) : COLOR{
fixed4 currentPixel = tex2D(_MainTex, i.uv);
fixed grayscale = Luminance(currentPixel.rgb);
fixed4 output = currentPixel;
output.rgb = grayscale;
output.a = currentPixel.a;
//output.rgb = 0;
return output;
}
ENDCG
}
}
FallBack "VertexLit"
}
附在相机上的脚本:
using UnityEngine;
using System.Collections;
public class Grayscale : ImageEffectBase {
void OnRenderImage (RenderTexture source, RenderTexture destination) {
Graphics.Blit (source, destination, material);
}
}
有什么建议吗? 非常感谢!
答案 0 :(得分:3)
您必须添加顶点着色器,因为没有默认的顶点着色器。这个只是从顶点缓冲区复制数据。
#pragma vertex vert
v2f_img vert (appdata_base v) {
v2f_img o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;
return o;
}
AND ALSO 您想在ZTest Always
之后添加Pass {
。
这显然是一个错误,但Unity3d支持说他们离开它(使用默认的ZTest)不改变着色器行为。我希望他们会重新考虑这一点,并默认ZTest Always
使用Graphics.Blit
。