3

我编写了一个着色器,当我将它添加到位于相机前面的平面中时它工作正常(在这种情况下,相机没有着色器)。但后来我将此着色器添加到相机,它不会在屏幕上显示任何内容。这是我的代码,你能告诉我如何将其更改为与 Camera.RenderWithShader 方法兼容吗?

Shader "Custom/she1" {
    Properties {
    top("Top", Range(0,2)) = 1
    bottom("Bottom", Range(0,2)) = 1
}
    SubShader {

        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _GrabTexture
        GrabPass { }

        // Render the object with the texture generated above
        Pass {


CGPROGRAM
#pragma debug
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0

            sampler2D _GrabTexture : register(s0);
            float top;
            float bottom;

struct data {

    float4 vertex : POSITION;

    float3 normal : NORMAL;

};



struct v2f {

    float4 position : POSITION;

    float4 screenPos : TEXCOORD0;

};



v2f vert(data i){

    v2f o;

    o.position = mul(UNITY_MATRIX_MVP, i.vertex);

    o.screenPos = o.position;

    return o;

}



half4 frag( v2f i ) : COLOR

{

    float2 screenPos = i.screenPos.xy / i.screenPos.w;
    float _half = (top + bottom) * 0.5;
    float _diff = (bottom - top) * 0.5;
    screenPos.x = screenPos.x * (_half + _diff * screenPos.y);
      screenPos.x = (screenPos.x + 1) * 0.5;
    screenPos.y = 1-(screenPos.y + 1) * 0.5 ;
    half4 sum = half4(0.0h,0.0h,0.0h,0.0h);  
    sum = tex2D( _GrabTexture, screenPos);
    return sum;

}
ENDCG
        }
    }

Fallback Off
} 
4

2 回答 2

3

我认为您要求的是一个替换着色器,它可以用您的着色器对相机中的所有内容进行着色。

我对么?

如果是这样,这应该工作

Camera.main.SetReplacementShader(Shader.Find("Your Shader"),"RenderType")

这里有更多信息: http ://docs.unity3d.com/Documentation/Components/SL-ShaderReplacement.html

编辑:您是否希望整个相机像镜头效果一样变形?因为你不会单独使用这样的着色器来获得它,因为它只适用于像你的飞机这样的对象,而不是完整的相机视图,这需要后期图像效果。首先你需要 Unity Pro。如果这样做,请导入图像效果包并查看鱼眼脚本。看看您是否可以使用自己的着色器复制鱼眼脚本。当我在没有相应脚本的情况下附加鱼眼着色器时,我得到的结果与使用当前着色器代码的结果完全相同。如果您无权访问图像效果包,请告诉我,我会向您发送鱼眼脚本和着色器。

于 2013-10-21T18:26:24.023 回答
0

到目前为止,我已经尝试了几种方法。当我将着色器添加到位于主摄像机前面的平面时,着色器本身工作得很好。但是当我通过下面的代码将它添加到主相机时,屏幕上什么都看不到!(只是一个空白屏幕)没有任何错误消息。我将上述着色器分配给repl变量。

using UnityEngine;
using System.Collections;

public class test2 : MonoBehaviour {

    // Use this for initialization
    public Shader repl = null;
    void Start () {

        Camera.main.SetReplacementShader(repl,"Opaque");

    }

    // Update is called once per frame
    void Update () {

    }
}

仅供参考,上面的着色器将场景扭曲为梯形。

于 2013-10-22T03:32:58.287 回答