Seite 1 von 2
Ogre Schatten
Verfasst: 10.06.2006 15:57
von cofter
Ich habe eine kleine Welt gebastelt und möchte gern das die wichtigen Entitys schatten werfen.
Der #PB_Shadow_Modulative Schatten ist äußerst unschön aber sichtbar
der #PB_Shadow_Additive ist aber leider nicht sichtbar.
Könnte das an meiner Grafikkarte liegen (Ati Radeon 345m IGP)?
Sollte doch aber eigentlich ein Fehler kommen wenn meine Graka das nicht unterstützen sollte.
mfg
Cofter
Verfasst: 12.06.2006 14:27
von bobobo
hmm .. selbst bei meiner onboard-Graka (82852(82855 GM/GME in einem Notebook) geht das mit additiven Schatten.
Folgendes Beispiel (PB4) in Anlehnung an das mitgelieferte
light.pb Demo zeigt einen bunten Schattenverlauf. Das sind
mehrere farblich unterschiedliche Lichter die zueinander
leicht verschoben sind.
Code: Alles auswählen
; PB4
;in das Example-Source-Verzeichnis speichern, da auf
;mitgelfierten PB_ressourcen zugegriffen wird
#CameraSpeed = 10
IncludeFile "Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
Add3DArchive("Data\", #PB_3DArchive_FileSystem)
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
WorldShadows(#PB_Shadow_Additive)
LoadMesh (0, "Robot.mesh")
LoadTexture(0, "r2skin.jpg")
AmbientColor(RGB(64,64,64))
CreateEntity (0, MeshID(0), CreateMaterial(0, TextureID(0)))
AnimateEntity(0, "Walk")
EntityRenderMode(0,#PB_Entity_CastShadow)
CreateLight(0, RGB(0,0,255), 80.0, 0, 0) ; Blue light
CreateLight(1, RGB(64,0,255), 80.0, 0, 5) ; Blue light
CreateLight(2, RGB(128,0,255), 80.0, 0, 10) ; Blue light
CreateLight(3, RGB(255,0,255), 80.0, 0, 15) ; Blue light
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,100,100,50)
Repeat
Screen3DEvents()
ClearScreen(RGB(0, 0, 0))
If ExamineKeyboard()
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()/10)*#CameraSpeed/2:MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
EndIf
RotateEntity(0, 1, 0, 0)
RotateCamera(0, MouseX, MouseY, RollZ)
MoveCamera (0, KeyX, 0, KeyY)
CameraLookAt(0,0,50,0)
RenderWorld()
Screen3DStats()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
End
Verfasst: 13.06.2006 16:52
von cofter
Ja ich wollts aber auf nen Terrain haben und da werden die Schatten nicht angezeigt.
mfg
Cofter
Verfasst: 13.06.2006 19:01
von bobobo
So ist das eben bei den terrains ..
Schatten werden wohl nur zwischen Entities berechnet
Wenn Du den Boden als Entity erzeugst erhälst Du wohl auch einen Schatten.
Verfasst: 13.06.2006 20:00
von cofter
Wie soll ich das Terrain als Entity erzeugen?
Soll ich nen *.mesh laden? 0_o
Verfasst: 13.06.2006 21:05
von Preludian
So viel ich weiss gehen momentan Schatten auf Terrains mit der PB <= 4 nicht.
What shadows do is render zones with or without light (lit and shadowed, respectively). The problem here is that terrains are lit through lightmaps and not dinamically lit, so there's no difference between the lit and shadowed part. This might sound abstract, but, the shadow is there, though you can't see it.
I think you need to define a material with lighting on and enable terrain normals in the scene manager (through the terrain config file).
Additive stencil won't work on the terrain unless it's dynamically lit (which it isn't by default). Additive lighting works by masking out regular dynamic lighting, so if there isn't any, it's not going to work Wink
Use modulative instead, or if you want to use additive, turn on dynamic lighting on the terrain by enabling normals in terrain.cfg and using a custom material.
This is just the way GPUs behave, normals are scaled using the same world matrix as everything else, hence you should avoid scaling unless you use setNormalisedNormals.
Also scheint vieles nicht in unserer Hand zu liegen. Oder hat es jemand mal geschafft?? Sonst müsste Fred mal demnächst rein schauen...
Verfasst: 15.06.2006 10:56
von dllfreak2001
Also mit nem Mesh als Terrain funzt es Prima, aber die Echtzeitschatten sehen total mies aus.
Man kann auch auf den Boden ein Schattenmesh mit Transparenz legen, das ist flotter und man kann es schöner gestalten.
Hat Take 2 in GTA 3 auch gemacht.
Verfasst: 15.06.2006 11:49
von Preludian
und wie kriegst du es hin, dass der Schatten-Mesh bei unebenem Boden immer plan liegt, also den Unebenenheiten folgt? Durch verschieben der Mesh-Vertices?
Verfasst: 15.06.2006 12:54
von cofter
Also ich Mesh als Terrain kann ich bei meinem vorhaben vergessen,
möchte ein Endlosterrain erstellen.
Könnte natürlich auch Tiles machen und dann dynamisch nachladen.
Habe mich jetzt ein wenig im Ogre-Forum umgesehen und etwas interessantes gefunden.
http://www.ogre3d.org/wiki/index.php/Pa ... ne_Manager
Weiss aber net ob das mit der PB Ogre Version funktioniert.
Dazu gibts es mitlerweile auch schon einen Mapeditor.
http://www.ogre3d.org/wiki/index.php/PGLM-MapEditor
Werde das demnächst mal testen.
Das mit dem Schatten werde ich erstmal ausklammern und mich auf andere Dinge konzentrieren.
mfg
Cofter
Verfasst: 15.06.2006 16:42
von dllfreak2001
Naja weiß auch nicht genau wie das gehen soll.
Aufm Terrain sollte man die Winkel berechnen können wie das Mesh gedreht wird.
Aus bestimmten Blickwinkeln sieht das dann nicht so schön aus, da man erkennt das der Schatten sich vom Boden abhebt.
Andere Methode
Vielleicht kann man (wenn man das Terrain als Mesh gemacht hat)
den Schatten als Überlagerung einer Textur projektieren.
Verdunkeln geht dann, aber ich weiß nicht wie schnell das dann wird.
In Quake-Spielen werden statische Schatten generell so gemacht.
Ich Probier das mal aus.