How to control the distribution of grass?

Started by
1 comment, last by Norman Barrows 9 years, 11 months ago

Hi guys,

I'm still busy implementing grass rendering by mostly adhering to this GPU Gems article: http://http.developer.nvidia.com/GPUGems/gpugems_ch07.html. That is, I'm using interleaved textures quads with transparent parts to simulate the grass. I have the grass pretty much done and also added a simple animation to it using the vertex shader. I have to add this grass to exisiting levels of a game now and am thinking about ways to control the distribution of the grass to prevent it from intersecting with objects in the level etc. I have implemented a simple solution already, but it's quite wasteful and I am looking for a better approach. At the moment I am generating random positions for grass objects within a specificly sized square to achieve a fairly even distribution. In addition, I created a square black and white texture with black areas representing areas, in which grass should be placed. In the shader, I map the position of the grass object to a texture coordinate into this texture and either discard the corresponding pixel or draw it depending on the texture value at that point. The problem is that I am sending data of all grass objects to the GPU just to have many of them being discarded in the end. The grass will be static, so it would be enough to somehow generate the positions of grass objects up front but I don't know how I could do that. Should I somehow sample the texture on the CPU and make sure all grass objects are placed on the desired parts? And is it actually possible to sample a texture on the CPU? What other choices do I have? Any ideas?

I actually tried sampling the texture on the CPU but the values I'm getting with this approach are not correct.


// pDensityTexture is of type ID3D11ShaderResourceView*
BYTE* pTexValue = reinterpret_cast<BYTE*>(m_pDensityTexture);

XMFLOAT4 pixel;
pixel.x  = pTexValue [0];
pixel.y  = pTexValue [1];
pixel.z  = pTexValue [2];
pixel.w = pTexValue [3];

Can you please point me into a direction to get this working. Thank you very much!

Advertisement

There's a recent post about "randomish" grass distribution here: http://mollyrocket.com/casey/stream_0015.html.

As for the larger scale question of where in the world to put grass:


Should I somehow sample the texture on the CPU and make sure all grass objects are placed on the desired parts? And is it actually possible to sample a texture on the CPU? What other choices do I have?

Why does it need to be a texture? If you've decided that you want to control where the grass objects are placed on the CPU, then your black and white "grass map" never needs to exist on the GPU, right? So it doesn't need to be a texture. Just have it be a grid of boolean values, say.

in caveman:

http://www.gamedev.net/blog/1730/entry-2258672-caveman-v30-general-desciption/

tall grass and prairie grass:

grass model ID, texture ID, scale, rotation, and location offset (jitter) are determined by functions which use a generic random map generated at game start.

ground foliage in woods and jungle is done similar to tall grass.

grass clumps in scrub terrain, trees, berry bushes, fruit trees, small rocks in scrub terrain, etc:

a tiled plant map (200x200 ft or 800x800 ft sparse matrix) containing model ID, texture ID, scale, rotation, and location is used to determine plant location. the plant map is generated at game start.

these are used to generate "terrain chunks" on the fly as needed, with LRU cacheing. a terrain chunk is a pre-generated ordered render queue of all the meshes in a 300x300 ft area, including interleaved ground meshes with different tiled ground textures, rocks, trees, plants, bushes, grass, rock shelters, caves, caverns, cliffs, canyons, huts, etc.

to draw the terrain, each visible terrain chunk is drawn in turn. individual meshes in a chunk are culled before being passed to directx for rendering.

Norm Barrows

Rockland Software Productions

"Building PC games since 1989"

rocklandsoftware.net

PLAY CAVEMAN NOW!

http://rocklandsoftware.net/beta.php

This topic is closed to new replies.

Advertisement