Minecraft 中的水面反光是什麼原理?

時間 2021-06-01 07:29:41

1樓:喬貓

就是用shader實現的啦,OptiFine載入了shaders,然後用於渲染。。。

負責實現水反的shader是fragment shader,也就是給需要填色的畫素填上顏色的shader。。。在給水面填色時,水反shader會根據當前要填色的畫素的位置和視線的方向,計算從哪個角度入射的光線會最終進入到玩家的視角內,並計算哪個物體會從這個角度對映至當前畫素的位置,並把顏色填入當前畫素——類似光線追蹤。

但直接這麼做太慢了!所以MC的水反,包括大部分遊戲的反射效果,都用了一種近似演算法——只在「玩家能看到的範圍內」進行反射。這樣只需要儲存螢幕上每個畫素的顏色和「深度」(該畫素上顯示的物體離視點的距離)就行了,計算的時候只要計算哪個螢幕上的畫素會從入射角度對映到當前畫素的位置,也就只需要掃瞄螢幕上一條直線上的畫素。

這種近似演算法叫SSR(Screen-Space Reflection)。。。

這樣可以讓水反在大多數情況下取得正常效果時不至於過多地影響渲染速度,但這種演算法也有限制,比如螢幕周圍的入射光線如果來自於螢幕以外,則不能計算出水反;而且水反不能當成「鏡子」來間接看到障礙物之後的東西。也有的時候,如果反射的面被遮擋住了,也會產生錯誤的效果,但是加上水波(改變水面法線)之後,這種錯誤效果基本看不出來。。。

附一張SEUS v10去掉水波之後的截圖,可以看見SSR的一些限制:

2樓:Yanbing Zhao

我的圖形學水平也只是半桶水,不對,連半桶水都沒有,就隨便說一說好了。

水面反射原理其實很簡單,就是反射和折射兩部分的混合。

反射的話,就是把所有的頂點按水面這個平面反射一下,乘以乙個反射矩陣就行了。由於同乙個方塊裡水的法線方向是完全一致的,因此計算起來應該還是比較簡單的。

折射的話,理論上是把水面下的頂點偏移乙個方向,不過MC裡我好像沒看到過水面折射的影響,所以具體我也不是很清楚。

最後把反射部分和折射部分按菲涅耳公式混合在一起就行了,也就是正視水面的時候折射成份更大一些,斜視水面的時候反射成份更大一些,嚴重的時候甚至會全反射(學了這麼多年物理,第一次用在知乎上居然是因為這個,真是悲哀)。

有的shader好像還有波光粼粼的效果,推測是改變了水面的法線。

至於MC原版為什麼沒有光影,是因為MC原版幾乎全部都是固定渲染管線渲染的,弄出來反射折射很麻煩,至於更複雜的光影特性,就更不可能了。Optifine做的是強行切入了MC的渲染流程,這才讓編寫shader干預MC的渲染邏輯變得更可能一些。

另外,PE版本的MC也是有光影的,上乙個答主已經答過了。

3樓:

這就要從著色器開始說起

首先,我們用的光影,是由乙個叫GLSL Shaders Mod來載入的(目前已整合到OptiFine Mod中了),GLSL是什麼?GLSL全名叫OpenGL Shading Language,具體的相關資料可以參閱WiKi,這需要有一定的計算機圖形的基礎知識,個人在這方面沒有過多研究,其他內容看看有沒有什麼圖形學大神能幫你補充一下吧。

以及PE版(現在叫基岩版)也是有水反的,也是通過外部渲染器來實現的[Win10版光影] Source Reload Shaders -- 用光影開啟全新美...

如何在 Minecraft 中畫圓?

bit 這個東西嘛。完全可以用命令方塊實現吖 如果空心的就setblock就行,實心fill,用相對座標然後轉xRot和yRot 好像是這麼叫 趙佩鈜 利用 區域性座標 和盔甲架。在圓心處放置乙個盔甲架,用兩個迴圈型命令方塊分別迴圈執行以下命令 execute e type armor stand ...

Minecraft 中的硬通貨是什麼?

熊孩子 在有外部東西介入,比如有外掛程式 OP等等的情況下,帶特定NBT的物品是最合適的,因為可以根據市場需求增加或減少市面上流通的貨幣 如果僅僅是一群普通生存的玩家,最適合作為硬通貨的是那些不可再生的資源,比如沙 泥土 岩漿 鑽石 各種礦物原礦 附魔金蘋果等等,以及頭顱 限殭屍 骷髏 爬行者頭顱 ...

「神的靈行在水面上」水面是指?

水面上是乙個宇宙中凌空的水球。宇宙中凌空的水球也叫 彗星。但它是個水的固態。顯然 水面上 三個字是液態。有 上 就是有 下 既是已存在地心引力的意思。起先,神的靈出現在乙個已經存在地心引力的有液態水的星球上,說明了神的靈是乙個外來者,後來者,是在地球經過了幾十億年日子後形成了液態水的表面之後,神的靈...