[B3D]2D-Schatten (3D benötigt!)

Übersicht BlitzBasic Codearchiv

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

Neue Antwort erstellen

ToeB

BeitragSo, Jun 14, 2009 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@aMul :

Nein das stimmt nicht so ganz ...

Wenn du für sagen wir mal 50 Quads pro Kreis einen schatten ausrechnest, also für die beiden endpunkte den winkel berechnen, wären wir bei 50*2 -> 100 winkel berechnungen. Hinzu kommt natürlich, das auch noch 50 Quads gemalt werden müssten, bzw. 100 Dreiecke pro Kreis. Bei meiner version hast du aber nur 3 Winkelberechnugen + 2 Dreicke die gezeichnet werden müssten. Also ist es schonmal von den winkeln her 97% schneller und vom malen her 98%, sind insgeammt 97,5 % die mein Progrogramm schneller sind (wenn ich mich nicht verrechnet habe). Also ich würds so einbauen... Ist wirklich schneller !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Jun 14, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Nächstes mal schau dir doch bitte zuerst den Code an, ja?
Der Grund, warum es so schnell ist und ich ich es durch keine Optimierung schneller machen konnte ist, dass ich keine einzelne Winkelfunktion verwende, ein paar Summen und Produkte, das ist alles.

Übrigens, wenn du deine Idee so toll findest, warum baust du es nicht einfach selbst ein?
Der Code ist im ersten Post.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Noobody

BeitragMo, Jun 15, 2009 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein schöner Code, aber da ich hier auch schon eine Schattenberechnung gemacht habe, kann ich mir ein paar Kritikpunkte nicht verkneifen Wink

Das Licht sieht sehr gut aus, allerdings wird es mit deiner Methode sehr schwierig, mehr als ein Licht in Echtzeit hinzuzaubern. Ausserdem hat man auch bei deinem Beispiel das Problem, dass einmal abgedunkelte 3D Objekte vom zweiten Licht nicht wieder sichtbar gemacht werden können (wenn ein Schatten über ein Objekt fällt, so wird der Schatten vom zweiten Licht lediglich blau gefärbt, das Objekt bleibt aber verdeckt). Ich habe mich eine Weile mit 2D - Lichtern beschäftigt, bin dann aber zum Schluss gekommen, dass das mit Blitz - Bordmitteln unmöglich in Echtzeit hinzubekommen ist; dafür bräuchte man grösseren Zugriff auf die verschiedenen Buffer.

Mir fällt auch auf, dass die Schatten relativ viel Berechnungszeit benötigen (so ca. 35 ms im Schnitt). Schon mit einer simplen RectsOverlap - Abfrage konnte ich aber die Zeit um mehr als die Hälfte drücken, würde ich also noch einbauen Wink
Ausserdem empfehle ich, eine Optimierung für ganze Objekte einzubauen - bis jetzt scheinen ja nur einzelne Wände berechnet zu werden. Einen Implementationsvorschlag findest du hier. Diese Objekte sind leider nicht beliebig, sondern müssen im Gegenuhrzeigersinn angegeben werden. Allerdings kann man damit nochmal einen ordentlichen Geschwindigkeitsbonus rausholen (der oben verlinkte Code basiert darauf und läuft 5 Mal schneller als dein Beispielcode bei gleicher Objektanzahl).

Das Zeichnen der Objekte wird übrigens um einiges schneller, wenn du vor der Zeichenschleife den BackBuffer sperrst (nachher das entsperren nicht vergessen Wink ). Wenn der Buffer nämlich nicht gesperrt ist, wird das von Line selbst erledigt, weswegen der Befehl auch so langsam ist - wenn der Buffer pro Line einmal gesperrt und entsperrt wird, ist das um einiges langsamer, als wenn er ein einziges Mal vor den ganzen Line - Aufrufen gesperrt wird.
Desweiteren wird bei einem Entity mit dem FX von 16 das Backfaceculling nicht ein-, sondern ausgeschaltet (to cull = aussortieren; Backfaceculling = Dreiecke, die im Gegenuhrzeigersinn zur Kamera schauen, werden weggeschnitten/gecullt). Das spielt zwar noch keine Rolle, solange du in BB bist, aber wenn du mal direkt mit DX arbeitest und das Backfaceculling einschaltest, würdest du dich wundern, da DX dann genau andersrum reagieren würde Razz

