2015-06-19 72 views
0

我不想用UGUI製作一些教學級別,所以需要整體在黑暗中,但是一些矩形區域不是在黑暗中。在Unity3D中,如何在黑暗中製作整個場景,但是有些區域不是在黑暗中

我可以通過添加一個帶有圖像組件的gameobject來控制黑暗中的整個場景,並將其控制爲alpha。

但我不知道如何使一些矩形區域被點亮,矩形會在不同的教學層次上發生變化。而具有不同分辨率的不同設備也將改變錄音的重要性。

Picutre3是我想要的,只是矩形區域是確定的。

Picture1中 P1

圖片2

P2

圖片2

P3

圖片4 P4

+1

前段時間我做了類似的事情,我做了一個遮罩着色器。我所做的是我首先渲染場景只帶有蒙版(在你的情況下是一個矩形),渲染紋理爲白色。無處不在的地方,我只是呈現黑色。然後我將這個紋理與最終的渲染混合。這對你來說可能會超出你的想象,但它可以讓你有更多的矩形,甚至任意的形狀。如果您需要更多指導,我會在有空的時候發佈帶有示例代碼的完整答案。 – Reasurria

+0

非常感謝。我會嘗試,如果你有時間發佈完整的答案,這將是最好的。 – zhangjiangtao

+0

我加了答案。我意識到你可能想要3D效果類型(就像從上面照射閃光燈一樣)。如果是這種情況,我會延長答案。 – Reasurria

回答

3

我將解釋如何用簡單的着色器和一些設置來實現這一點。我是從記憶中講話,所以如果出現一些問題,請問。

所以你可以做的是:

  • 新建一個圖層渲染口罩。假設我們將這個圖層稱爲MaskLayer。

  • 複製您的主相機。我們稱之爲舊的主攝像機camA和新的camB。

  • 設置camA的剔除掩碼以包含MaskLayer以外的所有內容。
  • 將camB的剔除掩碼設置爲僅包含MaskLayer。
  • 創建一個新的渲染紋理(假設MaskRT)並將其設置爲camB的渲染目標。
  • 現在創建任何遊戲對象。讓我們把它做成純色(白色)的精靈。
  • 將精靈的圖層設置爲MaskLayer。

此時您應該注意到,精靈在遊戲窗口或camA預覽中不再可見。只有場景的其餘部分可見。當您選擇camB時,只有平面在預覽中可見。 camB的輸出表示「孔」的位置。

現在我們將繼續這樣的:

  • 創建一個新的精靈是視口一樣大。
  • 確保此精靈具有默認標記。
  • 創建一個新的着色器和一種新材質。稱之爲MaskMaterial。創建的 默認着色器模板應該足夠好。我不記得它提供了什麼,但它應該至少有一個紋理輸入。
  • 可以說你的着色器參數叫做DIFFUSE。在像素 着色器,輸出顏色設置爲一樣的東西:

    fixed4 frag (v2f i) : SV_Target 
    { 
        fixed4 texcol = tex2D (DIFFUSE, i.uv); 
        fixed4 outputColor = fixed4(0,0,0, 0.8-texcol.r); 
        return outputColor ; 
    } 
    

所以我們在這裏說,在我們用簡單的英語着色器是什麼: 我的顏色爲純黑色有輕微的透明度(0.8),除非我的輸入紋理在同一位置有一個白色,在這種情況下,我更透明(-texcol.r)。

我們在這裏使用r組件,但您可以輕鬆使用任何顏色組件。

現在,將此新材質和着色器分配給您的全屏精靈,並將MaskRT渲染紋理設置爲Mask Shader的輸入紋理DIFFUSE。

如果一切順利(lol右),那麼你現在應該有你想要的效果。移動蒙版現在與移動場景中標記有MaskLayer圖層的任何對象一樣簡單。所以你可以有很多面具。

