Real Time Grass

Started by
7 comments, last by idreamlovey 15 years, 10 months ago
I have a terrain of size 2.4 square miles...and i want to put vegetation on it like wavering grasses...but how should i manage data is actually the problem... Grasses have to be put over the surface of variable height......I cant store the data statically because terrain is big and it will take more memory.... Now in alternate choice, height of the terrain is stored in bmp map so that i can draw grasses over the surface dynamically in real time calculation...i want to put 100 square meter area filled with grasses that repetitively tiles over 2.4 mile square area but how do i do that is the real question when the player walks ahead the grass should not looks like moving along with the player...i mean that grass changing its height but from their appearance (size, rotation angle) remains same...... one choice is to put equal scaled single type grass with no rotation over all space and only change the height...But this is not what i want actually...i want to put grasses of variable size and rotation over the terrain... Any idea on it
Advertisement
Geometry instancing
Strength without justice is no vice; justice without strength is no virtue.
directx

This technique requires a device that supports the 3_0 vertex shader model...

i have NVIDIA 5200 FX card :(
instancing is not really gonna help, the bottleneck with grass is the huge amount of fill required

eg
http://au.xbox360.ign.com/dor/objects/702493/the-elder-scrolls-iv-oblivion/images/the-elder-scrolls-iv-oblivion-20060308025159759.html?page=mediaFull

each grass pixel here has prolly been overdraw 5+times (unless plain old alphatest + sort)

to the OP, what u can do is have say a 8x8 areas around the camera (fade the grass out in the distance), each area contains ~250 quads of billboarded grass
each time the camera moves into a new quarant, create the grass for that based on the terrains height or a coveragemap etc
You may want to check out this website (I've read Rendering Grass Terrains in Real-Time with Dynamic Lighting, which may be useful in your case).
In addition to ZedZ's suggestion (which works fine), you could have a couple of pre-defined sets of foliage, in case you don't want to generate random vegetation when a new quarant gets visible.

For example, make an array with quarant foliage data. This is a square filled with quads(or other shapes) with grass/other vegetation textures, eventually nicely sorted on texture. You could order the sets in the array on the vegetation thichkness, and/or category. For example:
struct TFoliageSprite{   vector3 size;   vector3 position   texture tex}struct Quarant_Vegetation_DataSet{   TFoliageSprite quads[0..?];   int quadCount;}const CATEGORY_COUNT = 7;const CATEGORY_FreshGreen = 0; // Relative short, green grass/flowersconst CATEGORY_WildGreen  = 1; // Untamed wild high/grassconst CATEGORY_Rotten     = 2; // const CATEGORY_Jungle     = 3; // Jungle vegetationconst CATEGORY_Forest     = 4; // Forest vegetation, mushroom, leaves, etc.const CATEGORY_Desert     = 5; // ...const CATEGORY_Africa     = 6; // Savanneconst THICKNESS_LOW       = 0; // Almost nothing growing there <10 quadsconst THICKNESS_MEDIUM    = 1; // Normal growth ~50 quadaconst THICKNESS_HIGH      = 2; // Alot of vegetation ~100 quadsconst THICKNESS_EXTREME   = 3; // Very dense ~150 quadsconst RANDOM_COUNT = 5; // 5 random generated sets per category/thicknessQuarant_Vegetation_DataSet[0..CATEGORY_COUNT][0..THICKNESS_COUNT][0..RANDOM_COUNT] PRE_DEFINED_DATASETS;


In this example, you generate 7x4x5 = 140 sets of vegetation data. For example, if I generate a set for category "CATEGORY_WildGreen", "THICKNESS_MEDIUM", I generate a certain number of quads with textures from long grass, wild flowers, bushes, etc. I generate 5 sets per category in this case, to prevent you won't see the same stuff all over the place.

Your quarants on your terrain will have a pre-defined category, thickness and random number. You can assign these numbers via your level/terrain editor, or do it totally random. When you move around now, you don't have to generate new data all the time, and the vegetation won't change if you return to a part of the world you visited before.


As for the rendering part, first you calculate which quarants are visible (a circle around the camera). When rendering quarant x, use its category numbers to render the right vegetation data set. This set already has the right data, eventually sorted on texture, etc. You could even choose to make a vertex buffer object from its contents. However, you need to transform the quads:
quad.renderXZ += quad.originalXZ + quarant.offsetXZ; quad.renderY  += quad.originalY  + heightMap[ quad.renderXZ ];

You can also do this in the (vertex) shader, eventually with the help of a heightmap (although you can't read textures in the vertex shader on your hardware).

Apply a fade in/out for the quads in the outer circles. You don't want vegetation sprites become suddenly (in)visible. Calcualte the distance between the quad and the camera, and adjust the overall alpha with that.

Greetings,
Rick
An easy and efficient way to place grass on terrain is to use large chunks of grass polygons and then set the height in the vertex shader by using a vertex texture that matches your terrain heightmap.

This way you dont have to worry about any data managing...just move your grass chunks when they become too far away form the camera. Just do frustum culling.
I really like the effect produced by this paper: http://www.cg.tuwien.ac.at/research/publications/2007/Habel_2007_IAG/. It's all shader driven so it shouldn't affect your existing framerates too much. My only concern with doing something like that is making sure the grass around every object (specifically animated characters) looks appropriate (e.g. make sure it overlaps the feet of people so they don't appear to be floating over the grass).
Nick Gravelyn...u r a man...Thnx all BUDDY

I am thinking of to use double queue with two dimensional array...as the player moves ahead the new grass will be added and old grass will be deleted...dont know whether it will really works or not yet...let me try it....

thank u guys for ur concern...i be right back with results....meanwhile if any other suggestion or comments on using dqueue ...u most welcome....:)

This topic is closed to new replies.

Advertisement