Sign in to follow this  
JackTheRapper

Heightmap Texturing Methods

Recommended Posts

Hi, I'm building a heightmap that loads a given height (texture) file and generates the vertex array and index array for the vertices generated from the heightmap. Furthermore, each vertex is coloured based on height and angle (e.g. blue for water, green for grass, etc.) and then lit according to the global light position/direction and light colour & ambience. So far so good. Now, I've done a lot of background reading on the matter of various techniques to texture terrain (multitexturing or otherwise) but there's one thing that's stumping me that doesn't seem to to be explained in these sources: how to store/draw the data. My problem is thus: currently, the terrain is being drawn from an indexed array spanning the entire heightmap. What I plan to do is implement a quad/octree for frustum culling and aiding in (future implemented) UI such as slecting terrain, elevating it etc. How do I store my data for use with multitexturing? If each tile can have up to x textures (thus I need to use n texture stages for texture + blending), I would have to setup texture stages per triangle rendered, like so: DrawTerrain() { ActivateTex0(); /// stuff ActivateStage1(); // stuff .... ActivateStageN() // Stuff Begin(Triangles); TexCoord(u,v); Colour(r,g,b); Vertex(x,y,z); TexCoord(u,v); Colour(r,g,b); Vertex(x,y,z); and so on... End(); // Shutdown texture stages etc. } I guess what I'm trying to say is, what options so I have available? Currently my untextured terrain rendering is something like follows: DrawTerrain() { SetupVertexArray(); SetupColourArray(); DrawIndexedArray(Triangles, numTriangles, indices); // Shutdown arrays etc. } The DrawIndexedArray() literally draws the entire contents of the vertex/colour arrays. Clearly this will be broken down into more managable tiles for use in the quad/tree, and maybe put in a VBO or something. Am I right in saying that this approach isn't an option for blending multiple textures per triangle? Hope that makes sense :D

Share this post


Link to post
Share on other sites
I'm having a little trouble deciphering your question since you went off in so many directions, but I guess you are just trying to multi-texture.

If you are using DirectX, read on. If not, just ignore me.

The Direct3D texture cascade is really just a chain of calculations that each use two small pipelines for color and alpha. You specify up to 3 arguments for each pipeline, labeled as Argument0, 1 and 2. Most operations done in a "stage" or a single calculation in the cascade use 1 and 2.

Only one stage in the cascade (stage 0) is active by default, and it makes use of the texture, UVs it's given if you don't touch anything.

As for storing and drawing? It's easy. Just make sure you set the device's textures to the appropriate order in their stages and draw your primitives.
Justmake sure for storage, you have the correct number of textures loaded and accessible. That's based on your app.

pDev->SetTexture(0, &TerrTex);
pDev->SetTexture(1, &DetailTex);

You won't be able to accomplish this since I'm guessing you are not storing texure coordinates in your FVF, just color components. You would want to make sure the UVs for your terrain over stage 0 are beyond texture space if you are going to be applying detail maps, so make sure you declare the FVF you use with D3DFVF_TEX2 or higher.

Honestly, I cannot go any further without diving into the different operations and how you must check device capabilities, so I would recommend you research this topic yourself. All I've really done here is blab off some facts in semi-random order. I don't think anyone else here could really help you with the code you provided, since it's really, really vague. I don't meant to offend, but please rephrase your question and maybe you'll get a better answer.

Share this post


Link to post
Share on other sites
Ok, after some more research on the net I have crytalised my thoughts a bit more. Here's currently what I've got going on:

* vertex and index data for heightmap generated from image file
* vertex normals for each vertex and face normals for each tri (not really used)
* colour data for each vertex generate from vertex height (and slope factor)
* luminance data generated from light pos/colour and vertex normal
* final lit vertex colour data generated from luminance and vertex colour

Currently I am doing something like this (in openGL):

> Enable vertex array
> Enable colour array
> Draw triangle list from supplied index data
> Disable vertex array
> Disable colour array

This give me a lit and coloured terrain as follows (ignore the height shading, basic prototype at the moment):

Photobucket

What I want to do is instead of colouring the terrain per vertex, I want to texture the terrain based on height and angle (like the colour is currently calculated).
Hi zyrolasting, thanks for the reply!


I've read that I could use 3d textures (which seems the most simple solution), or I could multi texture the terrain a la splatting.

So, currently my vertex RGB data contains the lit vertex colour. For splatting, I believe I need some textures and an associated blend map per texture. This is the new source of my confusion...

With the blend maps, I could use the 4 colour components (colour + alpha) in one texture to blend between 4 textures. Does this texture map have to be generated for each triangle, or would it make more sense to group triangles into tiles of, say, 32x32 in size and then create a blend map for that batch of tiles? or would I do one for the whole terrain (e.g. 512x512 terrain = 512x512 blend map)? This way, each texel in the map corresponds to each vertex in the height map, and the r,g,b,a components contain the blend info for 4 textures)?

Alternatively, I guess I could use the vertex r,g,b,a components as my blend values and then light the terrain via a terrain-sized lightmap.

I'm just tossing ideas around as this topic is new to me so I'm trying to digest my thoughts and see what other people are doing with regards to texturing terrain :D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this