unity3d – 应用后期处理着色器

我有一个灰度着色器,适用于材质.

我想将它应用于相机渲染的内容.

我发现了一些教程
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);
}
}

有什么建议 ?
非常感谢 !

最佳答案 您必须添加顶点着色器,因为没有默认的顶点着色器.这个只是从顶点缓冲区复制数据.

#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;
}

而且你也希望在通过之后添加ZTest.

这显然是一个错误,但Unity3d支持说他们以这种方式离开(使用默认的ZTest)不改变着色器行为.我希望他们能够重新考虑这一点,并默认使用ZTest Always用于Graphics.Blit.

点赞