Schatten

Übersicht BlitzBasic Blitz3D

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Plasma(alt)

Betreff: man

BeitragMo, Jul 19, 2004 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
kann sehr wohl mit shadern schatten berechnen und darstellen
DIV is dead !

Mr.Keks

BeitragMo, Jul 19, 2004 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
hört mal auf mit eurem shadderbla! Wink

gestern abend habe ich ohne rücksicht auf flexibilität, schönheit, sauberkeit oder dergleichem mal was dahingeschmiert, um die von mir beschriebene methode zu zeigen, die meines erachtens die einzige, wirklich in bb einsetzbare ist. (ich poste es auch nicht ins codearchiv, um sicherzugehen, dass es schnell weg ist und dann keiner mehr dieses schandstück sieht Wink)

vorteile:
Arrow man hat schatten!
nachteile:
Arrow empfänger dürfen einander nicht verdecken, wenn man nicht mehrere texturen machen will.
Arrow empfängermeshs dürfen sich nicht selbst verdecken.
Arrow empfänger und lichtquellen dürfen sich relativ zu einander nicht bewegen, wenn man nicht jedes mal die uvprojektion neu berechnen möchte.
Arrow es ist auch nicht wirklich schnell
Arrow an kanten gibt es manchmal komische optische effekte...
Code: [AUSKLAPPEN]
Graphics3D 800,600,16,2
SetBuffer BackBuffer()

;kamera
piv = CreatePivot()
cam = CreateCamera(piv)

MoveEntity cam,0,0,-10
PointEntity cam,piv


;ein hübsches bodenmesh aus sucox code geklaut ;)
mesh = CreateBoden(20,20)

cubes = CreateMesh()
For i = 0 To 50
   cube = CreateCylinder(5)
   ScaleMesh cube,.8,.8,.8
   PositionMesh cube,Rnd(2,18)-10,.5,Rnd(2,18)-10
   RotateMesh cube,Rand(-20,20),Rand(360),Rand(-20,20)
   AddMesh(cube, cubes)
   FreeEntity cube
Next

ScaleMesh mesh,2,2,2
ScaleMesh cubes,2,2,2

meshbrushwhite = CreateBrush(255,255,255)
BrushFX meshbrushwhite,1
meshbrush = CreateBrush(255,255,255)

cubebrushwhite = CreateBrush(255,255,255)
BrushFX cubebrushwhite,1
cubebrush = CreateBrush(255,255,255)


;licht und lichtkamera
Global light = CreateLight(2)
PositionEntity light,19,28,0
LightColor light,10,10,10
AmbientLight 10,10,10

lightcam = CreateCamera(light)
HideEntity lightcam
CameraFogMode lightcam,1
CameraFogRange lightcam,5,50
CameraViewport lightcam,0,0,512,512
PointEntity lightcam,mesh
CameraViewport lightcam,0,0,512,512

EntityParent CreateCube(lightcam),0; man will ja auch sehen, wo das licht ist ;)

;die zwei schattentexturen
stex = CreateTexture(512,512)
TextureBlend stex,2
stex2 = CreateTexture(512,512)
TextureBlend stex2,2

;BrushTexture cubebrush,stex2

;projektion
ProjUV(lightcam,mesh,512)
ProjUV(lightcam,cubes,512)

;den schatten der würfel vorberechnen
EntityColor cubes,10,10,10
EntityFX cubes,1
RenderShadow(lightcam,cam,stex2)
EntityColor cubes,255,255,255
EntityFX cubes,0

;coole, schattenwerfende kugeln ;)
kpiv = CreatePivot()
Global kugel[10]
For i = 0 To 10
   kugel[i] = CreateSphere(8,kpiv)
   ScaleEntity kugel[i],Rnd(2,3),Rnd(2,3),Rnd(2,3)
   RotateEntity kugel[i],Rand(360),Rand(360),Rand(360)
   PositionEntity kugel[i],Rand(-30,30),Rand(-30,30),Rand(-30,30)
