Basic Terrain Generator

Everything related to 3D programming
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Basic Terrain Generator

Post by Samuel »

Hello everyone,

This is a simple terrain generator that uses a greyscale image to create your terrain.

Here's an image that shows a greyscale image and the 3D result.

Image

Now the reason I call this a basic generator is because it lacks a few key features.
The main missing features are LOD and color heightmaps.

Purebasic does not have mesh LOD generation.
So, the workarounds are to create a mesh file and build them yourself or use a program that will do it for you.

As for the color heightmaps (which allow smoother height transitions) I might implement them at a later date.

EDIT #2:
I made a few changes within the generator. I added UV texture repeating (no more material scaling required) and cleaned the code up a little bit.
I also added an alpha blending example to go along with the hlsl and original example. Here's a picture showing what alpha blending can do to the terrain.
Image

:D This generator is starting to look nice if I do say so myself.

It does require a material script in order to do alpha blending, but that's not a very big deal because it's needed anyways if you use shaders on your terrain.

I plan on adding terrain LOD in the next update. That will allow much larger terrains to be generated.

Here's the download link with all three examples.
Terrain Generator.zip

Here's the updated the source code for the plain terrain generator here. If you want the images you'll have to get them from the download.

Code: Select all

Enumeration
  #Window
  #Font
  #HelpSprite
  #Texture
  #Material
  #Light
  #Camera
  #Terrain
  #HeightMap
EndEnumeration

Declare TG_UpdateSprite()
Declare TG_GenerateTerrain(TilesX, TilesZ, TerrainHeight, TerrainSizeX, TerrainSizeZ, TextureRepeatU, TextureRepeatV, HeightMapHandle)

