2013-10-17 102 views
2

我寫了一個着色器,並且它在我將其添加到位於相機前面的平面中(在這種情況下相機沒有着色器)時它工作正常。但是隨後我將這個着色器添加到相機,它不會在屏幕上顯示任何內容。這裏是我的代碼,你能告訴我如何改變它與Camera.RenderWithShader方法兼容嗎?在Unity中使用着色器進行相機渲染

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

我覺得你要求的是一個替換着色器,它用你的着色器遮擋相機中的所有東西。

我正確嗎?

如果是的話這應該

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

這裏是更多的一些信息: http://docs.unity3d.com/Documentation/Components/SL-ShaderReplacement.html

編輯:你期待整個相機翹曲像透鏡效應?因爲你不打算使用像這樣的着色器,因爲就其本身而言,它只適用於像飛機這樣的物體,而不適用於完整的相機視圖,這需要後期圖像效果。首先您需要Unity Pro。如果是這樣,導入Image效果包並查看魚眼腳本。看看你是否可以用你自己的着色器複製魚眼腳本。當我在沒有相應的腳本的情況下附加了魚眼着色器時,我獲得了與當前着色器代碼相同的精確結果。如果您沒有訪問圖像效果包,請讓我知道併發送您的魚眼腳本和着色器。

+0

我有Unity Pro。但我沒有魚眼腳本。你能和我分享代碼嗎?除了魚眼腳本之外,還有哪些模塊或庫需要添加? – user1021110

+0

請參閱以下鏈接,警告我在24小時內刪除該文件:https://www.dropbox.com/s/rs8nx7fn1lgkg70/Image%20Effects%20%28Pro%20Only%29.unityPackage – MichaelTaylor3D

+0

謝謝。我已經下載了它。我會在這裏留下結果。再次感謝你的幫助。 – user1021110

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

    } 
} 

僅供參考,上述着色器將場景變形爲梯形。

+0

我編譯了着色器並將其應用於測試對象,並且它具有完全透明並具有輕微折射。有沒有一個讓它正常工作的技巧? – MichaelTaylor3D

+0

不是。請在Unity網站中查看我的主要問題。 [鏈接](http://answers.unity3d.com/questions/560327/shader-problem-to-distort-the-final-render-result.html) – user1021110

+0

沒關係,我想我想通了,發生了什麼,看到我的答案。 – MichaelTaylor3D