在Unity中使用着色器进行相机渲染

时间:2013-10-17 17:12:38

标签: unity3d rendering shader unityscript

我已经写了一个着色器,当我将它添加到位于相机前面的平面中时它工作正常(在这种情况下,相机没有着色器)。但后来我将这个着色器添加到相机,它没有在屏幕上显示任何内容。在这里是我的代码,你能告诉我如何更改它以与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
} 

2 个答案:

答案 0 :(得分:3)

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

我说错了吗?

如果是这样,这应该有用

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

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

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

答案 1 :(得分:0)

到目前为止,我已尝试了几种方法。当我将它添加到位于主Camera前面的平面时,着色器本身可以很好地工作。但是当我通过下面的代码将它添加到主摄像头时,屏幕上看不到任何东西! (只是一个空白的屏幕)没有任何错误消息。我将上面的着色器分配给 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 () {

    }
}

仅为了您的信息,上面的着色器将场景扭曲为梯形形状。