206 lines
No EOL
7.5 KiB
HTML
206 lines
No EOL
7.5 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
|
||
<meta name=Generator content="Microsoft FrontPage 5.0">
|
||
<title>Portals</title>
|
||
|
||
<style>
|
||
<!--
|
||
/* Style Definitions */
|
||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||
{margin:0in;
|
||
margin-bottom:.0001pt;
|
||
font-size:12.0pt;
|
||
font-family:"Times New Roman";}
|
||
/* Page Definitions */
|
||
@page Section1
|
||
{size:8.5in 11.0in;
|
||
margin:1.0in 1.25in 1.0in 1.25in;}
|
||
div.Section1
|
||
{page:Section1;}
|
||
-->
|
||
</style>
|
||
|
||
</head>
|
||
|
||
<body lang=EN-US style='text-justify-trim:punctuation'>
|
||
|
||
<div class=Section1>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'><b><font size="6">Portals</font></b></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Portals
|
||
divide the world into cells. Each cell is a non-solid, non-detail volume
|
||
inside the BSP that does not cross any portals. Every non-solid part of
|
||
the map exists in exactly one cell. Cells can have any arbitrary shape,
|
||
such as L or cube. Portals connect two cells. The classic example is
|
||
doorways in a house, where each room is a cell and the doorways are portals.</p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Whenever
|
||
a cell is determined to be at least partially visible, all of the world
|
||
geometry in that cell gets drawn. If a world surface exists on both sides
|
||
of a portal, it gets drawn if either of the two cells are drawn. </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Note:
|
||
model bounding boxes will get clipped against the portals so they may not get
|
||
drawn even if they are in a cell that is drawn.</p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Portals
|
||
gives better culling than PVS since they effectively do the exact cell-to-cell
|
||
PVS for a single view point. Portals can even cull geometry when you turn
|
||
the mouse, rather than being fixed for a given point. Too many portals
|
||
can slow the game down because it does too much time calculating what to
|
||
draw. Portals do frustum culling of triangles, (strafe in front of a
|
||
doorway in CoD2 with r_showtris 1 to observe this in action). Because of this it
|
||
is not necessary to have portals inside of rooms, only at the windows and doors.
|
||
Use r_showportals 1 in the game to see where IW placed their portals. </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Too
|
||
few portals can slow the game down because it quickly decides to draw too much.</p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>You
|
||
have to place portals in radiant for portal-based rendering. A
|
||
portal can be any brush face; it doesn't have to be axial and it doesn't have
|
||
to be square. To create a portal, create a brush and then make most sides
|
||
<EFBFBD>textures / common / portalnodraw<61> and one side "textures / common /
|
||
portal". </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>portalnodraw
|
||
is just like nodraw but is designed to be used with portal.</p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Only
|
||
structural brushes can make up the other walls of a cell with portals. Open a
|
||
map and filter out the patches (Alt-3), detail brushes (Ctrl-d) and entities
|
||
(Alt-2) and observe whats left. Usually this will be just a few simple walls, the
|
||
sky and some caulk brushes. This is what the portal render <20>sees<65>. </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Portals
|
||
are not allowed to have the same cell on both sides. If the compiler
|
||
detects this, it will ignore the portal and issue a warning. This is known as a
|
||
portal leak and it will generate a .lin file the same as a regular leak. </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Portals
|
||
are not allowed to have one side completely against a solid brush (partially is
|
||
okay, including partially inside solid). If the compiler detects this, it
|
||
will ignore the portal and issue a warning.</p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Portals
|
||
are not allowed the T-junction with other portals. The portal whose face is
|
||
touching the edge of the other perpendicular portal must have its face split
|
||
along the edge it shares with that portal. </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'> </span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>An
|
||
example of placing 2 portals to cull geometry around a corner: The diagonal
|
||
portals here each share 1 edge exactly on the inside corner of this hallway.
|
||
Cell number 1 can not see the portal face which divides cell 2 from cell 3.
|
||
Since it can not see this portal, it does not draw the triangles inside cell 3. </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'> </span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>############</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'># 2 /<2F><> 3</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'># /</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'># /########</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'># / #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>#/ #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'># 1 #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'> </span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>Another
|
||
example. Position 4 can see through the portal into the cell where position 5
|
||
is, however... frustum culling keeps the observer at position 4 from drawing
|
||
the object at position 5.</p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'> </span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>##########-------##########</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'># <20>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'>
|
||
<span style='font-size:10.0pt;
|
||
'>#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #</span></p>
|
||
|
||
<p class=MsoNormal style='text-autospace:none'> </p>
|
||
|
||
</div>
|
||
|
||
</body>
|
||
|
||
</html> |