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