Schatten
Übersicht

Gehe zu Seite Zurück 1, 2, 3 Weiter
![]() |
Plasma(alt)Betreff: man |
![]() Antworten mit Zitat ![]() |
---|---|---|
kann sehr wohl mit shadern schatten berechnen und darstellen | ||
DIV is dead ! |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
hört mal auf mit eurem shadderbla! ![]() 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 ![]() vorteile: ![]() nachteile: ![]() ![]() ![]() ![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() http://www.scherfgen-software....xcerpt.pdf |
||
B3D
MSVC++ DX9SDK |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() grüße |
||
http://bl4ckd0g.funpic.de |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: ![]() 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.... ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das kommt draufan wie du es machst. Wenn du das Shadowmesh einfach schwarz machst, dann nicht ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ 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
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group