2011-06-29 51 views
0

這個問題實際上是針對Unity3D的,但它也可能是一個更普遍的問題,因此我將盡可能地提出這個問題。在對象上禁用剔除

假設我有一個場景camera (near = 0.3, far = 1000, fov = 60),我想繪製一個半徑爲10000單位的天體。

該物體沒有被相機的錐體剔除,因爲我在圓頂內。但是頂點由一些着色器莫名其妙撲殺和最終的結果看起來是這樣的:

My clipped skydome

現在我的問題是:

我可以改變什麼設置任何引擎,以確保完整的對象被繪製,而不會被攝像機的遠平面剪切掉?

什麼我不想要的是:

  • 變化遠平面到10000,因爲它使視錐不太準確
  • 更改不久的飛機,因爲我的遊戲其實是一個非常低檔次
  • 更改圓頂的規模,因爲此設置看起來很逼真

回答

1

我不知道如何團結,但在DirectX做到這一點,在OpenGL中,您關閉zbuffer(檢查和寫入)並首先繪製天空盒。

然後您打開zbuffer並繪製場景的其餘部分。

My guess is that Unity can do all this for you.

+0

感謝您的研究。 Unity使用靜態天空盒,但我的動力當然是動態的。我找到了一個可能是Unity中唯一的解決方案。你對你的zbuffering是正確的,所以+1。我會更詳細地發佈我自己的解決方案。 – Marnix

0

我有我自己的問題兩個解決方案。第一個並不能解決所有問題。第二個是,但是違揹我自己的設計原則。

我沒有可能改變着色器的z-writing,這是來自@Erno的一個很好的解決方案,因爲使用的着色器是第三方。

選項1

呈現對象就在,設定遠平面100,000和繪製天空後,將其設置回1000。

問題:深度緩衝區仍然填滿非常低和100,000之間的值。這會降低深度緩衝區的準確性,並導致依賴於深度緩衝區的z戰鬥和後期效果問題。

選項2

創建兩臺彼此相連的攝像機。攝像機1首先使用far = 100000, near = 100的設置渲染天幕。攝像機2清除深度緩衝區,並以far = 1000, near = 0.3的設置繪製場景的其餘部分。深度緩衝區現在不包含大的值,因此可以解決深度緩衝區不準確的問題。

問題:攝像機必須通過某個輪詢系統鏈接,因爲相機類別上沒有更改事件(例如,當FoV發生變化時)。我喜歡只有一個攝像頭的事實,但這似乎不太容易。

+1

我強烈建議使用其他着色器或對其進行修改,因爲選項1仍然會產生僞像,而選項2需要額外的通過,而正確的着色器將非常快速和精確。 –

+0

@Erno的確如此,我會與第三方公司覈實一下,看看他們對這個問題的看法。 – Marnix