Page 1 of 1

Rendering grass and highly detailed terrain textures

PostPosted: Mon Dec 08, 2008 11:56 am
by Aaron
Hi Everyone,

In response to the frequently asked question of "how do I render blades of grass on terrain?", I've written a guide on rendering grass and highly detailed terrain textures. If you have any questions or would like to discuss such matters, please reply here.


Pre-emptive snarky off-topic warning: This thread is a 'sticky' and I would therefore request that the discussion remains on the given topic.

Another source of information

PostPosted: Wed May 20, 2009 3:59 am
by Bradicus
I found this chapter out of the online version of Nvidia's GPU Gems very enlightening. it's on the topic of billboard grass rendering.

Re: Rendering grass and highly detailed terrain textures

PostPosted: Wed Jul 13, 2016 9:46 pm
by joehot200
For those using jMonkeyEngine, I have got a detail mapping vert/shader that you can download from here:

Detail map is the one used by L3DT.

For those who do not use jMonkeyEngine, the shader will probably still be of help to anybody using LWJGL or OpenGL, as it demonstrates the use of four samples of the detail map and applying it to the defuse colour, like so:
Code: Select all
 float tile = 80.0; //Amount texture is to be tiled
      vec2 detTex = newTexCoord * vec2(tile);
      vec4 diffuseColor = texture2D(m_DiffuseMap, newTexCoord); //Get the colour from the texture.
      float detailMult = (diffuseColor.r + diffuseColor.g + diffuseColor.b) * 2.0; //This is here so that in black patches of terrain it will not be detail mapped, making it white.
      if (detailMult > 1.0){
        detailMult = 1.0; //Make sure that the detail mapping is not above 1.0.
      float detailIntensity = 1.4; //Intensity of detail. Doesn't quite work as one might expect though.
      vec4 detail = texture2D(m_DetailMap, detTex / vec2(0.5)); //Sample 1, for close-up detail
      detail *= vec4(detailIntensity); //As most of the detail map is white, this will make a lot of it whiter than white.
      vec4 detail2 = texture2D(m_DetailMap, detTex / vec2(1)); //Sample 2, for mid-range detail
      detail2 *= vec4(detailIntensity);
      vec4 detail3 = texture2D(m_DetailMap, detTex / vec2(2)); //Sample 3, for further detail
      detail3 *= vec4(detailIntensity);
      vec4 detail4 = texture2D(m_DetailMap, detTex / vec2(4)); //Sample 4, for far detail.
      detail4 *= vec4(detailIntensity);
      detail += detail2;
      detail += detail3;
      detail += detail4;
      detail /= vec4(4); //Add all the intensities together and then divide by 4, giving the average.
      vec4 detailColor = vec4(1.0) - detail; //Only recommended to use if you use the L3DT default detail map. Because "detail" can be greater than 1, 1 - detail can result in negative values, causing black spots - Which is desired.
      detailColor *= detailMult; //Multiply the detail map by the amount you want to show. Basically, if it is black, you do not want the detail map making it looked speckled and white.
      diffuseColor += detailColor; //Add detail colour to diffuse.

I am using it on a car game I am developing. The results change something like this:
To this:

Here's two other pictures:

Hope this helps someone. Feel free to email me (joehot200 at if anyone has any queries. Though I may take a while to get back to you.