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

Gehe zu Seite Zurück 1, 2, 3, 4 Weiter
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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! |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein schöner Code, aber da ich hier auch schon eine Schattenberechnung gemacht habe, kann ich mir ein paar Kritikpunkte nicht verkneifen ![]() 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 ![]() 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 ![]() 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 ![]() 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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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. ![]() 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 |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ich würde sehr gern mal eine etwas geordnetere Szene mit zwei weissen, weiter von einander entfernten Lichtern sehen. ![]() |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Extra für Ava:
|
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Danke @ Tankbuster ![]() In diesem Bereich sieht man leider sehr gut, dass es mit dieser Methode + mehreren Lichtern nicht so wirklich gut klappt. ![]() 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 ... ![]() |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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 |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Ne, das meine ich nicht. ![]() 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: 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 ... ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe immer noch keine Ahnung, was dein Problem ist, Ava. ![]() 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: ![]() Nichts großartiges, aber ich finde es sieht toll aus. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, jetzt läuft es wirklich um einiges schneller ![]() 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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das echte Licht hat einfach weichere Ränder, und eine viel bessere Textur ![]() Außerdem wird es noch überall reflektiert, wodurch natürlich alles anders aussieht ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
Gehe zu Seite Zurück 1, 2, 3, 4 Weiter
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group