Portal系列遊戲里的傳送門是如何實現的?
沒玩傳送門之前以為傳送門只是簡單的render to texture欺騙眼球罷了,可當我刻意地從圖一所示的角度觀察傳送口兩側的場景時,我還是驚呆了。Valve是如何做到把傳送口兩側的場景「連結」起來的呢?出現圖二所示的遞歸現象時,Valve又是如何實現的呢?歡迎斧正我混亂的表達。
摘自Commentary:
For the first few months of development, we rendered the views through portals to two offscreen textures. This approach was easy to implement and was compatible with a wide range of graphics hardware. Unfortunately, this method was incompatible with antialiasing and consumed a large amount of video memory in order to handle recursive views through several portals. Because of these disadvantages, we switched to a system which renders portal views recursively into the frame buffer with the aid of the stencil buffer to isolate pixels corresponding to a given portal. This is a more effective scheme because it is compatible with antialiasing and does not consume any additional video memory for offscreen textures.
就是直接遞歸。engine會遞歸不超過9層,每次遞歸的時候會使用Stencil Test剔除掉portal之外的像素從而加速渲染。再加上Source引擎用PVS + portal culling之後可見的物體也很少,所以速度很快。
我把開發者原話轉過來(出自傳送門1中開發者注釋模式)
"[David Kircher] 要表現玩家穿過傳送門的視野,我們必須使用虛擬攝影機,這台攝影機是從傳送門對面拍攝,藉此表現獨立的影像。為了取得正確的影像及有效率的處理表現,我們只呈現透過對面傳送門的有限視野能看見的景像,排除位於虛擬攝影機及對面傳送門平面之間的物品。"
"[David Kircher] When rendering the player"s view through a portal, we must render a separate image using a virtual camera which looks out of the opposite portal. To obtain a correct image and efficient rendering performance, we render only what is visible through the limited field of view of the opposite portal and exclude objects which lie between the virtual camera and the plane of the opposite portal.""[David Kircher] 在開發遊戲的前幾個月,我們將透過傳送門的視野渲染為兩種畫面外的紋理。這種方法很容易付諸實行,而且和許多繪圖硬體兼容。不幸的是,這種方式與反鋸齒技術並不兼容,而且必須消耗大量的顯存才能處理數個傳送門的循環視野。因為這些缺點,我們更換了系統,新系統在樣板緩衝區的協助下,能以循環的方式將傳送門畫面提供給畫面暫存緩衝區,分離對應於相關傳送門的像素。這套系統更有效,因為它與反鋸齒技術兼容,而且不需消耗任何額外的顯存即可產生屏畫面外紋理。"
"[David Kircher] For the first few months of development, we rendered the views through portals to two offscreen textures. This approach was easy to implement and was compatible with a wide range of graphics hardware. Unfortunately, this method was incompatible with antialiasing and consumed a large amount of video memory in order to handle recursive views through several portals. Because of these disadvantages, we switched to a system which renders portal views recursively into the frame buffer with the aid of the stencil buffer to isolate pixels corresponding to a given portal. This is a more effective scheme because it is compatible with antialiasing and does not consume any additional video memory for offscreen textures.""[David Kircher] 這是一個絕佳的地點,可以欣賞一下傳送門的循環本質。如果你將傳送門放在這個走廊的每一側,你會發現傳送門似乎永無止盡,有點像是在全部都是鏡子的大廳一樣。事實上,在任何串連的傳送門中,我們最多支持九種循環的傳送門視野。我們在循環中,在最後的傳送門上複製之前出現的畫面,達成無限循環的效果。當然這樣並不完美,但是這樣的效果經濟又實惠。"
"[David Kircher] This is a great spot to appreciate the recursive nature of portals. If you place a portal on each side of this hallway, you"ll notice the portals seem to go on forever, similar to the effect you get in a hall of mirrors. In actuality, we support a maximum of nine recursive portal views down any chain of portals. We achieve the impression of infinite recursion by copying part of the previously rendered frame onto the final portal in the recursive chain. It"s not absolutely perfect, but it"s inexpensive and effective."3D遊戲/動畫中對鏡廊和攝像機+屏幕這種涉及無限鏡像的場景是如何處理的? - Atlas 的回答
其實這個問題已經有了0.0補充:《傳送門》中遊戲引擎沒有把模型數量翻倍,而是只要視野中出現了循環(即攝像機視野中出現了傳送門)就新建攝像機,新建攝像機重新進行畫面渲染(渲染尺寸取決於相對位置)並進行循環檢定,渲染出圖像之後作為材質顯示到表面上,循環的時候到了一定的次數之後就不再建立新的攝像機,而是直接用之前的圖像。
對面的空間不是真實存在的,你在穿過門的時候單位位置相對於地圖來說其實發生了瞬移,另外的旁白說過遊戲在傳送門附近開了個氣泡,單獨精確處理物理運算以及模型、光影問題。一個模型在穿過傳送門的過程中會同時在兩個位置出現。
循環上限在遊戲設置可調,默認2層,推薦2層,最大9層,1層會導致不足以循環構建圖像(找不到上一個攝像機來複制),遇到嚴重兼容性問題可以設置為0層(即完全無法通過傳送門看後面的場景)。玩家本體使用的主攝像機不算在內。
另外強烈推薦遊戲內的開發者注釋模式@龔敏敏 說的還是太抽象了,你進portal裡面看開發者注釋,其實都有說……
其實最簡單的方案就是在傳送門那裡放一個攝像機,然後把拍到的圖像直接渲染在另一個傳送門那裡。其實開發者注釋裡面都有講,這個方案後來因為無窮遞歸會有一些性能問題,改進了一下。
有個場景管理技術就叫portal。Portal就是用portal實現portal的。https://en.wikipedia.org/wiki/Portal_rendering
3D遊戲/動畫中對鏡廊和攝像機+屏幕這種涉及無限鏡像的場景是如何處理的? - 物理學
最高票的回答說了一部分。physics - How to implement collision detection of portals?這裡解釋了在通過傳送門的途中遇到碰撞是怎麼處理的。傳送門真的是一個很有意思的遊戲,我玩通關的是portal 2,這個valve用source引擎開發的解謎類遊戲確實是很花心思去製作。當然我肯定沒有參與portal的開發= =不過我就yy一下如果我來實現遊戲里傳送門的話我的做法
傳送門2裡面,主角有一隻神奇的槍,左鍵右鍵分別射出藍彈和橙彈,打到牆上分別打開一個藍門和橙門。這個世界只允許最多一對傳送門的存在,左右鍵剛剛好控制完。
且不討論物體和玩家通過門A,從門B出來時會保持物理特性(動量等),先說說視覺特性。在這裡,橙門藍門應該是看成各自的背面,也就是你從橙門看進去,就相當於站在藍門的後面看。
如圖,如果玩家往藍門裡看,實質上,看到的場景應該是在p』的位置看出去(也就是紅門背後看出去)。
所以,要渲染一個場景(先不考慮更特殊的情況),一般是要渲染3次---正常渲染一次,橙門藍門各渲染一次(而且攝像機要改變位置地渲染)。
要確定渲染某個門看到的圖像,肯定就要先算出等效的攝像機位置,所以就肯定要進行坐標變換。那就必須要給每個傳送門設定一個正交基底。假設在渲染藍門的圖像,然後要把藍門坐標系下的相機位置朝向參數轉到橙門坐標系下(並且最後用世界坐標來表示)。
總結起來就是如果同時開了藍門和橙門,就要先正常渲染一次場景,然後設置相機位置,渲染傳送門裡的圖像。
雖然圖片里看不清楚,但是遊戲里自己觀察是可以看到激光線在交界處是有一些突變的,那確實是來自另外一個世界的圖像啊!
傳送門其實有點像鏡子,可以做到畫中畫
如果兩個傳送門對著開,往裡面看的話
這個講道理應該是會無限延伸下去。就是門中門也要用渲染第一層傳送門的方式來渲染。(但是怎麼確定門裡有另一扇門這個我還沒想懂)。但是我仔細觀察過了,這個遞歸渲染的層數是有限的,其他答案也說了是九層,畢竟太小的門也看不清了乾脆就不管了。如果你不斷往裡面走,是走不到盡頭的。但是外面的人看你會覺得你是個「左邊出右邊進左邊出右邊進」無限循環的傻逼。
至於物理特性(動量之類的),那也是要用類似的坐標變換之後才能從另一個門裡出來。
上圖就是站在門中間,左右兩邊是不同的世界。反正呢,這個遊戲真的巨有意思!強推!
似乎別的答主說的都是從遊戲開發的角度來說的,從傳送門本身的世界觀來看,傳送門槍是這樣工作的:
傳送門槍爆炸圖①傳送門槍爆炸圖②嘛,雖然說傳送門屬於science fantasy而不是science fiction,但是就從結構圖上面來看,傳送門槍打開傳送門的原理是利用其中包含的微型黑洞…
Aperture Science的科技實力可想而知,用一個電池(沒錯,電池,圖上面有寫)驅動的手持設備穩定住了一個小型黑洞…有這種科技…去做冷聚變…世界早就和平大同了。
進門相當於傳送,門裡面其實不是實景,是影像
推薦閱讀:
※為什麼韓國 DotA 不行,LOL 那麼牛?
※現實世界裡上有像《傳送門 2》(Portal 2)里那樣令人感到恐怖和震撼的大型機械設備嗎?
※類似《逆轉裁判》的推理遊戲還有那些?(不限平台)
※中國DOTA 現役最好的Carry 位選手是誰?
※對於FPS遊戲,PC平台和家用機哪一個操作更順手?