Re: Terrain Lights Issue
Posted: Sat Nov 02, 2013 5:56 pm
Is it one solid terrain or many that are connected?
If possible could you post some example code?
If possible could you post some example code?
http://www.purebasic.com
https://www.purebasic.fr/english/
But you can change this light to change the lightmap. Use F5The Terrain component uses a directional light to compute the terrain lightmap, so let's put a directional light into our scene:
Code: Select all
;
; ------------------------------------------------------------
;
; PureBasic - Terrain : Create 9 terrains in one TerrainGroup
;
; (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;
; It can take few minutes to build all terrains (it will be more faster after saving it)
MessageRequester("Warning !", "It can take a few minutes to build all terrains...", 0)
IncludeFile "Screen3DRequester.pb"
#CameraSpeed = 2
#TerrainMiniX = 0
#TerrainMiniY = 0
#TerrainMaxiX = 0
#TerrainMaxiY = 0
Define.f KeyX, KeyY, MouseX, MouseY
Declare InitBlendMaps()
; OpenGL needs to have CG enabled to work (Linux and OS X have OpenGL by default)
;
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
Flags = #PB_Engine3D_EnableCG
CompilerEndIf
If InitEngine3D(Flags)
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
Add3DArchive("Data/Textures/", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Textures/nvidia", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Packs/desert.zip", #PB_3DArchive_Zip)
;- Light
;
light = CreateLight(#PB_Any ,RGB(190, 190, 190), 4000, 1200, 1000,#PB_Light_Directional)
SetLightColor(light, #PB_Light_SpecularColor, RGB(255*0.4, 255*0.4,255*0.4))
LightDirection(light ,0.55, -0.3, -0.75)
AmbientColor(RGB(255*0.2, 255*0.2,255*0.2))
For i=0 To 200
CreateLight(#PB_Any ,#Gray, Random(8000), Random(8000), 1000)
Next
;- Camera
;
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 800, 400, 80, #PB_Absolute)
CameraBackColor(0, RGB(5, 5, 10))
;- Terrain definition
SetupTerrains(LightID(Light), 3000, 0)
; initialize terrain
CreateTerrain(0, 513, 12000, 600, 3, "TerrainGroup", "dat")
; set all texture will be use when terrrain will be constructed
AddTerrainTexture(0, 0, 100, "dirt_grayrocky_diffusespecular.jpg", "dirt_grayrocky_normalheight.jpg")
AddTerrainTexture(0, 1, 30, "grass_green-01_diffusespecular.jpg", "grass_green-01_normalheight.jpg")
AddTerrainTexture(0, 2, 200, "growth_weirdfungus-03_diffusespecular.jpg", "growth_weirdfungus-03_normalheight.jpg")
; Build terrains
For ty = #TerrainMiniY To #TerrainMaxiY
For tx = #TerrainMiniX To #TerrainMaxiX
Imported = DefineTerrainTile(0, tx, ty, "terrain513.png", ty % 2, tx % 2)
Next
Next
BuildTerrain(0)
If imported = #True
InitBlendMaps()
UpdateTerrain(0)
; If enabled, it will save the terrain as a (big) cache for a faster load next time the program is executed
; SaveTerrain(0, #False)
EndIf
; SkyBox
;
;SkyBox("desert07.jpg")
CreateWater(0, 0, 100, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterCaustics | #PB_World_WaterSmooth | #PB_World_WaterFoam | #PB_World_WaterGodRays)
Sun(10000, 10000, -100000, RGB(238, 173, 148))
Repeat
Screen3DEvents()
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F5)
;- Light
;
light = CreateLight(#PB_Any ,RGB(0, 0, 0), 4000, 200, 1000,#PB_Light_Directional)
SetLightColor(light, #PB_Light_SpecularColor, RGB(0*0.4, 0*0.4,0*0.4))
LightDirection(light ,0.55, -0.3, -0.75)
AmbientColor(RGB(5*0.2, 5*0.2,5*0.2))
CameraBackColor(0, RGB(0, 0, 0))
UpdateTerrain(0)
EndIf
If KeyboardPushed(#PB_Key_Left)
KeyX = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Right)
KeyX = #CameraSpeed
Else
KeyX = 0
EndIf
If KeyboardPushed(#PB_Key_Up)
KeyY = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY = #CameraSpeed
Else
KeyY = 0
EndIf
EndIf
If ExamineMouse()
MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
EndIf
MoveCamera(0, CameraX(0), TerrainHeight(0, CameraX(0), CameraZ(0)) + 20, CameraZ(0), #PB_Absolute)
MoveCamera (0, KeyX, 0, KeyY)
RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
EndIf
Else
CompilerIf #PB_Compiler_OS <> #PB_OS_Windows Or Subsystem("OpenGL")
;
; Terrain on Linux/OSX and Windows with OpenGL needs CG toolkit from nvidia
; It can be freely downloaded and installed from this site: https://developer.nvidia.com/cg-toolkit-download
;
MessageRequester("Error","Can't initialize engine3D (Please ensures than CG Toolkit from nvidia is correcly installed)")
CompilerElse
MessageRequester("Error","Can't initialize engine3D")
CompilerEndIf
EndIf
Procedure Clamp(*var.float, min.f, max.f)
If *var\f < min
*var\f = min
ElseIf *var\f > max
*var\f = max
EndIf
EndProcedure
Procedure InitBlendMaps()
minHeight1.f = 70
fadeDist1.f = 40
minHeight2.f = 70
fadeDist2.f = 15
For ty = #TerrainMiniY To #TerrainMaxiY
For tx = #TerrainMiniX To #TerrainMaxiX
Size = TerrainTileLayerMapSize(0, tx, ty)
For y = 0 To Size-1
For x = 0 To Size-1
Height.f = TerrainTileHeightAtPosition(0, tx, ty, 1, x, y)
val.f = (Height - minHeight1) / fadeDist1
Clamp(@val, 0, 1)
SetTerrainTileLayerBlend(0, tx, ty, 1, x, y, val)
val.f = (Height - minHeight2) / fadeDist2
Clamp(@val, 0, 1)
SetTerrainTileLayerBlend(0, tx, ty, 2, x, y, val)
Next
Next
UpdateTerrainTileLayerBlend(0, tx, ty, 1)
UpdateTerrainTileLayerBlend(0, tx, ty, 2)
Next
Next
EndProcedure I didn't even think about that. Unfortunately, I have no clue how. Normally, I disable the materials lighting effects, but terrains don't use materials.Alexi wrote:A nice idea, can we disable the Lights for the Terrain? Otherwise it would still render those artefacts on the terrain.![]()
Looks like it's using two compositors. A G-buffer and a light compositor.Alexi wrote: I recently found a "deffered shading" technique for Ogre, but I'm not sure if it just need a compositor or anything other we can't access from PB.
It uses the default lights. It's very similar to how the lights you use now work. It just handles all the lights in one go instead of multiple passes like it does now.Alexi wrote: Would the deffered shading use the default lights? Or does it use meshes with a material?
The ability to add more lights to the terrain materials would solve this in an instant, but since we can't get a hold of those materials.Alexi wrote: How could a material act like light? Like a Sphere of Fog or Glow brighten everything behind/in it's range (blendmode "add"), i really just need simple light, without strange artifacts.
If it's too dark you could try SetMaterialColor(#Material, #PB_Material_SelfIlluminationColor, Color) to lighten it up a bit.Alexi wrote: I'm not sure it will lighten the background with scene_blend add if it's really dark and no ogre light source placed.
I have seen a few topics on volumetric lighting on the OGRE forums. The problem was most topics were a few years old and the source downloadsAlexi wrote:a historic contribution to PB, as this even isn't available at the O3D Community.
That's good to hear. It's a good idea for you to have other options for your lighting. Just in case I mess this up and can't get it workingAlexi wrote:This actual solution works mostly good.
It uses a compositor with 4 HLSL shaders at the moment. It doesn't run off of the default lighting.Alexi wrote: How the volumetric light works? A compositor using default lights?