5

マテリアルに適用すると機能するグレースケール シェーダーがあります。カメラがレンダリングするものに適用したいと思います。

void OnRenderImage (RenderTexture ソース、RenderTexture 宛先) について話しているチュートリアルを見つけました。

しかし、私はそれを私のもので動作させることができませんでした。

シェーダー :

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

助言がありますか ?どうもありがとう !

4

1 に答える 1

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

またZTest Always、後に追加することもできますPass {

これは明らかにバグですが、Unity3d サポートは、シェーダーの動作を変更しないために、このままにしておく (デフォルトの ZTest を使用する) と述べています。ZTest Always彼らがこれを再考し、デフォルトで使用されるようにすることを願っていますGraphics.Blit.

于 2012-10-26T12:37:56.130 に答える