Ansonsten ein relativ schönes Stück Code.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Jun 15, 2009 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den ausführlichen Kommentar.
Allerdings muss ich leider alle deine Kritikpunkte die sich auf die Performance beziehen zurück weisen, da du anscheinend das Zeichnen der Objekte mit Line vor dem Vergleich nicht ausgeschaltet hast.
Mit ist vollkommen bewusst, das Line langsam ist(ob nun gesperrter Buffer oder nicht) und die Funktion ist nur dabei, damit man auch sehen kann dass die Schatten wirklich so sind wie sie sein müssen.

Aber zum Rest:

Bei mir laufen mehrere Lichter ohne Probleme in Echtzeit, aber ich habe ja selber geschrieben, dass die Geschwindigkeit in diesem Falle fraglich ist.

Blau-Färbung der Schatten:
Ich denke, es ist selbstverständlich, dass ein im Schatten liegendes Objekt, dass mit einer blauen Lampe angeleuchtet wird blau erscheint. Du kannst den Code ja mal mit zwei weißen Lampen ausführen und wirst sehen, dass man alles sehen kann, was man sehen sollte.

Echtzeit-Tauglichkeit:
Ich weiß nicht, ob ich etwas übersehen habe, aber ich halte meinen Code für durchaus echtzeittauglich.
Wenn man kleinere Schattentexturen rendert und die anderen im ersten Post erwähnten Optimierungsmaßnahmen vornimmt, sollten sogar ohne Probleme zwei bis vier und auf starken Maschinen noch mehr Lichter möglich sein.
Für ein Spiel das mehr braucht ist B3D allerdings natürlich kaum zu gebrauchen.

RectsOverlap-Abfrage:
Ich habe leider keinen blassen Schimmer, was ich wo abfragen soll.

Ganze Objekte:
Habe überlegt, ob ich das mal probiere, bisher nicht geschehen. Wink
Kann mir allerdings kaum vorstellen, wo ich da noch Millisekunden herkriegen sollte, die Anzahl der Polys verändert sich ja nicht enorm(man sparrt im Schnitt nicht einmal die Hälfte), aber dafür kommen auf alle Fälle noch mehr Berechnungsschritte hinzu. Zudem können dann nur noch konvexe Objekte benutzt werden.
Danke übrigens für den Artikel, habe ihn nur kurz überflogen, aber er scheint einige sehr interessante Ansätze zu enthalten. Ich bezweifel, dass man davon alles mit BB vernünftig umsetzten kann und erst recht nicht ohne noch einen Haufen Mathe mit ins Spiel zu bringen, was das ganze weider langsamer machen würde, aber ich werde ihn bei Gelegenheit mal genauer durchgehen.

Backfaceculling:
Bla. Razz

So, ich glaube das war alles.
Nochmal danke und ich hoffe, ich hab keinen Blödsinn geschrieben. Wenn doch, dann berichtige man mich.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Ava

Gast

BeitragMo, Jun 15, 2009 22:40
Antworten mit Zitat
Ich würde sehr gern mal eine etwas geordnetere Szene mit zwei weissen, weiter von einander entfernten Lichtern sehen. Smile

Tankbuster

BeitragMo, Jun 15, 2009 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Extra für Ava:

user posted image
Twitter
Download Jewel Snake!
Windows|Android

Noobody

BeitragMo, Jun 15, 2009 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
aMul hat Folgendes geschrieben:
Allerdings muss ich leider alle deine Kritikpunkte die sich auf die Performance beziehen zurück weisen, da du anscheinend das Zeichnen der Objekte mit Line vor dem Vergleich nicht ausgeschaltet hast.

Habe ich sehr wohl, Debugger ist auch aus.

aMul hat Folgendes geschrieben:
Bei mir laufen mehrere Lichter ohne Probleme in Echtzeit, aber ich habe ja selber geschrieben, dass die Geschwindigkeit in diesem Falle fraglich ist.

Ich habe bei dem Code eine Rechenzeit von ca. 140ms, also alles andere als Echtzeit Wink

aMul hat Folgendes geschrieben:
Ich denke, es ist selbstverständlich, dass ein im Schatten liegendes Objekt, dass mit einer blauen Lampe angeleuchtet wird blau erscheint. Du kannst den Code ja mal mit zwei weißen Lampen ausführen und wirst sehen, dass man alles sehen kann, was man sehen sollte.

Mit zwei weissen Lichtern funktioniert es in der Tat perfekt. Im Beispiel hatte ich das wohl falsch ausprobiert, mein Fehler.

aMul hat Folgendes geschrieben:
Ich weiß nicht, ob ich etwas übersehen habe, aber ich halte meinen Code für durchaus echtzeittauglich.

