1074 lines
44 KiB
Text
1074 lines
44 KiB
Text
|
From sbaker@link.com Mon Jan 12 09:03:37 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
|
||
|
["11420" "Mon" "12" "January" "1998" "11:03:54" "-0600" "Steve Baker" "sbaker@link.com" "<Pine.SGI.3.96.980112101657.22119D-100000@lechter.bgm.link.com>" "318" "[FGFS] Da-da-da (fwd)" "^From:" nil nil "1" nil nil nil nil nil]
|
||
|
nil)
|
||
|
X-VM-Message-Order:
|
||
|
(1 2 3 5 4 6 7 8 9 10 11 12 13 14 15
|
||
|
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
||
|
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
||
|
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
||
|
61 62 63)
|
||
|
X-VM-Summary-Format: "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
|
||
|
X-VM-Labels: ("r")
|
||
|
X-VM-VHeader: ("Resent-" "From:" "Sender:" "To:" "Apparently-To:" "Cc:" "Subject:" "Date:") nil
|
||
|
X-VM-Bookmark: 4
|
||
|
Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id JAA01094
|
||
|
for <curt@me.umn.edu>; Mon, 12 Jan 1998 09:03:28 -0600 (CST)
|
||
|
Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
|
||
|
by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
|
||
|
id JAA14248 for <curt@me.umn.edu>; Mon, 12 Jan 1998 09:02:52 -0600 (CST)
|
||
|
X-Sender: steve@lechter.bgm.link.com
|
||
|
Reply-To: Steve Baker <sbaker@link.com>
|
||
|
Message-ID: <Pine.SGI.3.96.980112101657.22119D-100000@lechter.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
To: curt@me.umn.edu
|
||
|
Subject: [FGFS] Da-da-da (fwd)
|
||
|
Date: Mon, 12 Jan 1998 11:03:54 -0600 (CST)
|
||
|
|
||
|
|
||
|
|
||
|
> I went with the wife to see "Titanic" tonight. It was all sold out,
|
||
|
|
||
|
It was a 'girl' movie - my Wife loved it - my kid and I zzzzz'd out.
|
||
|
|
||
|
> and the only other movie that hadn't started yet was "007" which Ruth
|
||
|
> didn't want see. :-(
|
||
|
|
||
|
Now *that* was a 'boy' movie. Easily the best Bond movie so far (although
|
||
|
the chase scene with the Tank in Goldeneye is still up there).
|
||
|
|
||
|
> So I just generated a section of scenery in "ultra-high" detail and am
|
||
|
> getting about 0.2 frames a second.
|
||
|
|
||
|
Pretty neat ... but what it needs is:
|
||
|
|
||
|
####### ####### # # ####### # # ###### #######
|
||
|
# # # # # # # # # #
|
||
|
# # # # # # # # # #
|
||
|
# ##### # # # # ###### #####
|
||
|
# # # # # # # # # #
|
||
|
# # # # # # # # # #
|
||
|
# ####### # # # ##### # # #######
|
||
|
|
||
|
(which is v.easy to add - and comes for free on a 3Dfx - although it'll
|
||
|
*KILL* your frame rate on software-only Mesa).
|
||
|
|
||
|
Could you do a screen dump of a wire-frame rendering of that so people can
|
||
|
see the tesselation? Just set xglPolygonMode(GL_FRONT_AND_BACK,GL_LINE).
|
||
|
|
||
|
> Anyone know anything about view frustum culling?
|
||
|
|
||
|
Yep.
|
||
|
|
||
|
Two issues:
|
||
|
|
||
|
1) Scene hierarchy generation (offline).
|
||
|
|
||
|
2) Runtime culling.
|
||
|
|
||
|
|
||
|
|
||
|
Hierarchy:
|
||
|
==========
|
||
|
|
||
|
There are lots of ways to do this. I usually build an heirerchical description
|
||
|
of each terrain tile. I typically build a tree structure that's organized
|
||
|
as follows:
|
||
|
|
||
|
| The World.
|
||
|
|
|
||
|
___________________|___
|
||
|
| | | | | | |
|
||
|
* * * * * * * Terrain tiles currently loaded
|
||
|
| | | | | | |
|
||
|
|
|
||
|
|
|
||
|
_____|_____
|
||
|
| | | |
|
||
|
* * * * Quarter-tiles
|
||
|
| | | |
|
||
|
|
|
||
|
|
|
||
|
_____|_____
|
||
|
| | | |
|
||
|
* * * * Sixteenth-tiles
|
||
|
| | | |
|
||
|
|
||
|
...and so on down until the number of polygons in each 'object' gets 'small enough'.
|
||
|
|
||
|
When you do this, don't try to split polygons when they cross a quarter or a
|
||
|
sixteenth tile boundary - just dump each polygon into the nearest 'bucket' to
|
||
|
it's centroid.
|
||
|
|
||
|
Do your tri-stripping on the leaf nodes of this tree - so that each tristrip
|
||
|
is contained entirely within one bucket.
|
||
|
|
||
|
Eventually, you will need to include buildings, roads, rivers, etc. Since these
|
||
|
need to be culled by level of detail, it is often useful to put them into a separate
|
||
|
tree structure that parallels the terrain 'skin' structure.
|
||
|
|
||
|
Finally, compute a bounding sphere around each leaf node, find the best fit
|
||
|
sphere by finding the maximum and minimim x, y and z of the tristrips in that
|
||
|
leaf node, taking the mid-point and then finding the vertex that is furthest
|
||
|
from that center point and using it as the radius.
|
||
|
|
||
|
Compute the bounding sphere for each level in the tree (everywhere where there is
|
||
|
a '*' in my diagram).
|
||
|
|
||
|
Runtime:
|
||
|
========
|
||
|
|
||
|
At runtime, you walk that tree every frame, testing the bounding sphere against
|
||
|
the view frustum.
|
||
|
|
||
|
* If the sphere lies entirely outside the view frustum then stop traversal
|
||
|
for that node. There is no need to test any of the nodes beneath this one
|
||
|
(we know that none of their leaf tristrips are visible).
|
||
|
|
||
|
* If the sphere lies entirely inside the view frustum then traverse immediately
|
||
|
to all of the leaves below this node without doing any more sphere testing
|
||
|
on them - draw all of the tristrips that are there. (We know they are all visible)
|
||
|
|
||
|
* If the sphere straddles the view frustum then check each daughter node in
|
||
|
turn by applying this algorithm on them recursively. If a leaf node straddles
|
||
|
the view frustrum then it's bad luck, you just draw all the tristrips it
|
||
|
contains and let OpenGL do the work.
|
||
|
|
||
|
You might also want to put a 'transition range' onto each node and if it
|
||
|
lies beyond that range cull it. You can also use this to conveniently
|
||
|
switch levels of detail by having multiple versions of each object in
|
||
|
the tree.
|
||
|
|
||
|
Testing a sphere against the View Frustum:
|
||
|
==========================================
|
||
|
|
||
|
In most cases, we can describe the volume of space that you can see
|
||
|
through the little glass window on the front of your CRT using a
|
||
|
Frustum (frequently mis-spelled as Frustrum or Fustrum even in some
|
||
|
text books).
|
||
|
|
||
|
A frustum is a truncated pyramid - which typically bounded by six
|
||
|
planes called:
|
||
|
|
||
|
NEAR, FAR, LEFT, RIGHT, TOP, BOTTOM
|
||
|
|
||
|
There are applications that require additional clipping planes (eg for
|
||
|
non-rectangular screens) - extending the work described in this
|
||
|
to cater for that is not hard).
|
||
|
|
||
|
In principal, all six planes can be constructed as general plane
|
||
|
equations:
|
||
|
|
||
|
A x + B y + C z + D == 0
|
||
|
|
||
|
However, for most applications, NEAR and FAR are parallel to the
|
||
|
screen, LEFT, RIGHT,TOP and BOTTOM all meet at the eye and the eye lies
|
||
|
along a vector that extends out from the center of the screen and is
|
||
|
perpendicular to it. This simplifies the equations considerably for
|
||
|
practical applications.
|
||
|
|
||
|
Transforms.
|
||
|
~~~~~~~~~~~
|
||
|
|
||
|
It is easiest to perform culling in a coordinate system where the
|
||
|
eyepoint is at the origin and the line from the eye through the center
|
||
|
of the screen lies along one major axis with the edges of the screen
|
||
|
parallel to the remaining two axes. This coordinate system is called
|
||
|
'Eye Space'.
|
||
|
|
||
|
Testing a Sphere against a Frustum.
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
The most important thing to bear in mind about culling is that the
|
||
|
first trivial-reject test you apply is by far the most time-critical.
|
||
|
This test is always applied to more nodes than any of the subsequent
|
||
|
tests.
|
||
|
|
||
|
So, do the cheapest test first.
|
||
|
|
||
|
This is typically the NEAR plane test. Everything behind the viewers
|
||
|
head gets chopped out - and it's an especially cheap test.
|
||
|
|
||
|
|
||
|
if ( obj_sphere.center.z < near_plane - obj_sphere.radius )
|
||
|
REJECT!!
|
||
|
|
||
|
|
||
|
...next do the second cheapest test (assuming you know that your
|
||
|
database could possibly extend beyond the far clip plane)...
|
||
|
|
||
|
|
||
|
if ( obj_sphere.center.z - obj_sphere.radius > far_plane )
|
||
|
REJECT!!
|
||
|
|
||
|
|
||
|
...and *then* (for each of the other 4 planes) do...
|
||
|
|
||
|
|
||
|
if ( distance( obj.position, plane ) <= obj_sphere.radius )
|
||
|
REJECT!!
|
||
|
|
||
|
|
||
|
(The algorithm for computing that 'distance()' function is described
|
||
|
below).
|
||
|
|
||
|
It's also useful to know that in many applications, you cull more
|
||
|
objects from the left and right faces of the frustum than you do from
|
||
|
the top and bottom - so test left, then right, then bottom then top.
|
||
|
|
||
|
Also, with bounding sphere tests, you shouldn't forget to do
|
||
|
total-accept as well as total-reject tests. Once you know that an
|
||
|
object's sphere is TOTALLY on screen, you don't have to descend into
|
||
|
the daughter objects to cull-test them...you *know* they are all
|
||
|
on-screen.
|
||
|
|
||
|
Another way to look at that it to remember which of the six possible
|
||
|
plane tests didn't even touch the sphere - as you work your way down
|
||
|
the object hierarchy, you can accumulate those flags and avoid even
|
||
|
testing those planes that a parent sphere has already cleanly passed.
|
||
|
If you do this then a vast percentage of your spheres will only need to
|
||
|
be tested against one plane. However, for the normal case of a simple
|
||
|
frustum - when you examine the fully optimised
|
||
|
distance-of-point-from-plane code (below), you may well conclude that
|
||
|
this additional logic doesn't justify the paltry amount of additional
|
||
|
math that it might save.
|
||
|
|
||
|
Computing the Distance from Sphere Center to Clipping Plane.
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
A plane can be represented by the equation
|
||
|
|
||
|
|
||
|
Ax + By + Cz + D = 0 ;
|
||
|
|
||
|
|
||
|
A,B,C is just the surface normal of the plane and D is the shortest
|
||
|
distance from the origin to the plane.
|
||
|
|
||
|
So, if you need to find the distance of a point from the plane, just
|
||
|
imagine a new plane that goes through your test point and is parallel
|
||
|
to the plane you want to test. The plane equation of that new plane
|
||
|
would be:
|
||
|
|
||
|
|
||
|
A'x + B'y + C'z + D' = 0 ;
|
||
|
|
||
|
|
||
|
Since the two planes are parallel, their surface normals are the same,
|
||
|
so
|
||
|
|
||
|
|
||
|
A' == A B' == B C' == C D' == D + distance_between_the_two_planes
|
||
|
|
||
|
|
||
|
...the only thing that's different is their D values - which differ by
|
||
|
the distance of your test point from the original plane.
|
||
|
|
||
|
So, for a point (x,y,z), the distance 'd' from the plane (A,B,C,D) is
|
||
|
derived as:
|
||
|
|
||
|
|
||
|
d = D' - D
|
||
|
= -A'x - B'y - C'z - D
|
||
|
= -Ax - By - Cz - D
|
||
|
= -( [ABC]dot[xyz] + D )
|
||
|
|
||
|
|
||
|
A dot-product of the point and the surface normal of the plane, plus
|
||
|
the distance from the plane to the origin. Three multiplies, three
|
||
|
additions and a negation.
|
||
|
|
||
|
As an aside - if you consider the point (x,y,z) as a FOUR element
|
||
|
homogeneous vector (x,y,z,w) then 'w' is 1.0 and you can compute the
|
||
|
distance by simply taking the four element dot-product of (A,B,C,D)
|
||
|
with (x,y,z,w). If you have fast 4x4 matrix math hardware in your
|
||
|
machine then you can use it to compute the distance from a point to all
|
||
|
four planes in a single operation!
|
||
|
|
||
|
That's the general result for an arbitary plane - but culling to the
|
||
|
view frustum is a very special case. If you are working in eye-relative
|
||
|
coordinates (IMHO this is best), then since all TOP,BOTTOM,LEFT,RIGHT
|
||
|
planes of the frustum meet at the eye - and since the eye is at the
|
||
|
origin (by definition), then D is always zero for those planes and that
|
||
|
saves you a subtract.
|
||
|
|
||
|
If you are feeling even more in need of optimisation - then you can
|
||
|
save one multiply per plane by realising that (for rectangular screens)
|
||
|
one of the three components of the plane equation will always be zero.
|
||
|
|
||
|
So, for the LEFT clip plane, the Y component of the normal of the plane
|
||
|
is zero, so the distance to the left or right plane is just
|
||
|
|
||
|
|
||
|
d = -( Ax + Cz )
|
||
|
|
||
|
|
||
|
...and to the top or bottom plane it's just:
|
||
|
|
||
|
|
||
|
d = -( By + Cz )
|
||
|
|
||
|
|
||
|
Furthermore, we know that the A component for the LEFT plane is just
|
||
|
the negation of the A component of the RIGHT plane, and the C component
|
||
|
is the same for both LEFT and RIGHT (and similarly, the B component of
|
||
|
the TOP plane, is the negation of the B component for the BOTTOM plane
|
||
|
and the C component is the same for both TOP and BOTTOM). This means
|
||
|
that you only need four multiplies and four additions to do the entire
|
||
|
job. (Since you are only using this for culling, you don't need the
|
||
|
minus sign - just reverse the conditional).
|
||
|
|
||
|
The NEAR and FAR planes are typically parallel to the X/Y plane. That
|
||
|
means that A and B are both zero and C is one (or minus-one) - but D is
|
||
|
not zero, so the math boils down to an add and a negate:
|
||
|
|
||
|
|
||
|
d = -(z + D)
|
||
|
|
||
|
|
||
|
Conclusions.
|
||
|
~~~~~~~~~~~~
|
||
|
|
||
|
Sphere-based culling can be extremely cost-effective. It's so cheap
|
||
|
that even if you feel the need to use a bounding cubeoid (or even a yet
|
||
|
more complex shape), it's still worth doing a sphere-based cull first
|
||
|
just to get rid of the trivial accept and reject cases.
|
||
|
|
||
|
|
||
|
Steve Baker 817-619-8776 (Vox/Vox-Mail)
|
||
|
Hughes Training Inc. 817-619-4028 (Fax)
|
||
|
2200 Arlington Downs Road SBaker@link.com (eMail)
|
||
|
Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
|
||
|
http://www.hti.com http://web2.airmail.net/sjbaker1 (personal)
|
||
|
|
||
|
** Beware of Geeks bearing GIF's. **
|
||
|
|
||
|
|
||
|
From owner-flight-gear@me.umn.edu Thu Jan 15 21:09:17 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||
|
["1752" "Thu" "15" "January" "1998" "22:08:56" "-0500" "Bob Kuehne" "rpk@sgi.com" nil "41" "Re: [FGFS] Status Update w/ Scenery" "^From:" nil nil "1" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: (from majordom@localhost)
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.6) id VAA10212
|
||
|
for flight-gear-outgoing; Thu, 15 Jan 1998 21:09:17 -0600 (CST)
|
||
|
X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
|
||
|
Received: from sgi.sgi.com (SGI.COM [192.48.153.1])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.6) with SMTP id VAA10205
|
||
|
for <flight-gear@me.umn.edu>; Thu, 15 Jan 1998 21:09:11 -0600 (CST)
|
||
|
Received: from dataserv.detroit.sgi.com (relay.detroit.sgi.com [169.238.128.2]) by sgi.sgi.com (950413.SGI.8.6.12/970507) via ESMTP id TAA28641
|
||
|
for <@external-mail-relay.sgi.com:flight-gear@me.umn.edu>; Thu, 15 Jan 1998 19:09:07 -0800
|
||
|
env-from (rpk@sgi.com)
|
||
|
Received: from applab3.detroit.sgi.com by dataserv.detroit.sgi.com via ESMTP (951211.SGI.8.6.12.PATCH1502/930416.SGI)
|
||
|
for <@dataserv.detroit.sgi.com:flight-gear@me.umn.edu> id WAA02541; Thu, 15 Jan 1998 22:09:00 -0500
|
||
|
Received: from localhost (rpk@localhost) by applab3.detroit.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via SMTP id WAA04150 for <flight-gear@me.umn.edu>; Thu, 15 Jan 1998 22:08:56 -0500
|
||
|
X-Sender: rpk@applab3.detroit.sgi.com
|
||
|
In-Reply-To: <199801160204.UAA06347@kenai.me.umn.edu>
|
||
|
Message-ID: <Pine.SGI.3.96.980115215042.4110A-100000@applab3.detroit.sgi.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
Precedence: bulk
|
||
|
Reply-To: flight-gear@me.umn.edu
|
||
|
From: Bob Kuehne <rpk@sgi.com>
|
||
|
Sender: owner-flight-gear@me.umn.edu
|
||
|
To: flight-gear@me.umn.edu
|
||
|
Subject: Re: [FGFS] Status Update w/ Scenery
|
||
|
Date: Thu, 15 Jan 1998 22:08:56 -0500 (EST)
|
||
|
|
||
|
On Thu, 15 Jan 1998, Curtis L. Olson wrote:
|
||
|
|
||
|
> Eric Mitchell (from the MSFS world) sent me some really nice textures,
|
||
|
> so I may just have to sit down and figure out how to texture a polygon
|
||
|
> in OpenGL. It looks like the hardest part will be deciding what image
|
||
|
> format to use and figuring out how to read that into memory so OpenGL
|
||
|
> can use it as a texture.
|
||
|
|
||
|
1) load the texture (and mipmaps) via glTexImage2D. Ideally we'll want to
|
||
|
use a bound texture (in 1.1, and in 1.0 as an extension) for efficency.
|
||
|
|
||
|
2) enable texturing with glEnable( GL_TEXTURE_2D )
|
||
|
|
||
|
3) Throw a 'glTexCoord2[*]' (your favorite variant of that call) next to
|
||
|
each vertex you draw.
|
||
|
|
||
|
> I have an example of how to do this with the JPEG format using
|
||
|
> jpeglib. IRIX RGB format seems like it might be the most
|
||
|
> straightforward, but not the most space efficient. I don't believe
|
||
|
|
||
|
on disk - note that in memory the only type of image data that most OpenGL
|
||
|
implementations can deal with is uncompressed.
|
||
|
|
||
|
> it's pretty easy to convert amongst these formats, but not necessarily
|
||
|
> as easy to read them into your program.
|
||
|
> One of these day's I'm going to have to break down and buy an OpenGL
|
||
|
> book ... I bet they tell you exactly how to do this stuff. :-)
|
||
|
|
||
|
You, sir, are a candidate for the Red Book. :)
|
||
|
|
||
|
Bob
|
||
|
|
||
|
Bob Kuehne | There was coffee. | Applications
|
||
|
rpk@sgi.com | Life would go on. | Consulting
|
||
|
248/848-4465 | William Gibson, The Winter Market | Silicon Graphics
|
||
|
|
||
|
-------------------------------------
|
||
|
Please visit the Flight Gear web page:
|
||
|
http://www.menet.umn.edu/~curt/fgfs/
|
||
|
For help on using this list (especially unsubscribing), send a message to
|
||
|
"flight-gear-request@me.umn.edu" with a single line of text: "help".
|
||
|
|
||
|
From owner-flight-gear@me.umn.edu Fri Jan 16 01:41:59 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||
|
["1477" "Fri" "16" "January" "1998" "03:42:36" "-0600" "Steve Baker" "sbaker@link.com" nil "38" "Re: [FGFS] Status Update w/ Scenery" "^From:" nil nil "1" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: (from majordom@localhost)
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.6) id BAA15817
|
||
|
for flight-gear-outgoing; Fri, 16 Jan 1998 01:41:59 -0600 (CST)
|
||
|
X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
|
||
|
Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id BAA15813
|
||
|
for <flight-gear@me.umn.edu>; Fri, 16 Jan 1998 01:41:53 -0600 (CST)
|
||
|
Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
|
||
|
by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
|
||
|
id BAA10510 for <flight-gear@me.umn.edu>; Fri, 16 Jan 1998 01:41:21 -0600 (CST)
|
||
|
X-Sender: steve@lechter.bgm.link.com
|
||
|
In-Reply-To: <Pine.SGI.3.96.980115215042.4110A-100000@applab3.detroit.sgi.com>
|
||
|
Message-ID: <Pine.SGI.3.96.980116033805.27487B-100000@lechter.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
Precedence: bulk
|
||
|
Reply-To: flight-gear@me.umn.edu
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
Sender: owner-flight-gear@me.umn.edu
|
||
|
To: flight-gear@me.umn.edu
|
||
|
Subject: Re: [FGFS] Status Update w/ Scenery
|
||
|
Date: Fri, 16 Jan 1998 03:42:36 -0600 (CST)
|
||
|
|
||
|
On Thu, 15 Jan 1998, Bob Kuehne wrote:
|
||
|
|
||
|
> 1) load the texture (and mipmaps) via glTexImage2D. Ideally we'll want to
|
||
|
> use a bound texture (in 1.1, and in 1.0 as an extension) for efficency.
|
||
|
|
||
|
Whether to load or compute the MIPmaps is an interesting question.
|
||
|
|
||
|
The nice thing about loading the MIPmaps from disk is that you can
|
||
|
use off-line tools to compute fancy MIPmaps in some special cases -
|
||
|
notably for translucent textures.
|
||
|
|
||
|
Talk to me off-line for an in-depth discussion sometime.
|
||
|
|
||
|
> > One of these day's I'm going to have to break down and buy an OpenGL
|
||
|
> > book ... I bet they tell you exactly how to do this stuff. :-)
|
||
|
>
|
||
|
> You, sir, are a candidate for the Red Book. :)
|
||
|
|
||
|
No question. Purchase (in this order):
|
||
|
|
||
|
Red (make sure your bookstore doesn't stick you with V1.0!!)
|
||
|
Green
|
||
|
Blue (but only if you dislike reading man pages off the screen)
|
||
|
|
||
|
Steve Baker 817-619-8776 (Vox/Vox-Mail)
|
||
|
Hughes Training Inc. 817-619-4028 (Fax)
|
||
|
2200 Arlington Downs Road SBaker@link.com (eMail)
|
||
|
Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
|
||
|
http://www.hti.com http://web2.airmail.net/sjbaker1 (personal)
|
||
|
|
||
|
** Beware of Geeks bearing GIF's. **
|
||
|
|
||
|
|
||
|
-------------------------------------
|
||
|
Please visit the Flight Gear web page:
|
||
|
http://www.menet.umn.edu/~curt/fgfs/
|
||
|
For help on using this list (especially unsubscribing), send a message to
|
||
|
"flight-gear-request@me.umn.edu" with a single line of text: "help".
|
||
|
|
||
|
From sbaker@link.com Fri Jan 16 01:28:35 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||
|
["2966" "Fri" "16" "January" "1998" "03:29:18" "-0600" "Steve Baker" "sbaker@link.com" nil "74" "Re: [FGFS] Status Update w/ Scenery" "^From:" nil nil "1" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.6) with ESMTP id BAA15513
|
||
|
for <curt@me.umn.edu>; Fri, 16 Jan 1998 01:28:34 -0600 (CST)
|
||
|
Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
|
||
|
by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
|
||
|
id BAA02053 for <curt@me.umn.edu>; Fri, 16 Jan 1998 01:28:02 -0600 (CST)
|
||
|
X-Sender: steve@lechter.bgm.link.com
|
||
|
Reply-To: Steve Baker <sbaker@link.com>
|
||
|
In-Reply-To: <199801160204.UAA06347@kenai.me.umn.edu>
|
||
|
Message-ID: <Pine.SGI.3.96.980116031847.27041B-100000@lechter.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
To: "Curtis L. Olson" <curt@me.umn.edu>
|
||
|
Subject: Re: [FGFS] Status Update w/ Scenery
|
||
|
Date: Fri, 16 Jan 1998 03:29:18 -0600 (CST)
|
||
|
|
||
|
On Thu, 15 Jan 1998, Curtis L. Olson wrote:
|
||
|
|
||
|
> 5. This allows me to generate very nice images with the one exception
|
||
|
> which you can clearly see if you view the picture. The shared vertices
|
||
|
> aren't currently using shared normals, so the shading doesn't
|
||
|
> transition smoothly across tile boundaries.
|
||
|
|
||
|
We cheat and point all the vertices along the edges of squares
|
||
|
straight upwards.
|
||
|
|
||
|
The reason for this is simple - it allows us to build each square
|
||
|
independantly of the others - which is an important issue when
|
||
|
databases are build by a number of different people at different
|
||
|
times.
|
||
|
|
||
|
The result is remarkably reasonable - you still can't really tell
|
||
|
where the terrain tile edges are.
|
||
|
|
||
|
> Eric Mitchell (from the MSFS world) sent me some really nice textures,
|
||
|
> so I may just have to sit down and figure out how to texture a polygon
|
||
|
> in OpenGL. It looks like the hardest part will be deciding what image
|
||
|
> format to use and figuring out how to read that into memory so OpenGL
|
||
|
> can use it as a texture.
|
||
|
|
||
|
Consider using PNG as your image format - it's the future - it's very
|
||
|
compact, the loader is freeware, it's not a "lossy" format.
|
||
|
|
||
|
> I have an example of how to do this with the JPEG format using
|
||
|
> jpeglib.
|
||
|
|
||
|
JPEG is **NOT** a good choice - the data compression is "LOSSY" -
|
||
|
when you compress an image and decompress it, what you end up with
|
||
|
is different from what you started with. The compression scheme is
|
||
|
designed to not be noticable to the human eye - but that doesn't
|
||
|
hold up when the image is viewed in perspective. JPEG sucks.
|
||
|
|
||
|
> IRIX RGB format seems like it might be the most
|
||
|
> straightforward, but not the most space efficient.
|
||
|
|
||
|
True - but for lossless compression (where compress+decompress == no-op)
|
||
|
it's not far from optimal.
|
||
|
|
||
|
> I don't believe GIF is a 24bit color format (only 8bit)
|
||
|
|
||
|
That's true - there are also legal issues over it's copyright/patent.
|
||
|
|
||
|
> BMP has "Bill" written all over it (enough said.) :-)
|
||
|
|
||
|
Exactly.
|
||
|
|
||
|
> But, it's pretty easy to convert amongst these formats,
|
||
|
> but not necessarily as easy to read them into your program.
|
||
|
|
||
|
PNG is easy bacuse there are is a standard (and really good)
|
||
|
library available. It's also supported by both major web
|
||
|
browsers. It's the official replacement for GIF on the web.
|
||
|
|
||
|
> One of these day's I'm going to have to break down and buy an OpenGL
|
||
|
> book ... I bet they tell you exactly how to do this stuff. :-)
|
||
|
|
||
|
Yep - the example in the Red book is about all you need.
|
||
|
|
||
|
I'm sure you could get what you need from one of the Mesa
|
||
|
example programs though (in fact, aren't all the RedBook
|
||
|
examples distributed with Mesa? - I forget).
|
||
|
|
||
|
Steve Baker 817-619-8776 (Vox/Vox-Mail)
|
||
|
Hughes Training Inc. 817-619-4028 (Fax)
|
||
|
2200 Arlington Downs Road SBaker@link.com (eMail)
|
||
|
Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
|
||
|
http://www.hti.com http://web2.airmail.net/sjbaker1 (personal)
|
||
|
|
||
|
** Beware of Geeks bearing GIF's. **
|
||
|
|
||
|
|
||
|
From owner-flight-gear@me.umn.edu Thu Feb 19 12:34:42 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
|
||
|
["3263" "Thu" "19" "February" "1998" "12:35:18" "-0600" "Steve Baker" "sbaker@link.com" "<Pine.SGI.3.96.980219121749.23466B-100000@lechter.bgm.link.com>" "85" "Re: [FGFS] New HUD Screen Shots" "^From:" nil nil "2" nil nil (number " " mark " R Steve Baker Feb 19 85/3263 " thread-indent "\"Re: [FGFS] New HUD Screen Shots\"\n") nil nil]
|
||
|
nil)
|
||
|
Received: (from majordom@localhost)
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.8) id MAA15262
|
||
|
for flight-gear-outgoing; Thu, 19 Feb 1998 12:34:42 -0600 (CST)
|
||
|
X-Authentication-Warning: meserv.me.umn.edu: majordom set sender to owner-flight-gear@me.umn.edu using -f
|
||
|
Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id MAA15258
|
||
|
for <flight-gear@me.umn.edu>; Thu, 19 Feb 1998 12:34:35 -0600 (CST)
|
||
|
Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
|
||
|
by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
|
||
|
id MAA19280 for <flight-gear@me.umn.edu>; Thu, 19 Feb 1998 12:33:57 -0600 (CST)
|
||
|
X-Sender: steve@lechter.bgm.link.com
|
||
|
In-Reply-To: <199802191621.KAA09095@kenai.me.umn.edu>
|
||
|
Message-ID: <Pine.SGI.3.96.980219121749.23466B-100000@lechter.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
Precedence: bulk
|
||
|
Reply-To: flight-gear@me.umn.edu
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
Sender: owner-flight-gear@me.umn.edu
|
||
|
To: flight-gear@me.umn.edu
|
||
|
Subject: Re: [FGFS] New HUD Screen Shots
|
||
|
Date: Thu, 19 Feb 1998 12:35:18 -0600 (CST)
|
||
|
|
||
|
On Thu, 19 Feb 1998, Curtis L. Olson wrote:
|
||
|
|
||
|
> Here's where I'm at with textures.
|
||
|
>
|
||
|
> 1. I gleaned some "RGB" format texture loading code out of a GLUT
|
||
|
> demo.
|
||
|
|
||
|
So you have the texture into OpenGL using glGenTextures/glBindTexture
|
||
|
and you have a number for each texture? Does the routine generate
|
||
|
the MIPmaps for you?
|
||
|
|
||
|
> 2. I have some reasonable terrain textures for starters that Eric
|
||
|
> Mitchell from the MSFS world contributed.
|
||
|
|
||
|
Good start! (Could you post them to the Web site? I might be able
|
||
|
to suggest a suitable scale factor for them)
|
||
|
|
||
|
> So for anyone who's familiar with texturing, it would likely be a
|
||
|
> simple matter to call the texture load routine and do all the
|
||
|
> OpenGL-ese to setup the textures.
|
||
|
|
||
|
As a starter (just to get something going), you could simply divide the
|
||
|
latitude and longitude of each terrain vertex by some suitable constant
|
||
|
and use that as the texture coordinate. Alternatively, you could let
|
||
|
OpenGL do the work using glTexGenf.
|
||
|
|
||
|
Something like (off the top of my head):
|
||
|
|
||
|
glEnable ( GL_TEXTURE_2D ) ;
|
||
|
glBindTexture ( GL_TEXTURE_2D, texture_number ) ;
|
||
|
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_REPEAT ) ;
|
||
|
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_REPEAT ) ;
|
||
|
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER, GL_LINEAR ) ;
|
||
|
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ) ;
|
||
|
glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
|
||
|
glHint ( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
|
||
|
|
||
|
{
|
||
|
Draw bunches of terrain
|
||
|
For each vertex, add a glTexCoord2f with your scaled lat/long
|
||
|
values
|
||
|
}
|
||
|
|
||
|
glDisable ( GL_TEXTURE_2D ) ;
|
||
|
|
||
|
> So, I guess I've been trying to make what I have be a bit more solid
|
||
|
> before I charge forward again.
|
||
|
|
||
|
I guess that's a good thing.
|
||
|
|
||
|
Adding texturing is *SO* easy though that you might want to just
|
||
|
slip it in when you have an odd hour and feel like getting a 'WOW!'
|
||
|
response!
|
||
|
|
||
|
:-)
|
||
|
|
||
|
> > Have you checked the link ordering?
|
||
|
> >
|
||
|
> > I see a couple of posts a day from people who have either failed to
|
||
|
> > link with M$ OGL *as well as* SGI's OpenGL (SGI's OpenGL relies
|
||
|
> > on some functions from M$ OpenGL) - or who have linked them in the
|
||
|
> > wrong order or something.
|
||
|
>
|
||
|
> Interesting, I'm not linking in opengl32 or glu32 ... The compiler
|
||
|
> never complains about unresolved symbols, and at runtime, I get no
|
||
|
> complaint about missing dll's.
|
||
|
|
||
|
Hmmm - that's odd - I'm pretty sure you need them because SGI's
|
||
|
OpenGL falls back to M$ opengl if it thinks that M$'s OpenGL has
|
||
|
hardware accelleration. That suggests that it *must* link to it
|
||
|
somehow.
|
||
|
|
||
|
Steve Baker 817-619-8776 (Vox/Vox-Mail)
|
||
|
Raytheon Systems Inc. 817-619-4028 (Fax)
|
||
|
2200 Arlington Downs Road SBaker@link.com (eMail)
|
||
|
Arlington, Texas. TX 76005-6171 SJBaker1@airmail.net (Personal eMail)
|
||
|
http://www.hti.com http://web2.airmail.net/sjbaker1 (personal)
|
||
|
|
||
|
** Beware of Geeks bearing GIF's. **
|
||
|
|
||
|
|
||
|
-------------------------------------
|
||
|
Please visit the FGFS web page: http://www.menet.umn.edu/~curt/fgfs/
|
||
|
For help on using this list (especially unsubscribing), send a message to
|
||
|
"flight-gear-request@me.umn.edu" with a single line of text: "help".
|
||
|
|
||
|
From sbaker@link.com Mon Apr 27 23:45:25 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
|
||
|
["2532" "Mon" "27" "April" "1998" "23:43:38" "-0500" "Steve Baker" "sbaker@link.com" "<Pine.SGI.3.96.980427233205.16486C-100000@lechter.bgm.link.com>" "58" "Re: texture coordinates" "^From:" nil nil "4" nil nil nil nil nil]
|
||
|
nil)
|
||
|
X-VM-Message-Order:
|
||
|
(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||
|
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
||
|
31 32)
|
||
|
X-VM-Summary-Format: "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
|
||
|
X-VM-Labels: ("r")
|
||
|
X-VM-VHeader: ("Resent-" "From:" "Sender:" "To:" "Apparently-To:" "Cc:" "Subject:" "Date:") nil
|
||
|
X-VM-Bookmark: 32
|
||
|
Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id XAA19155
|
||
|
for <curt@me.umn.edu>; Mon, 27 Apr 1998 23:45:24 -0500 (CDT)
|
||
|
Received: from lechter.bgm.link.com (lechter.bgm.link.com [130.210.239.45])
|
||
|
by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
|
||
|
id XAA03828 for <curt@me.umn.edu>; Mon, 27 Apr 1998 23:44:53 -0500 (CDT)
|
||
|
X-Sender: steve@lechter.bgm.link.com
|
||
|
Reply-To: Steve Baker <sbaker@link.com>
|
||
|
In-Reply-To: <199804272123.QAA19688@kenai.me.umn.edu>
|
||
|
Message-ID: <Pine.SGI.3.96.980427233205.16486C-100000@lechter.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
To: "Curtis L. Olson" <curt@me.umn.edu>
|
||
|
Subject: Re: texture coordinates
|
||
|
Date: Mon, 27 Apr 1998 23:43:38 -0500 (CDT)
|
||
|
|
||
|
On Mon, 27 Apr 1998, Curtis L. Olson wrote:
|
||
|
|
||
|
> I just thought I'd fire off a quick texture coordinate question while
|
||
|
> things were fresh on my mind. I was doing the quick hack of texture
|
||
|
> coordinate = (lon, lat) * CONSTANT. I'm using a value of 128.0 for
|
||
|
> the constant, lat/lon are in degrees. This is giving me a lot of
|
||
|
> "swimming" of the textures, where each frame the texture gets aligned
|
||
|
> differently. I'm thinking that 128 * 180 = 23040 which isn't that big
|
||
|
> of a number.
|
||
|
>
|
||
|
> So then before "clicking the proverbial send button" I decided to
|
||
|
> fmod() the result with something smaller like 10.0 and now everything
|
||
|
> seems to work pretty well.
|
||
|
>
|
||
|
> Does this all sound reasonable?
|
||
|
|
||
|
Yes - regrettably, it does.
|
||
|
|
||
|
Most OpenGL implementations (or any 3D API for that matter) have
|
||
|
serious problems with texture precision when the numbers get
|
||
|
large.
|
||
|
|
||
|
As you must have realised, you really don't need all those large
|
||
|
integer parts - all that really matters is the delta.
|
||
|
|
||
|
I think the best thing to do is to use a different constant
|
||
|
for lat and long (v.important near the poles), and to compute
|
||
|
that "constant" for each terrain tile such as to get an integer
|
||
|
number of map repeats across the tile - keeping the actual size
|
||
|
of each texel reasonably close to what it was designed to be.
|
||
|
That ensures that adjacent tiles will match up most of the time
|
||
|
- and it will minimise the number of texture seams you get. The
|
||
|
coordinates within each tile should be as small as possible -
|
||
|
take the south-west corner of each tile as (0,0) in texture space.
|
||
|
|
||
|
I don't know of any really solid ways to avoid *any* texture
|
||
|
seams. It is after all a topological impossibility to tile
|
||
|
a sphere with equal sized squares without getting seams -
|
||
|
and the alternative is to distort the textures very badly
|
||
|
towards the poles - and that sucks even more than the
|
||
|
seams IMHO.
|
||
|
|
||
|
I had a plan once to tile the planet with a particular
|
||
|
grid spacing for each major continent - with the texture
|
||
|
seams appearing exactly at the Suez canal, Panama canal,
|
||
|
Straits of Gibralta...etc. I now believe that to be hard
|
||
|
to implement, and it still causes far too much distortion
|
||
|
in the larger continents.
|
||
|
|
||
|
Even if I could have made *that* work - there would still
|
||
|
be the problem of texturing the oceans.
|
||
|
|
||
|
In the end - I think seams are inevitable. (sniffle, sob)
|
||
|
|
||
|
Steve Baker (817)619-8776 (Vox/Vox-Mail)
|
||
|
Raytheon Systems Inc. (817)619-4028 (Fax)
|
||
|
Work: SBaker@link.com http://www.hti.com
|
||
|
Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
|
||
|
|
||
|
From sbaker@link.com Mon May 4 07:42:43 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil t nil nil nil nil]
|
||
|
["3088" "Mon" "4" "May" "1998" "07:40:58" "-0500" "Steve Baker" "sbaker@link.com" "<Pine.SGI.3.96.980504071851.3721B-100000@sutcliffe.bgm.link.com>" "75" "Re: texture coordinates" "^From:" nil nil "5" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: from lfkw10.bgm.link.com (bgm.link.com [130.210.2.10])
|
||
|
by meserv.me.umn.edu (8.8.8/8.8.8) with ESMTP id HAA28780
|
||
|
for <curt@me.umn.edu>; Mon, 4 May 1998 07:42:42 -0500 (CDT)
|
||
|
Received: from sutcliffe.bgm.link.com (sutcliffe.bgm.link.com [130.210.236.18])
|
||
|
by lfkw10.bgm.link.com (8.8.6/HTI-Hack-8.8.4) with SMTP
|
||
|
id HAA08974 for <curt@me.umn.edu>; Mon, 4 May 1998 07:42:10 -0500 (CDT)
|
||
|
X-Sender: steve@sutcliffe.bgm.link.com
|
||
|
Reply-To: Steve Baker <sbaker@link.com>
|
||
|
In-Reply-To: <199805011935.OAA12780@kenai.me.umn.edu>
|
||
|
Message-ID: <Pine.SGI.3.96.980504071851.3721B-100000@sutcliffe.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
To: "Curtis L. Olson" <curt@me.umn.edu>
|
||
|
Subject: Re: texture coordinates
|
||
|
Date: Mon, 4 May 1998 07:40:58 -0500 (CDT)
|
||
|
|
||
|
On Fri, 1 May 1998, Curtis L. Olson wrote:
|
||
|
|
||
|
> (At this point I'm working in cartesian coordinates with all the
|
||
|
> terrain points.)
|
||
|
>
|
||
|
> I know a central point for a tile (average of min/max for x, y, z).
|
||
|
> If I normalize (x, y, z) this gives me a nice normal. So, I have a
|
||
|
> nice point and a normal which is enough to define a plane that roughly
|
||
|
> approximates the tile data points.
|
||
|
>
|
||
|
> Now, I could take each individual terrain point and project it onto
|
||
|
> this plane. This conceptually could be my texture coordinate. But, I
|
||
|
> would first have to rotate and translate the whole pile of projected
|
||
|
> points so that they are at or near (0,0,0) at which point I could drop
|
||
|
> the z dimension and (x,y) would be my real texture coordinate.
|
||
|
>
|
||
|
> I'm pretty confident that I could do the math, but do you think it
|
||
|
> would be worth the hassle? It would all happen in the preprocessing
|
||
|
> stage so I guess speed wouldn't be an issue.
|
||
|
|
||
|
The problem is that you would end up with a seam in the texture at the
|
||
|
edge of every terrain tile. Since your tiles are not exact squares,
|
||
|
and (from what you seems to be saying), your texture *is* a square,
|
||
|
there are bound to be differences in texture coordinates at the
|
||
|
edges of adjacent tiles. Imagine taking a lot of square post-it notes
|
||
|
(the textures) and sticking them onto a globe. Towards the poles,
|
||
|
they would overlap more and more - and that is what would happen
|
||
|
to your textures.
|
||
|
|
||
|
Using the original lat/long as the texture coordinate eliminates
|
||
|
the ugly seams.
|
||
|
|
||
|
S = lon / k1 ;
|
||
|
T = lat / k2 ;
|
||
|
|
||
|
(k1 & k2 are constants).
|
||
|
|
||
|
This squishes the texture around so it wraps neatly onto the spherical
|
||
|
surface.
|
||
|
|
||
|
However, there are two problems with this:
|
||
|
|
||
|
* The texture coordinates get very big and that causes texture
|
||
|
swimming, jitter, etc.
|
||
|
|
||
|
* The texture will now get long and thin near the poles.
|
||
|
|
||
|
The way I get around these two problems is firstly to say:
|
||
|
|
||
|
S = ( lon - tile_origin_lon ) / k1
|
||
|
T = ( lat - tile_origin_lat ) / k2
|
||
|
|
||
|
Now the texture coordinates are small - but the texture
|
||
|
seams come back unless k1 and k2 are exact submultiples of
|
||
|
a terrain tile size (expressed in degrees latitude/longitude).
|
||
|
|
||
|
So, I set k1/k2 to the exact submultiple of a terrain tile
|
||
|
size that comes closest to the ideal scale that I want for
|
||
|
my textures (expressed in meters per map repeat). Since the
|
||
|
size of a degree of longitude changes over the surface of
|
||
|
the earth, k1 is no longer a constant. Whenever k2 changes,
|
||
|
you get a texture seam that runs east-west across the terrain.
|
||
|
This is unavoidable - but a lot better than having seams at
|
||
|
the edges of every terrain tile.
|
||
|
|
||
|
Hence, k1 will equal k2 at the equator and gradually go to
|
||
|
zero at the poles. It's easiest to take the longitudinal
|
||
|
size of the terrain tile half way up the tile (rather than
|
||
|
at the top or bottom edge) to avoid a divide by zero error
|
||
|
at either the north or south pole.
|
||
|
|
||
|
Steve Baker (817)619-8776 (Vox/Vox-Mail)
|
||
|
Raytheon Systems Inc. (817)619-4028 (Fax)
|
||
|
Work: SBaker@link.com http://www.hti.com
|
||
|
Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
|
||
|
|
||
|
From owner-fgfs-devel@flightgear.org Tue Sep 22 16:24:52 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||
|
["1870" "Tue" "22" "September" "1998" "16:23:23" "-0500" "Steve Baker" "sbaker@link.com" nil "43" "Re: [FGFS-Devel] vegetation / land use" "^From:" nil nil "9" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
|
||
|
by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id QAA05981
|
||
|
for <curt@me.umn.edu>; Tue, 22 Sep 1998 16:24:52 -0500 (CDT)
|
||
|
Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
|
||
|
for fgfs-devel-outgoing@flightgear.org
|
||
|
id 0zLZvM-0000ZG-00; Tue, 22 Sep 1998 16:24:40 -0500
|
||
|
Received: from bgm.link.com ([130.210.2.10] helo=lfkw10.bgm.link.com)
|
||
|
by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
|
||
|
for fgfs-devel@flightgear.org
|
||
|
id 0zLZvK-0000ZA-00; Tue, 22 Sep 1998 16:24:38 -0500
|
||
|
Received: from samantha.bgm.link.com (samantha.bgm.link.com [130.210.65.19])
|
||
|
by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
|
||
|
id QAA23764 for <fgfs-devel@flightgear.org>; Tue, 22 Sep 1998 16:24:08 -0500 (CDT)
|
||
|
X-Sender: steve@samantha.bgm.link.com
|
||
|
In-Reply-To: <3607FBD8.58FC@mars.ark.com>
|
||
|
Message-ID: <Pine.SGI.3.96.980922152528.24232C-100000@samantha.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
Precedence: bulk
|
||
|
Reply-To: fgfs-devel@flightgear.org
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
Sender: owner-fgfs-devel@flightgear.org
|
||
|
To: fgfs-devel@flightgear.org
|
||
|
Subject: Re: [FGFS-Devel] vegetation / land use
|
||
|
Date: Tue, 22 Sep 1998 16:23:23 -0500 (CDT)
|
||
|
|
||
|
On Tue, 22 Sep 1998, Eric Mitchell wrote:
|
||
|
|
||
|
> Sounds good. Can you tell me the (rough) dimensions of a single texture
|
||
|
> square when it's rendered in FG? I'll need to know that to make the farm
|
||
|
> fields look right.
|
||
|
|
||
|
I think we should be prepared to vary the size of the texels on the ground
|
||
|
to fit the style of the map. (The technical term for "the size of the
|
||
|
texels on the ground" is the "lambda" of the texture - measured in
|
||
|
meters-per-texel).
|
||
|
|
||
|
Also, it's going to be hard to pick a single lambda that looks good at
|
||
|
all altitudes. There isn't a good solution for that - with big SGI machines,
|
||
|
you can use a feature called "detail texture" - but there don't seem to
|
||
|
be any efforts to implement that on PC boxes yet.
|
||
|
|
||
|
Maybe we'll make use of the upcoming multitexture hardware (if 3Dfx
|
||
|
and nVidia solve their lawsuits...) to apply two or more textures
|
||
|
at differing lambdas.
|
||
|
|
||
|
I think the preson who paints the map should have some idea of what
|
||
|
altitudes it's going to look good at - and hence should be able to
|
||
|
specify the lambda to the terrain generator software on a per-map
|
||
|
basis.
|
||
|
|
||
|
Clearly, for field patterns, we need a fairly small lambda to make it
|
||
|
possible to see nice sharp field edges with the odd road or boundary
|
||
|
hedge/treeline running between them. This makes the texture fairly
|
||
|
repetitious, but for field patterns that may not be too bad.
|
||
|
|
||
|
For fuzzier 'natural' textures, you can use a larger lambda's resulting
|
||
|
in less obvious repetition.
|
||
|
|
||
|
Steve Baker (817)619-2657 (Vox/Vox-Mail)
|
||
|
Raytheon Systems Inc. (817)619-4028 (Fax)
|
||
|
Work: SBaker@link.com http://www.hti.com
|
||
|
Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
|
||
|
|
||
|
|
||
|
Please visit the FGFS web page: http://www.flightgear.org
|
||
|
For help on using this list (especially unsubscribing), send a message to
|
||
|
"fgfs-devel-request@flightgear.org" with a single line of text: "help".
|
||
|
|
||
|
From owner-fgfs-devel@flightgear.org Tue Sep 22 16:28:28 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||
|
["1472" "Tue" "22" "September" "1998" "16:26:37" "-0500" "Steve Baker" "sbaker@link.com" nil "34" "Re: [FGFS-Devel] vegetation / land use" "^From:" nil nil "9" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: from mailhub.woodsoup.org (IDENT:root@anduin.physics.iastate.edu [129.186.82.1])
|
||
|
by meserv.me.umn.edu (8.9.1a/8.9.1) with ESMTP id QAA06106
|
||
|
for <curt@me.umn.edu>; Tue, 22 Sep 1998 16:28:27 -0500 (CDT)
|
||
|
Received: from majordom by mailhub.woodsoup.org with local (Exim 1.92 #1)
|
||
|
for fgfs-devel-outgoing@flightgear.org
|
||
|
id 0zLZyX-0000aT-00; Tue, 22 Sep 1998 16:27:57 -0500
|
||
|
Received: from bgm.link.com ([130.210.2.10] helo=lfkw10.bgm.link.com)
|
||
|
by mailhub.woodsoup.org with esmtp (Exim 1.92 #1)
|
||
|
for fgfs-devel@flightgear.org
|
||
|
id 0zLZyW-0000a5-00; Tue, 22 Sep 1998 16:27:56 -0500
|
||
|
Received: from samantha.bgm.link.com (samantha.bgm.link.com [130.210.65.19])
|
||
|
by lfkw10.bgm.link.com (8.8.6/RSC-RTI-1.0) with SMTP
|
||
|
id QAA23910 for <fgfs-devel@flightgear.org>; Tue, 22 Sep 1998 16:27:21 -0500 (CDT)
|
||
|
X-Sender: steve@samantha.bgm.link.com
|
||
|
In-Reply-To: <13831.64964.272599.402309@kenai.me.umn.edu>
|
||
|
Message-ID: <Pine.SGI.3.96.980922162432.24319B-100000@samantha.bgm.link.com>
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: TEXT/PLAIN; charset=US-ASCII
|
||
|
Precedence: bulk
|
||
|
Reply-To: fgfs-devel@flightgear.org
|
||
|
From: Steve Baker <sbaker@link.com>
|
||
|
Sender: owner-fgfs-devel@flightgear.org
|
||
|
To: fgfs-devel@flightgear.org
|
||
|
Subject: Re: [FGFS-Devel] vegetation / land use
|
||
|
Date: Tue, 22 Sep 1998 16:26:37 -0500 (CDT)
|
||
|
|
||
|
On Tue, 22 Sep 1998, Curtis L. Olson wrote:
|
||
|
|
||
|
> Eric Mitchell writes:
|
||
|
> > Sounds good. Can you tell me the (rough) dimensions of a single texture
|
||
|
> > square when it's rendered in FG? I'll need to know that to make the farm
|
||
|
> > fields look right.
|
||
|
>
|
||
|
> This is a tough one I haven't really ironed out yet. We can easily
|
||
|
> change this in the code to suit our needs. 3dfx imposes a 256x256
|
||
|
> limitation on texture dimensions. What amount of ground could we
|
||
|
> reasonably cover with a texture of this resolution. Obviously this is
|
||
|
> trade off city here ... :-(
|
||
|
|
||
|
Probably ought to paint the maps at better than 256x256 resolution - 3Dfx
|
||
|
won't be the norm forever - and there is a definite trend to having much
|
||
|
bigger maps - and more of them.
|
||
|
|
||
|
All portable OpenGL code should use the "PROXY" texture trick to figure
|
||
|
out if the texture is going to fit and automagically reduce the size
|
||
|
(by dropping out the higher level MIPmaps) on less capable hardware.
|
||
|
|
||
|
This will make the textures look fuzzier on 3Dfx hardware than on others,
|
||
|
especially at low altitudes.
|
||
|
|
||
|
|
||
|
Steve Baker (817)619-2657 (Vox/Vox-Mail)
|
||
|
Raytheon Systems Inc. (817)619-4028 (Fax)
|
||
|
Work: SBaker@link.com http://www.hti.com
|
||
|
Home: SJBaker1@airmail.net http://web2.airmail.net/sjbaker1
|
||
|
|
||
|
|
||
|
Please visit the FGFS web page: http://www.flightgear.org
|
||
|
For help on using this list (especially unsubscribing), send a message to
|
||
|
"fgfs-devel-request@flightgear.org" with a single line of text: "help".
|
||
|
|
||
|
From mschaefe@MIT.EDU Wed Sep 23 12:33:42 1998
|
||
|
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||
|
["1083" "Wed" "23" "September" "1998" "13:30:37" "-0400" "mschaefe@MIT.EDU" "mschaefe@MIT.EDU" nil "34" "Re: [FGFS-Devel] vegitation / land use" "^From:" nil nil "9" nil nil nil nil nil]
|
||
|
nil)
|
||
|
Received: from MIT.EDU (PACIFIC-CARRIER-ANNEX.MIT.EDU [18.69.0.28])
|
||
|
by meserv.me.umn.edu (8.9.1a/8.9.1) with SMTP id MAA22241
|
||
|
for <curt@me.umn.edu>; Wed, 23 Sep 1998 12:33:42 -0500 (CDT)
|
||
|
Received: from MIT.MIT.EDU by MIT.EDU with SMTP
|
||
|
id AA17918; Wed, 23 Sep 98 13:33:41 EDT
|
||
|
Received: from LFM-IDAHO.MIT.EDU by MIT.MIT.EDU (5.61/4.7) id AA06057; Wed, 23 Sep 98 13:33:41 EDT
|
||
|
Message-Id: <3.0.32.19980923133036.008fc440@po10.mit.edu>
|
||
|
X-Sender: mschaefe@po10.mit.edu
|
||
|
X-Mailer: Windows Eudora Pro Version 3.0 (32)
|
||
|
Mime-Version: 1.0
|
||
|
Content-Type: text/plain; charset="us-ascii"
|
||
|
From: mschaefe@MIT.EDU
|
||
|
To: "Curtis L. Olson" <curt@me.umn.edu>
|
||
|
Subject: Re: [FGFS-Devel] vegitation / land use
|
||
|
Date: Wed, 23 Sep 1998 13:30:37 -0400
|
||
|
|
||
|
Curt,
|
||
|
|
||
|
I believe all of that data is contained on the 1:2mil CD, which I know to
|
||
|
be in lat/long format. It's FTP'able, or you can buy the CD for $20, with
|
||
|
data from all the states (I'm not sure if AK and HI are included on 2mil).
|
||
|
|
||
|
It doesn't, as far as I know, have building/smokestack/... data on the
|
||
|
2mil CD. It think that's much too detailed.
|
||
|
|
||
|
Mark
|
||
|
P.S. Check out
|
||
|
ftp://mapping.usgs.gov/pub/ti/DLG/2mdlgguide/1994_Revision/2mdug95.txt
|
||
|
for more info on what is contained on the CD. The site has more
|
||
|
information on how to decode the data as well.
|
||
|
|
||
|
>Mark,
|
||
|
>
|
||
|
>Is there lake, road, river, city outline data available on line that
|
||
|
>uses lat/lon coordinates? The data sets I've seen have all been
|
||
|
>with the funky projected coordinate system relative to some reference
|
||
|
>point.
|
||
|
>
|
||
|
>What other things can you get out of this? Is there smoke stack,
|
||
|
>powerline, tall building data available in these too?
|
||
|
>
|
||
|
>Thanks,
|
||
|
>
|
||
|
>Curt.
|
||
|
>--
|
||
|
>Curtis Olson University of MN, ME Dept.
|
||
|
>curt@me.umn.edu
|
||
|
>http://www.menet.umn.edu/~curt Try Linux!
|
||
|
>
|
||
|
|