注:

  • 的精靈會刁難你一些也許面對相機,以防萬一飛機開始了 。

  • 這裏是關於着色器的文檔,以防你需要閱讀一些內容:http://docs.unity3d.com/Manual/ShaderTut2.html這是值得研究的,但你可能會在這次試驗和錯誤中脫身。

    • 在着色器中,默認情況下可能會有一個顏色輸入。您可以在片段着色器中使用它,而不是說(0,0,0 ..),以便更容易地控制生成的蒙版。這將允許您像平時一樣使用材質的滑塊來改變您的遮罩外觀。例如:

    fixed4 outputColor = fixed4(InputColor.Albedo,InputColor.a-texcol)

編輯: 可以看看在 「在CG代碼使用着色器性能」 部分這裏:http://docs.unity3d.com/Manual/ShaderTut2.html如果你正在掙扎,你可以複製粘貼這整個片段並更改片段着色器(對不起,我不知道你有什麼級別的經驗)。編輯: 這是根據要求的着色器。另請閱讀以下注意事項。

Shader "Tutorial/Textured Colored" { 
    Properties { 
     _Color ("Main Color", Color) = (1,1,1,0.5) 
     _MainTex ("Texture", 2D) = "white" { } 
    } 
    SubShader { 
     Tags 
     { 
      "Queue" = "Transparent" 
     } 

     Blend One OneMinusSrcAlpha 

     Pass { 

     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 

     #include "UnityCG.cginc" 

     fixed4 _Color; 
     sampler2D _MainTex; 

     struct v2f { 
      float4 pos : SV_POSITION; 
      float2 uv : TEXCOORD0; 
     }; 

     float4 _MainTex_ST; 

     v2f vert (appdata_base v) 
     { 
      v2f o; 
      o.pos = mul (UNITY_MATRIX_MVP, v.vertex); 
      o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); 
      return o; 
     } 

     fixed4 frag (v2f i) : SV_Target 
     { 
      fixed4 texcol = tex2D (_MainTex, i.uv); 
      fixed4 outputColor = _Color; 
      outputColor.a -= texcol.r; 
      return outputColor ; 
     } 
     ENDCG 

     } 
    } 
} 

注:

  • 這個材質應該去你的全屏四。
  • 注意,在着色器屬性名稱的區別(而不是漫現在是更加清晰_Color和_MainTex。
  • 邏輯仍然大致相同。
  • 這段代碼沒有進行測試。
  • 有更有效的方法來做到這一點,例如只將遮罩對象深度寫入單個通道RenderTexture,但這種方式更容易學習,我認爲。
  • 一旦你得到這個半工作有一些改進。第一種方法是將面具矩形的材質更改爲具有未着色的純色着色器。

UPDATE:

我離開了着色器的關鍵部件遺憾。請參閱標籤部分和添加到着色器的混合操作。另請注意,對於全屏幕四邊形,您應該使用平面而不是精靈,因爲着色器與此狀態下的精靈不兼容。

還要注意的是,在示例項目位置:https://drive.google.com/file/d/0Bw8X8yAt21AiYjRyVkxJUkhreVU/view?usp=sharing

,這架飛機是在X和Z軸翻轉兩者。

至於我早先錯過的UGUI部分 - 這個解決方案可以工作。我沒有檢查過。如果遮罩位於UI後面,您可以嘗試將着色器中的「隊列」標籤設置爲「疊加」。

+0

對不起,我的着色器不太好,我嘗試了,但失敗了。如果它更方便,你能給我一個完整的着色器嗎?謝謝 – zhangjiangtao

+0

好吧,我更新了答案。如果你還在掙扎,你將不得不提供更多關於這個問題的細節。問題的範圍可以從場景設置到着色器中的語法錯誤,因此很難猜測出現了什麼問題。也許回來併發布最新結果的屏幕截圖(如果它運行但不能正常工作)。 – Reasurria

+0

非常感謝,我正在嘗試。 – zhangjiangtao