Der Code mit den beiden Lichtern läuft, wie bereits gesagt, bei mir mit 140ms, der mit nur einem Licht mit 35ms. Dafür, dass hier Battlefield 2 komplett flüssig läuft, kann die Maschine aber nicht allzu schlecht sein - es besteht also noch Raum für Optimierung Wink

aMul hat Folgendes geschrieben:
Ich habe leider keinen blassen Schimmer, was ich wo abfragen soll.

Bevor du für eine Wand den Schatten einzeichnest, einfach Abfragen, ob die Wand überhaupt im Lichtradius liegt. Eine Spieleszene ist ja für gewöhnlich relativ gross und daher die wenigsten Wände im Lichtradius; damit kann man sehr viel rausholen.

aMul hat Folgendes geschrieben:
Kann mir allerdings kaum vorstellen, wo ich da noch Millisekunden herkriegen sollte, die Anzahl der Polys verändert sich ja nicht enorm, aber dafür kommen auf alle Fälle noch mehr Berechnungsschritte hinzu.

Ganz im Gegenteil - damit spart man sehr viele Polys. Der vordere Teil des Polygons wird nämlich komplett ausgelassen, wodurch man im Schnitt die Hälfte an Schattenpolys einsparen kann; ausserdem kann man die Berechnungen für die Vorderseite komplett weglassen. Das bringt auf meiner Maschine einen Geschwindigkeitsvorteil vom Faktor 5, wäre also noch eine Überlegung wert.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Jun 15, 2009 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Ava:
Code: [AUSKLAPPEN]
Const SCRW = 800
Const SCRH = 600

Graphics3D SCRW, SCRH, 32, 2

SeedRnd MilliSecs()

Local camera, shadow.TShadow, shadow2.TShadow, ms
camera = CreateCamera() ; creates camera to render shadows
CameraClsColor camera, 255, 255, 255

shadow = CreateShadow() ; initializes shadow
shadow\light\radius = 300 ; set light radius
;shadow\light\blu = 0 ; set light color to yellow

shadow2 = CreateShadow() ; initializes shadow
shadow2\light\radius = 300 ; set light radius
;shadow2\light\red = 0 ; set light color to blue
;shadow2\light\grn = 0

Local shadow1_tex, shadow2_tex, mesh, surface, v0, v1, v2, v3

shadow1_tex = CreateTexture(1024, 1024)
shadow2_tex = CreateTexture(1024, 1024)
TextureBlend shadow2_tex, 3

mesh = CreateMesh()
surface = CreateSurface(mesh)
PositionEntity mesh, - SCRW / 2 - 0.5, SCRH / 2 + 0.5, SCRW / 2
ScaleEntity mesh, 1, -1, 1
v0 = AddVertex(surface, 0, 0, 0)
v1 = AddVertex(surface, 0, 1024, 0)
v2 = AddVertex(surface, 1024, 1024, 0)
v3 = AddVertex(surface, 1024, 0, 0)
VertexTexCoords(surface, v0, 0, 0)
VertexTexCoords(surface, v1, 0, 1)
VertexTexCoords(surface, v2, 1, 1)
VertexTexCoords(surface, v3, 1, 0)
AddTriangle(surface, v0, v3, v2)
AddTriangle(surface, v0, v2, v1)

EntityFX mesh, 1 + 2
EntityBlend mesh, 2

EntityTexture mesh, shadow1_tex, 0, 0
EntityTexture mesh, shadow2_tex, 0, 1


;CreateRandomObjects() ; create some objects to cast shadows
CreateOrderedObjects(6, 20, 6, 6)

SetBuffer BackBuffer()

Local render2D = True

Repeat
   ms = MilliSecs()
   
   If MouseHit(2)
      render2D = 1 - render2D
   EndIf
   
   shadow\light\x = MouseX() ;set light position
   shadow\light\y = MouseY()
   DrawShadows(shadow) ; draw light and shadows
   RenderToTexture(shadow1_tex)
   ClearSurface shadow\surface
   
   shadow2\light\x = SCRW - MouseX();/ 2 + Cos(MilliSecs() / 20) * 100 ;set light position
   shadow2\light\y = SCRH - MouseY(); SCRH / 2 + Sin(MilliSecs() / 20) * 100
   DrawShadows(shadow2)
   RenderToTexture(shadow2_tex)
   ClearSurface shadow2\surface
   
   RenderWorld ; render
   
   If render2D
      DrawWalls() ; draw walls(slow!)
      Oval shadow\light\x - 5, shadow\light\y - 5, 10, 10, 0
      Oval shadow2\light\x - 5, shadow2\light\y - 5, 10, 10, 0
   EndIf
   
   Text 0, 0, MilliSecs() - ms
   Flip 0
   Delay 17 - MilliSecs() + ms
