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

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
} 
2个回答

3
我认为你所要求的是一种替换着色器,该着色器会使用你的着色器来对相机中的所有物体进行着色。
如果我理解正确的话,以下代码可以实现这个功能。
Camera.main.SetReplacementShader(Shader.Find("Your Shader"),"RenderType")

以下是更多信息:http://docs.unity3d.com/Documentation/Components/SL-ShaderReplacement.html

编辑:您是否期望整个相机像镜头效果一样弯曲?因为仅使用此着色器,您不会得到这种效果,因为它仅适用于像平面一样的对象,而不是完整的相机视图,需要后期图像效果。首先,您需要Unity Pro。如果有,请导入Image Effects包并查看鱼眼脚本。尝试使用自己的着色器复制鱼眼脚本。当我附加鱼眼着色器而没有其对应的脚本时,我得到了与您当前着色器代码相同的结果。如果您没有访问图像效果包,请告诉我,我会向您发送鱼眼脚本和着色器。


我有Unity Pro。但我没有鱼眼脚本。你能分享代码吗?除了鱼眼脚本外,还需要添加其他模块或库吗? - user1021110
请查看以下链接,警告:我将在24小时内删除该文件:https://www.dropbox.com/s/rs8nx7fn1lgkg70/Image%20Effects%20%28Pro%20Only%29.unityPackage - MichaelTaylor3D
谢谢。我已经下载了它。我会在这里留下结果。再次感谢您的帮助。 - user1021110
希望它能够正常工作,如果有帮助,请不要忘记接受答案 :) - MichaelTaylor3D

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 () {

    }
}

仅供参考,上述着色器将场景扭曲成梯形形状。


我编译了着色器并将其应用于测试对象,但它完全透明且具有轻微的折射。有什么技巧可以使其正常工作吗? - MichaelTaylor3D
不是的。请查看我在Unity网站上的主要问题。 链接 - user1021110
没事了,我想我知道发生了什么事情了,请看我的回答。 - MichaelTaylor3D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接