Next
ScaleEntity kpiv,.5,.5,.5


;mainloop
While Not KeyHit(1)
   If KeyHit(57) Then wire = 1- wire:WireFrame wire
   
   TurnEntity kpiv,.3,1,.1
   
   PointEntity lightcam,mesh
   PaintSpheres(10,10,10,1)
   PaintEntity mesh,meshbrushwhite
   PaintEntity cubes,cubebrushwhite
   
   RenderShadow(lightcam,cam,stex)
   
   PaintEntity mesh,meshbrush
   PaintEntity cubes,cubebrush
   EntityTexture mesh,stex,0,1
   EntityTexture mesh,stex2,0,2
   EntityTexture cubes,stex
   PaintSpheres(255,255,255,0)
   
   RenderWorld
   
   If KeyHit(2) Then FlushKeys : WaitKey()
   
   TurnEntity piv,KeyDown(200)-KeyDown(208),KeyDown(205)-KeyDown(203),0
   MoveEntity cam,0,0,KeyDown(30)-KeyDown(44)
   RotateEntity piv,EntityPitch(piv),EntityYaw(piv),0
   
   Flip
Wend
End


Function ProjUV(cam,mesh,width#)  ; diese funktion passt die vertexkoordinaten an die projektion der kamera an
   RotateEntity cam,EntityPitch(cam),EntityYaw(cam),0
   For s = 1 To CountSurfaces(mesh)
      sur = GetSurface(mesh,s)
      For ve = 1 To CountVertices(sur)
         x# = VertexX(sur,ve)
         y# = VertexY(sur,ve)
         z# = VertexZ(sur,ve)
         
         TFormPoint x#,y#,z#,mesh,0
         x# = TFormedX#()
         y# = TFormedY#()
         z# = TFormedZ#()
         
         CameraProject(cam,x#,y#,z#)
         u# = ProjectedX#()/width#
         v# = ProjectedY#()/width#
         
         VertexTexCoords sur,ve,u#,v#
      Next
   Next
End Function


Function PaintSpheres(r,g,b,fx) ; färbt die ganzen kugeln ein (hätt' ich die doch bloß mit addmesh zusammengefügt! ;))
   For i = 0 To 10
      EntityColor kugel[i],r,g,b
      EntityFX kugel[i],fx
   Next
End Function


Function RenderShadow(cam,hcam,tex) ; rendert die schattentextur
   ShowEntity cam
   HideEntity hcam
   
   size = TextureWidth(tex)
   
   CameraViewport cam,0,0,size,size
   
   UpdateWorld
   RenderWorld
   
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(tex)
   
   HideEntity cam
   ShowEntity hcam
End Function


Function CreateBoden(xstep = 20, zStep = 20) ; erstellt einen wunderschönen sucox boden ;)
   Local final_mesh = CreateMesh()
   Local final_surface = CreateSurface(final_mesh)
   Local vertex[5]
   
   
   For x = 0 To xstep-1
      For z = 0 To zStep-1     
         vertex[0] = AddVertex(final_surface,x-xstep/2,0,z-zStep/2,0,0)
         vertex[1] = AddVertex(final_surface,x-xstep/2,0,z-zStep/2-1,0,1)
         vertex[2] = AddVertex(final_surface,x-xstep/2+1,0,z-zStep/2-1,1,1)
         
         vertex[3] = AddVertex(final_surface,x-xstep/2,0,z-zStep/2,0,0)
         vertex[4] = AddVertex(final_surface,x-xstep/2+1,0,z-zStep/2,1,0)
         vertex[5] = AddVertex(final_surface,x-xstep/2+1,0,z-zStep/2-1,1,1)
         
         AddTriangle(final_surface, vertex[2], vertex[1], vertex[3])
         AddTriangle(final_surface, vertex[3], vertex[4], vertex[5])
         
         UpdateNormals(final_mesh)
      Next
   Next
   
   Return final_mesh
End Function
MrKeks.net
 

Dreamora

BeitragMo, Jul 19, 2004 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
shadow meshes gehen auch wie Sswifts Schattenlib zeigt
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ChrisAttack

BeitragMo, Jul 19, 2004 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist noch eine leseprobe aus einem c++ / directx buch.
in dem probe kapitel geht es auch um schatten. vielleicht kann man die ideen daraus auch in bb übernehmen Confused
http://www.scherfgen-software....xcerpt.pdf
B3D
MSVC++
DX9SDK
 

David

BeitragMo, Jul 19, 2004 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Na, Blitz3D is dafür etwas zu begrenzt glaube ich. Naja, vieleicht lieg ich ja auch völlig falsch, wenn ja lass ich mich gern aufklären. Smile

grüße
http://bl4ckd0g.funpic.de
 

Dreamora

BeitragMo, Jul 19, 2004 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
das is genau das wovon ich sprach

auf genau den Buffer hat man ja leider keinen Zugriff ... und meines Wissens is Sswifts Schattenlib bis anhin die einzige verfügbare Variante die mit Schattenvolumen arbeitet um Schatten zu erzeugen.

Fredborg hat zwar auch samples gepostet nur sind sind die weit von einer realen nutzung als "modul" entfernt da sie lediglich zum zeigen gewisser techniken waren ...

Vielleicht kann ja jemand hier der sich schon eingehender mit den Schattenerzeugungsmethoden von Blitz3D beschfätigt hat damit wirklich etwas anfangen ... Es ist in den bb.com code archiven
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Thomas

BeitragDi, Jul 20, 2004 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
eine der genialsten Varianten wurde bei Generals verwendet, Echtzeitschatten OHNE Lichtquelle, einfach genial!

Dort werden die Gebäude die sich auf dem Terrain befinden einfach in einem bestimmten Winkel nochmals unterhalb der Landschaft mit aktivem Backface Culling platziert, doppelt. Dann wird ahnlich wie in diesem Schatten PDF beschrieben (ChrisAttack) der Winkel von oben nach unten benutz, bei Generals aber die Verbindungen zwischen den jeweils doppelten Vertices, dort wo dann das Terrain berührt wird, entsteht der Schatten, genial!


Oh Holy Generals! 8)


wie nun aber der das Auftreffen auf den Boden geprüft wird habe ich keine Ahnung.... jedenfalls noch nicht....


greetings
Konfuzius sprach: "Ich bin kein Mensch, der von Geburt an schon alles wusste. Ich bin aber ein Mensch, der zugleich das Alte verehrt und in seinem Streben unermuedlich ist."
 

Dreamora

BeitragDi, Jul 20, 2004 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
mit linepick -> in blitz3d leider um welten zu langsam

kann auch errechnet werden, allerdings sehr komplizierte formel und beim kleinsten fehler tödlich langsam
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

eizdealer

BeitragMi, Jul 21, 2004 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Thomas, könntest du die Methode noch etwas genauer beschreiben? Das würde mich sehr interessieren!

Wie würdet ihr statische aber von der Engine berechnete Schatten machen? Ich hatte daran gedacht, das jeweilige Objekt mit orthografischer Projektion zu rendern und es dann als Textur auf ein Shadowmesh zu kleben. Aber was ist, wenn sich jetzt zwei solche Teile überschneiden? Dann wird's noch dunkler.
Und wie würdet ihr das mit Dynamischen Objekten machen, die sagen wir alle 10 fps gerendert werden müssen?

Thomas

BeitragMi, Jul 21, 2004 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
die Objekte die sich direkt auf dem terrain befinden gibt es in einer "abgespeckten" mesh Variante nochmals, ohne Texurierung, und jene befindet sich unterhalb des Terrains, in einem anderen Winkel. Da beide die selben Vertices doppelt besitzen werden jene doppelte nun miteinander verbunden und dadurch die Schattenlinien gezogen.

dieses Bild dürfte dir die Erleuchtung bringen:

user posted image


wenn man den Winkel der unteren "Kopien" ändert, ändert sich damit auch der Schattenwinkel. Somit kann jede belibige Uhrzeit "gefaked" werden ohne jemals eine Lichtquelle zu verwenden, einfach genial.

Diese Technik kenne ich erst seit Generals. Ich denke EA hat hier wirklich eine neue Methode erfunden. Währe wohl auch zuviel gewesen noch echtes Licht mit in die Szenerie zu legen....

Aber lass uns bitte nicht zu viel über Generals sprechen, ich bin froh gerade auf "Entzug" zu sein.... Wink


für terrains ist diese Methode gut geeignet, in Einzelspieler-Games ist es in Räumen auch noch gut denkbar... bei Stockwerken übereinander wirds problematisch....


greetings
Konfuzius sprach: "Ich bin kein Mensch, der von Geburt an schon alles wusste. Ich bin aber ein Mensch, der zugleich das Alte verehrt und in seinem Streben unermuedlich ist."

Mr.Keks

BeitragMi, Jul 21, 2004 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
die methoede ist uralt und absolut nix besonderes.....

ich bezweifle aber, dass sie die so eingesetzt haben, denn dann ist es wirklich arschlahm. auch wenn man es nur einmal berechnet....
MrKeks.net
 

Dreamora

BeitragMi, Jul 21, 2004 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht nett aus, jedoch frage ich mich wie man in Blitz3D die Schattenmeshes errechnen will ohne das es komplett einknickt.

Ich war glücklicherweise in der erfreulichen Lage, durch einen Onlineverkauf ein wenig Geld auf mein PayPal Konto bekommen zu haben um mir damit Sswifts Schattensystem zu kaufen. Die genaue Technik dahinter habe ich allerdings auch noch net verstanden, da dabei sehr viel Mathe im Spiel ist und die Strukturierung des Codes einige Einarbeitungzeit und Hintergrundwissen ( welches ich leider nicht habe ) verlangt. Wenn ich es irgendwann verstanden habe, kann ich ja versuchen, sie zu erklären. Ich weiss jedoch, dass im Schattensystem ebenfalls solche Shadowvolumes erzeugt werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Thomas

BeitragMi, Jul 21, 2004 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Inarie hat Folgendes geschrieben:
die methoede ist uralt und absolut nix besonderes.....

ich bezweifle aber, dass sie die so eingesetzt haben, denn dann ist es wirklich arschlahm. auch wenn man es nur einmal berechnet....



jetzt wo du es sagst.. ich glaube sogar das in Earth 2150 das selbe zum Einsatz kam... stimmt...

hmmmm...... 1200 produzierte Panzer in einem einzigen Game treffen auf 1400 Mechs...... die Kämpfe in Earth waren schon genial.....


wobei 70% von Generals eh von Earth geklaut , aaahh ich meine abgeschaut... ahhh meine als Inspiration gedient haben....
.........................
hehe


greetings
Konfuzius sprach: "Ich bin kein Mensch, der von Geburt an schon alles wusste. Ich bin aber ein Mensch, der zugleich das Alte verehrt und in seinem Streben unermuedlich ist."

eizdealer

BeitragDo, Jul 22, 2004 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ehrlich gesagt kann ich nicht ganz nachvollziehen, warum der Mesh kopiert werden muss. Dazu musst du ja die Koordinaten der Sonne wissen (bzw. die Richtung, aus der sie kommt). Und mit denen alleine kannst du die Schnittpunkte schon berechnen, also was bringt das?
Ausser der Mesh wird nach dem Terrain und vor den normalen Einheiten gerendert. Aber dann hätte man das Problem, dass alle Einheiten Meshes das Terrain überdecken würden, auch wenn sie eigentlich dahinter wären. Ausserdem würde das mit bergigem Terrain gleich garnicht funktionieren.
 

Dreamora

BeitragDo, Jul 22, 2004 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kopierte Mesh hat durchaus einen Sinn.
Allerdings als Schattenmesh selbst.
Dann kannst du Aufgrund der Sonnenposition und des richtigen Meshes die entsprechenden Vertices des Schattenmesches auf dem Untergrund positionieren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

eizdealer

BeitragDo, Jul 22, 2004 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaah jetzt verstehe ich!
Aber ist das nicht derbes Polywasting? Wenn man überlegt, wieviel Polies so ein Gebäude hat...
Ausserdem muss man dann doch jedes Frame, bzw. jedes Mal, wenn man den Schatten updatet, auch alle Vertices verschieben.
Und was ist, wenn mehrere solcher Meshes übereinander liegen? Dann wirds ja noch dunkler, oder?
 

Dreamora

BeitragDo, Jul 22, 2004 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt draufan wie du es machst. Wenn du das Shadowmesh einfach schwarz machst, dann nicht Smile

Du kannst fürs Shadowmesh auch jene Version vom Originalmesh klonen, welche für das niedrigste LoD Level erstellt wurde. Die sollte relativ wenige Vertices hast. Alternativ kann man auch ein spezielles ShadowMesh machen das in seiner Hülle mehr oder weniger identisch mit dem Original ist, so dass man den Unterschied nicht sieht im Schatten. Dadurch kann man unmengen an Vertices im Schatten sparen.

Eine einfache Methode zur erzeugung dieses Schattenmeshes ist zum Beispiel die QHull Lib das ein Hüllenmesh erzeugt um Objekte. Dieses kann man dann auch gleich als Kollisionsmesh benutzen. Die Lib ist allerdings nur für statische oder pseudostatische ( Fahrzeuge und Objete deren Form mehr oder unverändert bleibt )

Das Hauptproblem ist das effiziente Herausfinden der Höhe der einzelnen Schattenvertices.

Die Methode hat übrigens noch einen sehr praktischen Vorteil: Man kann auch durchscheinenden Gläsern einen durchscheinenden Schatten geben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Mr.Keks

BeitragDo, Jul 22, 2004 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Die Methode hat übrigens noch einen sehr praktischen Vorteil: Man kann auch durchscheinenden Gläsern einen durchscheinenden Schatten geben.
das geht eigentlich mit den meisten der methoden hier... das geht sogar mit meiner billigschattenmethode da oben ^^
MrKeks.net
 

Dreamora

BeitragDo, Jul 22, 2004 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Source hat einen Fehler. Vertexindices sind von 0 bis VertexCount - 1

Auf ne Textur rendern is nur keine Alternative. Nehmen wir ein Terrain mesh mit einer Ausdehnung von 1000 x 1000 in der Ebene ... dann gibt nen 10x10x10 grosses Objekt noch nen Pixel.
Das ist ein Vorteil von Schattenmeshes, da die nicht von der Ausdehnung des Schattenreceivers abhängen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Thomas

BeitragFr, Jul 23, 2004 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Inarie & eizdealer


wenn man bei Generals bedenkt das 30 Panzer, Fahrzeuge plus Fußsoldaten plus Flugzeuge auf 40 Panzer plus Fußsoldaten plus Artellarie plus Gebäude plus Verteidigungsgebäude treffen und jede Einheit eine "echte" Lichtquelle zuweist und sie schön bei jedem Schuss und bei jedem Auftreffen plus Explosion einsetzt, denke ich doch dass das selbst die neueste Hardware überfordern würde...

Verhältnismäßigkeit ist hier wie immer das Zauberwort!


greetings
Konfuzius sprach: "Ich bin kein Mensch, der von Geburt an schon alles wusste. Ich bin aber ein Mensch, der zugleich das Alte verehrt und in seinem Streben unermuedlich ist."

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group