Until KeyHit(1)

End


Function CreateOrderedObjects(e = 4, r = 25, rows = 5, cols = 5)
   ; creates row * cols ordered objects
   Local j, x#, y#, wall.TWall, row, col
   For col = 1 To cols
      For row = 1 To rows
         x = (row-0.5) * SCRW / rows
         y = (col-0.5) * SCRH / cols
         For j = 1 To e
            CreateWall(x + Cos(j * 360 / e) * r, y + Sin(j * 360 / e) * r, x + Cos((j + 1) * 360 / e) * r, y + Sin((j + 1) * 360 / e) * r)
         Next
      Next
   Next
End Function

Function CreateRandomObjects(n = 50)
   ; creates n random light blocking objects
   Local i, j, x#, y#, a#, e, r#, wall.TWall
   For i = 1 To n
      x = Rnd(SCRW)
      y = Rnd(SCRH)
      a = Rnd(360)
      e = Rand(1, 4)
      e = (e = 1) * 3 + (e = 2) * 4 + (e = 3) * 6 + (e = 4) * 36
      r = Rnd(20, 50)
      For j = 1 To e
         CreateWall(x + Cos(a + j * 360 / e) * r, y + Sin(a + j * 360 / e) * r, x + Cos(a + (j + 1) * 360 / e) * r, y + Sin(a + (j + 1) * 360 / e) * r)
      Next
   Next
End Function

Function DrawWalls()
   ; draws walls
   ;! This function is very slow! Do not use for purposes other than testing or debugging!
   Local wall.TWall
   For wall = Each TWall
      Line wall\x1, wall\y1, wall\x2, wall\y2
   Next
End Function

Function RenderToTexture(texture)
   ; renders and than copies the backbuffer into the texturebuffer
   RenderWorld
   CopyRect 0, 0, SCRW, SCRH, 0, 0, BackBuffer(), TextureBuffer(texture)
End Function

;! ------------------------------------------------------------------------------- !;
;! ------------------------------- LIB STARTS HERE ------------------------------- !;
;! ------------------------------------------------------------------------------- !;


Type TWall
   ; a line that blocks light
   Field x1#
   Field y1#
   Field x2#
   Field y2#
End Type

Type TShadow
   ; a shadow object, needed to cast shadows
   Field mesh
   Field surface
   Field light.TLight
   Field red
   Field grn
   Field blu
End Type

Type TLight
   ; a light, needed to cast shadows
   Field x#
   Field y#
   Field radius#
   Field red
   Field grn
   Field blu
End Type