If InitEngine3D(#PB_Engine3D_DebugLog) = 0
  MessageRequester("ERROR", "Failed to initialize the 3D engine.", #PB_MessageRequester_Ok)
  End
EndIf

If InitSprite() = 0
  MessageRequester("ERROR", "Failed to initialize the sprite environment.", #PB_MessageRequester_Ok)
  End
EndIf

If InitKeyboard() = 0
  MessageRequester("ERROR", "Failed to initialize the keyboard environment.", #PB_MessageRequester_Ok)
  End
EndIf
  
If InitMouse() = 0
  MessageRequester("ERROR", "Failed to initialize the mouse environment.", #PB_MessageRequester_Ok)
  End
EndIf

UsePNGImageDecoder()
UseJPEGImageDecoder()

WindowW = 1280
WindowH = 720

Define.f MouseX, MouseY, KeyX, KeyY

Global.i RenderMode, Help

LoadFont(#Font, "Courier New", 11, #PB_Font_Bold)

If OpenWindow(#Window, 0, 0, WindowW, WindowH, "Terrain Generator", #PB_Window_ScreenCentered)
  ;AntialiasingMode(#PB_AntialiasingMode_x6)
  If OpenWindowedScreen(WindowID(#Window), 0, 0, WindowW, WindowH, 0, 0, 0)
    
    Add3DArchive("Programs\", #PB_3DArchive_FileSystem)
    Add3DArchive("Scripts\", #PB_3DArchive_FileSystem)
    Add3DArchive("Textures\", #PB_3DArchive_FileSystem)
    Parse3DScripts()
    
    CreateSprite(#HelpSprite, 300, 145)
    
    ;# Texture that will cover the terrain.
    LoadTexture(#Texture, "grass.jpg")
    CreateMaterial(#Material, TextureID(#Texture))
    
    ;# Greyscale image that will be used for generating the terrain.
    LoadImage(#HeightMap, "Textures\HeightMap00.png")
    

    ;## A FEW NOTES ##
    ;# Stay below 510 tiles total or you will exceed the vertex limit.
    ;# TerrainHeight can have a positive or negative value.
    
    MeshHandle = TG_GenerateTerrain(255, 255, 5, 50, 50, 100, 100, #HeightMap)
    TestHandle = IsMesh(MeshHandle)
    If TestHandle <> 0
      CreateEntity(#Terrain, MeshID(MeshHandle), MaterialID(#Material))
    EndIf
    
    CreateLight  (#Light, RGB(0,0,0), 0, 500, 1000)
    SetLightColor(#Light, #PB_Light_DiffuseColor, RGB(255,255,255))

    AmbientColor(RGB(50,50,50))
    
    CreateCamera   (#Camera, 0, 0, 100, 100)
    MoveCamera     (#Camera, -20, 20, 20, #PB_Absolute)
    CameraLookAt   (#Camera, 0, 00, 0)
    CameraBackColor(#Camera, RGB(80,80,80))
    
    
    ;# WARNING!! If you use stencil shadow types (#PB_Shadow_Modulative or #PB_Shadow_Additive)
    ;and you have over 360 tiles in your terrain the program may crash as you've exceeded the 16 bit index.
    
    ;In this case I personally wouldn't use stencil shadows. As they're not meant to be
    ;used in complex scenes.
    ;If you really want to use stencil shadows. I highly suggest you keep the terrain simple.
    
    ;WorldShadows(#PB_Shadow_Modulative, 100, RGB(150, 150, 150))

    Repeat
      
      Event = WindowEvent()   
      
      If ExamineMouse()
        
        MouseX = -MouseDeltaX() / 10
        MouseY = -MouseDeltaY() / 10
        
      EndIf
      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_A)
          KeyX = -0.2
        ElseIf KeyboardPushed(#PB_Key_D)
          KeyX = 0.2
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_W)
          KeyY = -0.2
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyY = 0.2
        Else
          KeyY = 0
        EndIf
        
        If KeyboardReleased(#PB_Key_R)
          If RenderMode = 0
            CameraRenderMode(#Camera, #PB_Camera_Wireframe)
            RenderMode = 1
          Else
            CameraRenderMode(#Camera, #PB_Camera_Textured)
            RenderMode = 0
          EndIf
        EndIf
        
        If KeyboardReleased(#PB_Key_H)
          If Help = 0
            Help = 1
          Else
            Help = 0
          EndIf
        EndIf
        
      EndIf
      
      RotateCamera(#Camera, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (#Camera, KeyX, 0, KeyY)
      
      RenderWorld()
      If Help = 0
        TG_UpdateSprite()
        DisplaySprite(#HelpSprite, 0, 0)
      EndIf
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape)
    
  EndIf
EndIf  

End

Procedure TG_UpdateSprite()
  
  Define.i FPS, Triangles, Batches
  
  FPS       = Engine3DStatus(#PB_Engine3D_CurrentFPS)
  Triangles = Engine3DStatus(#PB_Engine3D_NbRenderedTriangles)
  Batches   = Engine3DStatus(#PB_Engine3D_NbRenderedBatches)
  
  StartDrawing(SpriteOutput(#HelpSprite))
    DrawingMode(#PB_2DDrawing_Default)
    Box(0, 0, SpriteWidth(#HelpSprite), SpriteHeight(#HelpSprite), RGB(20,20,20))
    DrawingFont(FontID(#Font))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(5, 5, "FPS       : " + Str(FPS), RGB(255,0,0))
    DrawText(5, 25, "Triangles : " + Str(Triangles), RGB(0,255,0))
    DrawText(5, 45, "Batches   : " + Str(Batches), RGB(0,128,255))
    DrawText(5, 65, "Press W,A,S,D to Move Camera.", RGB(255,255,255))
    DrawText(5, 85, "Move Mouse to Rotate Camera.", RGB(255,255,255))
    If RenderMode = 0
      DrawText(5, 105, "Press R : Wireframe Off", RGB(255,128,0))
    Else
      DrawText(5, 105, "Press R : Wireframe On", RGB(255,128,0))
    EndIf
    If Help = 0
      DrawText(5, 125, "Press H : Help On", RGB(255,255,0))
    Else
      DrawText(5, 125, "Press H : Help Off", RGB(255,255,0))
    EndIf
  StopDrawing()
  
EndProcedure

Procedure TG_GenerateTerrain(TilesX, TilesZ, TerrainHeight, TerrainSizeX, TerrainSizeZ, TextureRepeatU, TextureRepeatV, HeightMapHandle)
  
  ;# First check and see if all parameters have valid values.
  ;# TerrainHeight can have any value positive or negative. So, we will not be testing for it.
  
  If TilesX <= 0
    MessageRequester("ERROR", "TilesX must be greater than 0.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  If TilesZ <= 0
    MessageRequester("ERROR", "TilesZ must be greater than 0.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  If TerrainSizeX <= 0
    MessageRequester("ERROR", "TerrainSizeX must be greater than 0.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  If TerrainSizeZ <= 0
    MessageRequester("ERROR", "TerrainSizeZ must be greater than 0.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  If TextureRepeatU <= 0
    MessageRequester("ERROR", "TextureRepeatU must be greater than 0.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  If TextureRepeatV <= 0
    MessageRequester("ERROR", "TextureRepeatV must be greater than 0.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  If IsImage(HeightMapHandle) = 0
    MessageRequester("ERROR", "Failed to find HeightMap.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  ;# Test to make sure terrain will not exceed the 16 bit index limitations (65,536 vertices).
  ;# There are ways around this limitation, but that's for another day.
  Define.i TotalVertices
  
  TotalVertices = (TilesX + 1) * (TilesZ + 1)

  If TotalVertices > 65536
    MessageRequester("ERROR", "Terrain has too many tiles. Vertex limit has been exceeded.", #PB_MessageRequester_Ok)
    ProcedureReturn #False
  EndIf
  
  ;# Generating Vertex Data
  Dim Vertices.d(TotalVertices, 2)
  
  Define.d TileSizeX, TileSizeZ
  
  TileSizeX = TerrainSizeX / TilesX
  TileSizeZ = TerrainSizeZ / TilesZ
  
  Define.d TileLocX, TileLocY, TileLocZ
  
  TileLocX = (TerrainSizeX * 0.5) * -1
  TileLocZ = (TerrainSizeZ * 0.5) * -1
  
  StartDrawing(ImageOutput(HeightMapHandle))
  
    Define.i ImgWidth, ImgHeight
  
    ImgWidth  = ImageWidth (HeightMapHandle) - 1
    ImgHeight = ImageHeight(HeightMapHandle) - 1
    
    Define.d ImgXRatio, ImgZRatio
    
    ImgXRatio = ImgWidth  / TerrainSizeX
    ImgZRatio = ImgHeight / TerrainSizeZ
    
    Define.d HeightRatio
    
    HeightRatio = TerrainHeight / 255
    
    Define.i PixelX, PixelY
    Define.i VCTR, CTRX, CTRZ
    Define.i Color, ColorValue
    
    For CTRZ = 0 To TilesZ
    
      For CTRX = 0 To TilesX
              
        PixelX = ((TerrainSizeX * 0.5) + TileLocX) * ImgXRatio
        PixelY = ((TerrainSizeZ * 0.5) + TileLocZ) * ImgZRatio
        
        Color = Point(PixelX, PixelY)
        
        ColorValue = Red(Color)
        
        TileLocY = ColorValue * HeightRatio
        
        Vertices(VCTR, 0) = TileLocX
        Vertices(VCTR, 1) = TileLocY
        Vertices(VCTR, 2) = TileLocZ
        TileLocX = TileLocX + TileSizeX
        
        VCTR + 1
        
      Next
    
      TileLocX = (TerrainSizeX * 0.5) * -1
      TileLocZ = TileLocZ + TileSizeZ
    
    Next
  StopDrawing()
  
  ;# Generating Face Data
  Define.i TotalFaces
  
  TotalFaces = (TilesX * TilesZ) * 2
  
  Dim Faces(TotalFaces, 2)
  
  Define.i FCTR, FaceCTR
  
  For CTRZ = 0 To TilesZ - 1
    For CTRX = 0 To TilesX - 1
    
      Faces(FCTR, 0) = FaceCTR
      Faces(FCTR, 1) = FaceCTR + 1 + TilesX
      Faces(FCTR, 2) = FaceCTR + 1
      
      Faces(FCTR + 1, 0) = FaceCTR + 1
      Faces(FCTR + 1, 1) = FaceCTR + 1 + TilesX
      Faces(FCTR + 1, 2) = FaceCTR + 2 + TilesX
      
      FCTR + 2
      FaceCTR + 1
    
    Next
    FaceCTR + 1
  Next
  
  ;# Now we can create our terrain
  Define.i UCounter
  Define.d U, V, Uoffset, Voffset

  Uoffset = TextureRepeatU * (1 / TilesX)
  Voffset = TextureRepeatV * (1 / TilesZ)
  
  Handle = CreateMesh(#PB_Any, #PB_Mesh_TriangleList, #PB_Mesh_Static)

    For CTR = 0 To TotalVertices -1
      
      MeshVertexPosition(Vertices(CTR, 0), Vertices(CTR, 1), Vertices(CTR, 2))
      MeshVertexNormal(0, 0, 0)
      MeshVertexTextureCoordinate(U, V)
      
      U = U + Uoffset
      UCounter + 1
      
      If UCounter > TilesX
        UCounter = 0
        U = 0
        V = V + Voffset
      EndIf
      
    Next

    For CTR = 0 To TotalFaces
      MeshFace(Faces(CTR, 0), Faces(CTR, 1), Faces(CTR, 2))
    Next
      
  FinishMesh(#True)
  
  ;# We normalize the mesh because I haven't spent the time to manually calculate the vertex normals.
  ;I might add this process later on, but for now I'll keep it this way.
  
  NormalizeMesh(Handle)
  
  FreeArray(Vertices())
  FreeArray(Faces())
  
  ProcedureReturn Handle

EndProcedure
Just ask if you have any questions.
Last edited by Samuel on Mon Jan 26, 2015 9:51 pm, edited 3 times in total.
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

Samuel, thanks!
You're a genius! Absolutely perfect! :wink: :)

Of course, the colors would be super, so when you do, it will be even better 8)

I will now try to understand and make their own way. If I misunderstood something, so I'll get back, ok?

Thanks a lot :!:
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

I ask the question primitive :)

You're there as a background

Code: Select all

CameraBackColor(#Camera, RGB(80,80,80))
I would like to put there should be some space (such as in the 3D demo in PB).

I'm trying:

Code: Select all

    Add3DArchive("\",#PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

...

    ; SkyBox
    SkyBox("stevecube.jpg")

And I have a white background ...
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Basic Terrain Generator

Post by Samuel »

zxretrosoft wrote: I would like to put there should be some space (such as in the 3D demo in PB).

I'm trying:

Code: Select all

    Add3DArchive("\",#PB_3DArchive_FileSystem)
    Add3DArchive("Data/Packs/skybox.zip", #PB_3DArchive_Zip)

...

    ; SkyBox
    SkyBox("stevecube.jpg")

And I have a white background ...
Unless you saved Terrain Gererator.pb into the 3D folder you'll need the full path to the skyboxes.

For example.

Code: Select all

Add3DArchive("C:\PureBasic\Example\3D\Data\Packs\skybox.zip", #PB_3DArchive_Zip)
You can also use something like this which will automatically fill in the path up to you're compiler location.

Code: Select all

Add3DArchive(#PB_Compiler_Home+"\Examples\3D\Data\Packs\skybox.zip", #PB_3DArchive_Zip)
You're skybox should work then, but if it doesn't just let me know.
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

Yes, that was the problem!
It's working!

Thank you & I'm going to experiment further;-)
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

The main missing features are LOD and color heightmaps.
As for the color heightmaps (which allow smoother height transitions) I might implement them at a later date.
Hi Samuel!
I just want to ask. Please, how difficult are the least color heightmaps? I need at least some idea. I tried to do a variety of colors with the help of lights, but it does not work well... :(
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Basic Terrain Generator

Post by Samuel »

zxretrosoft wrote: I just want to ask. Please, how difficult are the least color heightmaps? I need at least some idea.
Hello zxretrosoft,

They should work similarly to grey scale heightmaps. To help explain I'll start with breaking done the grey scale process a little.

First we assign the maximum height our terrain can reach. For example I'll say TerrainHeight = 128.

Now with grey scale all three color values should be the same value. So, we'll only collect the red value of each pixel.

Next we set every vertex of our plane to a pixel and collect the red value of that pixel. For example I'll say the red value equals 54.

Code: Select all

  Step    = TerrainHeight / 255
  VertexY = Red(Pixel) * Step
  VertexY = ?
If we fill in the variables we get.

Code: Select all

  Step    = 128 / 255
  VertexY = 54 * Step
  VertexY = 27.10588235294115
This is how we calculate the height with a grey scale image.

Now with multi-color heightmaps instead of dividing the TerrainHeight by 255 we divide by 16,777,216.
We also need to collect all three color values instead of just the red.

Code: Select all

  R = 54
  G = 128
  B = 16
  Step    = TerrainHeight / 16777216
  VertexY = (R + G*256 + B*256^2) * Step
  VertexY = 8.25041198730468
I believe this is how we calculate the height with color maps, but I have yet to try this so there may be some errors in my logic.

The rest of the terrain generation should be able to stay the same as my original example.

I can try to implement it sometime this weekend if you can't get it working.


EDIT:

Now that I think about it the code for color maps can be made even simpler.
I'm pretty sure Point(x, y) will return the color value that the code above manually calculated.
At least I think it does.

Code: Select all

  Color   = Point(x, y)
  Step    = TerrainHeight / 16777216
  VertexY = Color * Step
  VertexY = HeightValue
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

Thanks so much Samuel!
Today or tomorrow I'll try to do.

Attacked me one more question. If it can be done in reverse. This means that the colors projected into 3D.

I need to introduce yet another dimension.

Eg. the deeper deformation, thus there will be more red. Or the higher the mountain, it will be more green.

I've tried to do over the lights :(

http://www.imgshare.tym.sk/images/7i8o6 ... vr26r4.png
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Basic Terrain Generator

Post by Samuel »

zxretrosoft wrote: Attacked me one more question. If it can be done in reverse. This means that the colors projected into 3D.

I need to introduce yet another dimension.

Eg. the deeper deformation, thus there will be more red. Or the higher the mountain, it will be more green.
This is definitely possible, but the process will depend on how you want the end result to look.
If you just want to color the terrain without any textures on it then you can use MeshVertexColor() for each vertex during the mesh creation.

If you want to have textures on your terrain and colors based on height then I believe the best way is to use a shader.
Luckily, it would be a very basic shader.
So, If you need one written I could probably put it together for you today or tommorrow.

But, if you want a shader then I'll need a little info from you.

Are you using DirectX or OpenGL?

Second question, are the only colors you want red and green (red being the lowest and green the highest)?
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

If you want to have textures on your terrain and colors based on height then I believe the best way is to use a shader.
Luckily, it would be a very basic shader.
So, If you need one written I could probably put it together for you today or tommorrow.
Yes, I think so. Thank you in advance!

OpenGL or DirectX? I do not know now, I'm sorry, with 3D graphics I start experimenting :| What is better to use for this case? I guess I do not care.

And second. Red is the lowest and the highest green (or vice versa) - I think this is so far the best for my understanding.

Thanks a lot Samuel! :wink:
Last edited by zxretrosoft on Sun Jul 27, 2014 12:19 am, edited 1 time in total.
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Basic Terrain Generator

Post by Samuel »

On windows by default you're using DirectX, but if you want you can change it to OpenGL in the compiler options.
On the other operating systems you're limited to just OpenGL.

The purebasic code is identical for both so you won't have to change anything.

The shader code will be different depending on which you choose. This is the reason I was asking.
zxretrosoft wrote:What is better to use for this case?
Both are good enough to get the job done. I guess it's a matter of personal opinion.
When using PB/OGRE I prefer DirectX, but when using C++ I prefer OpenGL.

If you plan on only supporting windows then I'd stick with DirectX, but if you plan on supporting the other operating systems too then I'd go with OpenGL.
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

OK. Well, I think that we can choose DirectX :)
User avatar
Samuel
Enthusiast
Enthusiast
Posts: 755
Joined: Sun Jul 29, 2012 10:33 pm
Location: United States

Re: Basic Terrain Generator

Post by Samuel »

Here's what the shader effect looks like so far. Let me know if this isn't the effect you're going for.

Image

This was just a simple test on a sphere, but it will work on any type of entity.

Before I continue I'll need a little more info from you.

As you can probably tell the sphere looks more like a circle then a 3D object and that's because this shader doesn't handle lighting effects.
If you need ambient, diffuse, or specular lighting effects I can set the shader up to support them.

But if you don't want lighting then I'll post it as it is.

Also, do you want texture support. If you do then this will also need to be set up within the shader.

Once you let me know about the lighting and textures I should be able to complete the shader.

EDIT:

Image

This is what it currently looks like on a terrain.
I personally think it looks kinda plain without any lighting effects, but maybe that's what you want?
User avatar
zxretrosoft
Enthusiast
Enthusiast
Posts: 171
Joined: Wed May 15, 2013 8:26 am
Location: Czech Republic, Prague
Contact:

Re: Basic Terrain Generator

Post by zxretrosoft »

Samuel, I think I understand. Thanks.

Yes, that's enough for now. It's probably the easiest option, right?

If you need ambient, diffuse, or specular lighting effects I can set the shader up to support them.
But if you don't want lighting then I'll post it as it is.
Also, do you want texture support. If you do then this will also need to be set up within the shader.
Background + textures where I can have as well? That's what you're asking? It would be better, but we still try the easiest option.

EDIT:
Maybe it could be, after all, on the contrary. The tops of red and green bottom. It will be difficult to change in the shader?
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

Re: Basic Terrain Generator

Post by applePi »

zxretrosoft:
It will be difficult to change in the shader?
thats also what i want to ask, so we have the option to change the meanings of the colors
also we may be able to have a function like "Picture to terrain"
thanks for all the above valuable info.
Post Reply