Function CreateWall.TWall(x1#, y1#, x2#, y2#)
   ; creates a TWall from (x1|y1) to (x2|y2)
   ; returns that TWall
   Local wall.TWall
   wall = New TWall
   wall\x1 = x1
   wall\y1 = y1
   wall\x2 = x2
   wall\y2 = y2
   Return wall
End Function

Function CreateShadow.TShadow(parent = 0, backfaceCulling = True, alignToCamera = True)
   ; creates a TShadow and TLight
   ; returns that TShadow
   ; parent: any entity or 0
   ; backfaceCulling: makes walls opaque from both sides
   ; alignToCamera: aligns shadows to the 2D coordinate system
   Local shadow.TShadow
   shadow = New TShadow
   shadow\mesh = CreateMesh(parent)
   shadow\surface = CreateSurface(shadow\mesh)
   EntityFX shadow\mesh, 1 + 2 + 16 * backfaceCulling
   ;EntityBlend shadow\mesh, 2
   shadow\light = New TLight
   shadow\light\radius = 100
   shadow\light\red = 255
   shadow\light\grn = 255
   shadow\light\blu = 255
   If alignToCamera
      AlignShadowMeshToCamera(shadow)
   EndIf
   Return shadow
End Function

Function AlignShadowMeshToCamera(shadow.TShadow, distance# = 100)
   ; aligns shadows to the 2D coordinate system
   ; shadow: TShadow to align
   ; distance: mesh and therefor triangle distance to the camera
   PositionEntity shadow\mesh, - distance / 2, distance / SCRW * SCRH / 2, distance / 2
   ScaleEntity shadow\mesh, distance / SCRW, - distance / SCRW, 1
End Function

Function DrawShadows(shadow.TShadow, drawLight = True, clear = True, LightDetail = 36)
   ; draws shadows
   ; shadow: TShadow to draw
   ; drawLight: draws light
   ; clear: clears previous shadows (highly recommended!)
   ; lightDetail: triangles used for light mesh
   Local x#, x2#, y#, y2#, wall.TWall
   Local v0, v1, v2, v3
   If clear
      ClearSurface(shadow\surface)
   EndIf
   If drawLight
      DrawShadowLight(shadow, LightDetail)
   EndIf
   For wall = Each TWall
      x = (wall\x1 - shadow\light\x) * 10000 + shadow\light\x
      y = (wall\y1 - shadow\light\y) * 10000 + shadow\light\y
      x2 = (wall\x2 - shadow\light\x) * 10000 + shadow\light\x
      y2 = (wall\y2 - shadow\light\y) * 10000 + shadow\light\y
      v0 = AddVertex(shadow\surface, wall\x1, wall\y1, 0)
      v1 = AddVertex(shadow\surface, wall\x2, wall\y2, 0)
      v2 = AddVertex(shadow\surface, x, y, 0)
      v3 = AddVertex(shadow\surface, x2, y2, 0)
      VertexColor(shadow\surface, v0, shadow\red, shadow\grn, shadow\blu)
      VertexColor(shadow\surface, v1, shadow\red, shadow\grn, shadow\blu)
      VertexColor(shadow\surface, v2, shadow\red, shadow\grn, shadow\blu)
      VertexColor(shadow\surface, v3, shadow\red, shadow\grn, shadow\blu)
      AddTriangle(shadow\surface, v0, v2, v3)
      AddTriangle(shadow\surface, v0, v3, v1)
   Next
End Function

Function DrawShadowLight(shadow.TShadow, detail)
   ; draws light
   ; shadow: shadow which light is to be drawn
   ; detail: triangles used for light mesh
   Local i, v0, v1, v2, v3, v4, v5, v6
   v0 = AddVertex(shadow\surface, shadow\light\x, shadow\light\y, 0)
   VertexColor(shadow\surface, v0, shadow\light\red, shadow\light\grn, shadow\light\blu)
   v1 = AddVertex(shadow\surface, shadow\light\x + shadow\light\radius, shadow\light\y, 0)
   VertexColor(shadow\surface, v1, shadow\red, shadow\grn, shadow\blu)
   v4 = AddVertex(shadow\surface, shadow\light\x + 1000000, shadow\light\y, 0)
   VertexColor(shadow\surface, v4, shadow\red, shadow\grn, shadow\blu)
   v2 = v1
   v5 = v4
   For i = 1 To detail - 1
      v3 = AddVertex(shadow\surface, shadow\light\x + Cos(i * 360 / detail) * shadow\light\radius, shadow\light\y + Sin(i * 10) * shadow\light\radius, 0)
      v6 = AddVertex(shadow\surface, shadow\light\x + Cos(i * 360 / detail) * 1000000, shadow\light\y + Sin(i * 10) * 1000000, 0)
      VertexColor(shadow\surface, v3, shadow\red, shadow\grn, shadow\blu)
      VertexColor(shadow\surface, v5, shadow\red, shadow\grn, shadow\blu)
      AddTriangle(shadow\surface, v0, v2, v3)
      AddTriangle(shadow\surface, v2, v5, v6)
      AddTriangle(shadow\surface, v2, v6, v3)
      v2 = v3
      v5 = v6
   Next
   AddTriangle(shadow\surface, v0, v2, v1)
   
   AddTriangle(shadow\surface, v2, v4, v1)
   AddTriangle(shadow\surface, v2, v6, v4)
End Function



@Noobody:
Ich habe gerade einen Tippfehler korrigiert, der den Code bis zu dreimal so langsam gemacht hat, wäre toll, wenn du nochmal ausprobieren könntest.
(Rot, damit es auch andere nicht übersehen, dass auch ja keiner die alte Version benutzt.)

Lichtradius:
Ah, das meinst du... Ähm, ja, stimmt vermutlich. Mr. Green
Hatte das sogar bei meiner experimentellen Version teilweise mit drin, aber irgendwie... naja, was soll's, danke.

Objekte:
Was du schreibst ist mir aufgefallen, als du wohl gerade geschrieben hast, hab versucht durchs editieren meine Aussage etwas zu entschärfen, aber wie dem auch sei, ich werde hier wohl wirklich noch mal schauen müssen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Ava

Gast

BeitragMo, Jun 15, 2009 23:09
Antworten mit Zitat
Danke @ Tankbuster Smile

user posted image

In diesem Bereich sieht man leider sehr gut, dass es mit dieser Methode + mehreren Lichtern nicht so wirklich gut klappt. Confused
Die Schatten einer Lichtquelle fallen in den Lichtbereich der anderen Lichtquelle hinein... dass ist genau das Problem, das ich bei früheren Versuchen auch immer hatte.

[EDIT] auch Danke @ aMul
Leider läuft mein staubiges Bliz3D unter Vista nicht mehr ... Confused

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Jun 15, 2009 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht, was du meinst Ava.
Meinst du, dass die Bereiche wo beide Lichter hin scheinen zu hell(/die wo nur eins hin scheint zu dunkel) sind?
Ich hoffe doch nicht, ansonsten müsste ich dir dringend empfehlen mal mit Taschenlampen und lichtundurchlässigen Objekten zu spielen. Razz
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver
 

Ava

Gast

BeitragMo, Jun 15, 2009 23:39
Antworten mit Zitat
Ne, das meine ich nicht. Smile
Das ist übrigens etwas, das bei mir noch fehlt: Lichter verstärken sich nicht gegenseitig.

Ich habe mal versucht, eine ähnliche Szene zu rekonstruieren. Bei mir schaut das dann so aus:
user posted image

Was ist realistischer? - ich kann es spontan gar nicht sagen, hm *fragendguck* ... mir persönlich hat das andere aber immer irgendwie nie so recht gefallen wollen ... Smile

BladeRunner

Moderator

BeitragMo, Jun 15, 2009 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke dass es durchaus realistisch ist dass Schatten in Lichtbereiche fallen, so wie bei amul der Fall. Ganz ohne wirkt es zu hart.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jun 16, 2009 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe immer noch keine Ahnung, was dein Problem ist, Ava. Mr. Green
Aber im Zweifelsfall stimm ich BladeRunner einfach mal zu, ich meine eigentlich alles berücksichtigt zu haben, was die Korrektheit von Licht und Schatten angeht.

Und da ich schon was poste, ich hab gerade mal ein bisschen mit Blümchen gespielt:
user posted image
Nichts großartiges, aber ich finde es sieht toll aus. Smile
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Lastmayday

BeitragDi, Jun 16, 2009 1:17
Antworten mit Zitat
Benutzer-Profile anzeigen
is ja irre... hm... das ganze erinnert mich an was, was ich vor längerer zeit geschrieben habe. und das ganze sogar ohne 3D! und den anderen schnickschnack der BB so extrem langsam macht...

renderzeit liegt bei meinem bei 40ms, wohin dagegen das andere nur 10 ms braucht.

ich habs mal angepasst:

Code: [AUSKLAPPEN]


Graphics 1024,768,32,2
SetBuffer BackBuffer()
Const starke = 200
Const starkem2 = starke*2

Global linecount=-1,lineoff=1
Dim fline(10000,4)
For x=0 To 10
   CreateRandomObjects(5)
Next

Dim cutmap(0,0)
Dim workloop((starkem2*starkem2)*2,1)

Dim lightmap(starkem2,starkem2)
For x=0 To starkem2
   For y=0 To starkem2
      If Sqr( (Float(starke) - Float(x)) ^ 2 + (Float(starke)  - Float(starke)) ^ 2) < starke Then
         rgb= Int(255-((Sqr( (Float(starke) - Float(x)) ^ 2 + (Float(starke)  - Float(y)) ^ 2) / starke) * 255))*$10000 + Int(255-((Sqr( (Float(starke) - Float(x)) ^ 2 + (Float(starke)  - Float(y)) ^ 2) / starke) * 255))*$100 + Int(255-((Sqr( (Float(starke) - Float(x)) ^ 2 + (Float(starke)  - Float(y)) ^ 2) / starke) * 255))
         lightmap(x,y)=rgb
      EndIf
   Next
Next

Repeat
   Cls
   start = MilliSecs()
   mx=MouseX()+starke
   my=MouseY()+starke
   If MouseHit(1) Then lineoff=1-lineoff
   
   Dim cutmap(starkem2,starkem2)
   LockBuffer BackBuffer()
   For xl = 0 To linecount
      If Sqr( (MouseX() - fline(xl,0)) ^ 2 + (MouseY() - fline(xl,1)) ^ 2) < starke*1.3 Then collect_info_likehell(starke,starke,mx-fline(xl,0),my-fline(xl,1),mx-fline(xl,2),my-fline(xl,3),starkem2,starkem2,starkem2)
      If lineoff Then Line(fline(xl,0),fline(xl,1),fline(xl,2),fline(xl,3))
   Next
   
   workloop(0,0)=mx-starke
   workloop(0,1)=my-starke
   pointX=workloop(0,0)
   pointY=workloop(0,1)
   maxID=0
   h=0
   go = False
   Repeat
      TX=(pointX-workloop(h,0))+starke
      TY=(pointY-workloop(h,1))+starke
      If TX > 1 And TX < starkem2-1 And TY > 1 And TY < starkem2-1 Then
         If cutmap(TX,TY) = 0  Then
            If workloop(h,0) > 0 And workloop(h,1)  > 0 And  workloop(h,0) < 1023 And workloop(h,1)  < 767 Then WritePixelFast workloop(h,0),workloop(h,1),lightmap(TX,TY)
            cutmap(TX,TY) = 1
            
            If cutmap(TX+1,TY) = 0 And lightmap(TX+1,TY) > 0 Then
               maxID=maxID+1
               workloop(maxID,0)=workloop(h,0)-1
               workloop(maxID,1)=workloop(h,1)
            EndIf
            
            If cutmap(TX-1,TY) = 0 And lightmap(TX-1,TY) > 0 Then
               maxID=maxID+1
               workloop(maxID,0)=workloop(h,0)+1
               workloop(maxID,1)=workloop(h,1)
            EndIf
            
            If cutmap(TX,TY+1) = 0 And lightmap(TX,TY+1) > 0 Then
               maxID=maxID+1
               workloop(maxID,0)=workloop(h,0)
               workloop(maxID,1)=workloop(h,1)-1
            EndIf
            
            If cutmap(TX,TY-1) = 0 And lightmap(TX,TY-1) > 0 Then
               maxID=maxID+1
               workloop(maxID,0)=workloop(h,0)
               workloop(maxID,1)=workloop(h,1)+1
            EndIf
            
         EndIf
      EndIf
      
      If maxID=h Then go = True
      h=h+1
   Until go
   
   UnlockBuffer BackBuffer()
   ende=MilliSecs() - start
   Text 1,1,ende
   Flip 0
   
Until KeyDown(1)
End


Function collect_info_likehell(lx#,ly#,v1x#,v1y#,v2x#,v2y#,range,max,may)
   
   Local winkelV1# = - (ATan2(lx# - v1x#, ly#  - v1y#) +90) Mod 360
   Local winkelV2# = - (ATan2(lx# - v2x#, ly#  - v2y#)+90) Mod 360
   Local winkelV1toV2# = - (ATan2(v1x# - v2x#, v1y#  - v2y#)+90) Mod 360
   
   Local entfernungV1#=Sqr( (lx# - v1x#) ^ 2 + (ly#  - v1y#) ^ 2)
   Local entfernungV2#=Sqr( (lx# - v2x#) ^ 2 + (ly#  - v2y#) ^ 2)
   Local entfernungV1toV2#=Sqr( (v1x# - v2x#) ^ 2 + (v1y#  - v2y#) ^ 2)
   
   
   Local V1ex# = lx# + Cos(winkelV1#) * entfernungV1#
   Local V1ey# = ly# + Sin(winkelV1#) * entfernungV1#
   For eV1#=entfernungV1# To (range*1.5) Step 1
      If V1ex# < max And V1ey# < may And V1ex# > 0 And V1ey# > 0 Then cutmap(Int(V1ex#),Int(V1ey#))=1
      V1ex# = V1ex# + Cos(winkelV1#) * 1
      V1ey# = V1ey# + Sin(winkelV1#) * 1
   Next
   
   Local V2ex# = lx# + Cos(winkelV2#) * entfernungV2#
   Local V2ey# = ly# + Sin(winkelV2#) * entfernungV2#
   For eV2#=entfernungV2# To (range*1.5) Step 1
      If V2ex# < max And V2ey# < may And V2ex# > 0 And V2ey# > 0 Then cutmap(Int(V2ex#),Int(V2ey#))=1
      V2ex# = V2ex# + Cos(winkelV2#) * 1
      V2ey# = V2ey# + Sin(winkelV2#) * 1
   Next
   
   Local V1toV2ex# = v1x#
   Local V1toV2ey# = v1y#
   For eV1toV2#=0 To entfernungV1toV2# Step 1
      If V1toV2ex# < max And V1toV2ey# < may And V1toV2ex# > 0 And V1toV2ey# > 0 Then cutmap(Int(V1toV2ex#),Int(V1toV2ey#))=1
      V1toV2ex# = V1toV2ex# + Cos(winkelV1toV2#) * 1
      V1toV2ey# = V1toV2ey# + Sin(winkelV1toV2#) * 1
   Next
   
End Function


Function add_lines(sx,sy,zx,zy)
   linecount=linecount+1
   fline(linecount,0)=sx
   fline(linecount,1)=sy
   fline(linecount,2)=zx
   fline(linecount,3)=zy
End Function

Function CreateRandomObjects(n = 50)
   ; creates n random light blocking objects
   Local i, j, x#, y#, a#, e, r#
   For i = 1 To n
      x = Rnd(1024)
      y = Rnd(768)
      a = Rnd(360)
      e = Rand(1, 4)
      e = (e = 1) * 3 + (e = 2) * 4 + (e = 3) * 6 + (e = 4) * 36
      r = Rnd(20, 50)
      For j = 1 To e
         add_lines(x + Cos(a + j * 360 / e) * r, y + Sin(a + j * 360 / e) * r, x + Cos(a + (j + 1) * 360 / e) * r, y + Sin(a + (j + 1) * 360 / e) * r)
      Next
   Next
End Function

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jun 16, 2009 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ein schöner(wenn auch undurchsichtiger) Code, Lastmayday.
Durch den Verzicht auf 3D wird das ganze natürlich deutlich langsamer, gerade bei größeren Lichtern.
Für die, die 3D-Beschleunigung allerdings den Krieg erklärt haben ist es evtl eine Alternative. Wink
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Noobody

BeitragDi, Jun 16, 2009 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, jetzt läuft es wirklich um einiges schneller Razz
Die Version mit einem Licht ist schon beinahe so schnell wie mein Code, das hätte ich nicht erwartet. Scheinbar gleichen die zusätzlichen Rechenschritte bei der im Artikel vorgeschlagenen Methode die wegfallenden Polys aus; allerdings ist deine Methode einfacher zu benutzen, weswegen ich sie wohl auch vorziehen würde, falls ich nochmal ein Schattensystem schreiben würde.

Die Version mit zwei Lichtern braucht leider immer noch 50ms, aber das könnte man sicher noch weiter verringern, wenn man die Textur verkleinert. Es wäre auch vorstellbar, in einem Spiel den Grossteil der Lichter im Vorraus oder beim Spielstart zu berechnen, so dass man statische Lightmaps erhält, die keine zusätzlichen Berechnungen während Laufzeit mehr benötigen. Viel mehr wird aber in Blitz nicht mehr rauszuholen sein - gute Arbeit Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

PSY

BeitragDi, Jun 16, 2009 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,

ein wenig offtopic:

die zeile hier fand ich ganz interessant, weil ich das in der form noch nicht gesehen hab:
Code: [AUSKLAPPEN]

e = (e = 1) * 3 + (e = 2) * 4 + (e = 3) * 6 + (e = 4) * 36


die zeile ersetzt doch eigentlich nur 4 If-abfragen ODER ne select case anweisung....und ist dabei 10-12% schneller (hab das mal grad bei 100000000 schleifendurchgängen getestet...

l8er,
psy
PSY LABS Games
Coders don't die, they just gosub without return

Xaymar

ehemals "Cgamer"

BeitragDi, Jun 16, 2009 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@Ava: Lichter können sich tatsächlich verstärken allerdings nicht so stark wie im code von aMul. Bei dir Ava, hören die Schatten einfach auf. Kann aber nicht. Leuchte mal einen gegenstand mit zwei lampen an. es ergibt zwei schatten:)

ansonsten ist es nett
Warbseite

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jun 16, 2009 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum können sie das nicht so stark, Cgamer?
Wenn man gewisse Sonderfälle vernachlässigt addieren sich die Helligkeiten mehrerer Lichter doch einfach...
(Was genau das ist, was ich der Grafikkarte befehle zu tun, aufgrund des beschränkten Farbraumes ist ab FF natürlich Schluss.)

@PSY:
Ja. Bitte. Razz
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Tankbuster

BeitragDi, Jun 16, 2009 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das echte Licht hat einfach weichere Ränder, und eine viel bessere Textur Very Happy
Außerdem wird es noch überall reflektiert, wodurch natürlich alles anders aussieht Wink
Twitter
Download Jewel Snake!
Windows|Android

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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group