Das Licht - und Schattenspiel [Frage zu Shadowmaps]
Übersicht

![]() |
eizdealerBetreff: Das Licht - und Schattenspiel [Frage zu Shadowmaps] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Wie manche von euch ja bereits wissen, arbeite ich ja gerade an einer 3D Strategie-Like Engine mit einem Meshterrain. So weit klappt auch alles gut. [ ein paar Screns: hier und hier. Bitte keine Kommentare in diesem Thread dazu, das dient nur zur Veranschaulichung - außerdem WIP! ] Aber: So langsam beschäftige ich mich mit dem Thema Schatten (physikalisch korrekt müsste es Licht heißen, ich weiß). Und deswegen wollte ich euch mal fragen, wie man das ganze angehen könnte. Noch ein Screen zur Veranschaulichung: ![]() Gegeben sind die Höhen der Vertexpunkte sowie der Einfallswinkel der Sonne. Jetzt soll aber nicht einfach getestet werden, ob ein "Sonnen" Entity eine Oberfläche sieht, denn dann gibt es nur schwarze und weiße Flächen, was ja auch irgendwie langweilig ist. Das ganze muss nicht physikalisch korrekt berechnet werden (um Gottes Willen!) sondern sollte nur einigermaßen gut aussehen. Geschwindigkeit ist auch kein Problem, denn das ganze wird immer vorberechnet. MFG eiz |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, stelle ich mir das for, dann hast du aber keine Palmen und ao als schatten.
If Inschicht then color 255,255,255/Ansichtswinkel (deltapitch und yaw) |
||
between angels and insects |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
[14:09] <eizdealer> https://www.blitzforum.de/viewtopic.php?p=572 <- wie hat der Jan das denn gemeitn?
[14:10] <@DarkCorner> eine sehr gute frage eiz .. o_O Meinst du vielleicht If EntityInView Surface Then Color = 255 / Winkel und dann eben das Triangle damit zeichnen. So habe ich mir das auch gedacht. Aber wenn jetzt ein Triangle hinter einem Berg versteckt ist und ein kleiner Teil von der imaginären Sonne "gesehen" wird, dann wird das ganze Triangle u.U. sehr hell... |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du alles als einzelne Meshs, mit Pick moden?
wenn ja, dann müsstest du die sonnen aus 5 Werten erstellen: SonneY-2, SonneY-1, SonneY, SonneY+1, SonneY+2, Aber, ich glaube du hast verstanden wie ich das meinte. (ich glaube viele mögen es nicht, wenn man aus dem chat Zitiert) |
||
between angels and insects |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe jetzt noch ein anderes Problem: Das Terrain besteht wie gesagt aus mehreren Meshes, also muss die Lightmap zerschnitten werden. Der Bilineare Filter (?!) versucht die Texturen beim Rendern aber hübsch kachelbar zu machen - da entsteht ein komischer Effekt (s. Screen). Kann man dagegen etwas machen?
![]() |
||
Gombolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Direct3D ruft bei jedem Mesh die Methode IDirect3DDevice::DrawPrimitive() auf. Deshalb verwendet er bei jedem Mesh den Filter. Was dann auch zu diesem Effekt führt. Du müsstest die Pixel am Rand von einem Mesh an den Rand der Nachbarmesh kopieren damit alle an den Rändern die selben Pixel verwenden. ![]() Wie man das mit B3D macht? Keine Ahnung. Ich habe sowas immer mit C gemacht. Kenn mich also mit B3D nicht so gut aus. |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich hoffe du hast nicht für jeden dreick einen mesch gemacht - sonst bin ich schwer enttäuscht | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Selbstverständlich nicht!
Schau auf meine Zeichnung ganz oben - alles was man da sieht, steckt in einem mesh. Und die Engine besteht aus mehreren solchen Meshes. Auf dem Screen sieht man das sehr gut - ein Mesh endet dort, wo dieser hässliche Effekt entsteht. Hat keiner eine Idee, wie man das vermeiden könnte? Also ich mein etwas konkreter *g* |
||
![]() |
Arcanes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also die Screens sehen schon mal sehr reizend aus!! Freu mich schon drauf, was daraus wohl noch werden wird, ich liebe Strategiespiele!! ![]() Weiterhelfen kann ich Dir leider nicht, da ich mich selbst noch nie so sehr damit beshäftig habe. Würd mich aber auch über ein Paar Lösungsvorschläge freuen, da ich mich sicher irgendwann mal wieder selbst an soetwas versuchen werde! 8) |
||
tHey pUt mE iN a rOuNd rOom tO diE
User posted image http://www.myownmalice.de.vu |
![]() |
hamZtaAdministratorBetreff: hm |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich versteh nich ganz, warum du meshes nimmst und nich einfach ein terrain lädst?
oder versteh ich da was falsch? |
||
Blog. |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der eigentliche Grund, warum ich mir überhaupt so viel Arbeit gemacht hab ein Meshterrain zu erstellen, war, dass ich mehrere Texturen nebeneinander und unabhängig voneinander haben kann. Mit einem normalen Terrain geht das eigentlich nur mit einer Detailtextur und einer Colormap, was mir aber nicht so gut gefällt. | ||
![]() |
hamZtaAdministratorBetreff: hm |
![]() Antworten mit Zitat ![]() |
---|---|---|
und da sinkt dein speed überhaupt nich? was ich so auf den screens sehe hast du 190 fps oder so....
wenn ich terrain mach, texturier, kamera von oben draufschaun lass, dann hab ich nurmehr 43 fps... |
||
Blog. |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hängt natürlich auch von deinem PC ab und vor allem von der Größe des Terrains.
Bei mir hab ich das so gemacht: Immer wenn sich die Kamera bewegt, wird diese Funktion aufgerufen: Code: [AUSKLAPPEN] Function EntityHide()
For X=0 To (LevelSize-1)/4 For Y=0 To (LevelSize-1)/4 HideEntity Terrain(X,Y) If EntityInView(terrain(x,y),camera) Then ShowEntity terrain(x,y) Next Next End Function Damit kann ich relativ große Maps machen. Aber beachte, dass dein Terrain aus mehreren Meshes bestehten muss, die nicht zu groß sind! Das ist natürlich absolut unoptimiert und soll nur der Veranschaulichung dienen. |
||
![]() |
hamZtaAdministratorBetreff: hm |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich glaub ich sollte auch auf meshes umsteigen ![]() das wird aber kompliziert |
||
Blog. |
![]() |
Arcanes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Eizdealer!
Dein Projekt hat mich sehr dazu animiert, mir auch wieder um dieses Thema Gedanken zu machen, und so habe ich mir gestern Nacht noch eine kleine 3D-TileEngine zusammengebastelt! ![]() LoadTexture "myTexture.bmp", 16 + 32 Mit diesen Flags bekommst Du die unschönen Texturübergänge weg!! 8) (war zumindest bei mir so, hehe) mFG + Arca + |
||
tHey pUt mE iN a rOuNd rOom tO diE
User posted image http://www.myownmalice.de.vu |
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
In der Tat, es funktioniert!
Mann echt vielen dank, du bist mein Retter ![]() Wenn du mir jetzt noch einen Denkanstoß gibst, wie ich das mit der Schattenberechnung machen könnte, dann darfst du dir alles von mir wünschen was du willst ![]() |
||
darkshadow |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
eizdealer: Wie meinst du das mit Denkanstoß für die Schattenberechnung?? Du hast doch eine Routine dazu. | ||
![]() |
eizdealer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt, hab ich. Aber die Routine berechnet die Schatten von Objekten auf dem Untergrund und nicht den Schatten vom Untergrund selber. Außerdem ist das ganze "zu scharf". Aber sonst gut *g* | ||
![]() |
Arcanes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für die Lichtverhältnisse am Untergrund habe ich von jedem Vertex aus eine imaginäre Linie zu jeder vorhandenen Lichtquelle gezogen, und dann die Entfernung mit LightRange, LightIntensity und LightColor (den Eigenschaften meiner eigenen Lichtquellen) verrechnet. Die Ergebnisse habe ich an VertexColor übergeben. Wenn Du es vernünftig codest, dann läuft das auch locker Echtzeit... (das ändert sich jedoch leider, sobald Du noch eine EntityVisible() Routine mit einbeziehst!)
Oder hast Du etwas anderes gemeint mit Deiner Frage? |
||
tHey pUt mE iN a rOuNd rOom tO diE
User posted image http://www.myownmalice.de.vu |
darkshadow |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn das mit der Routine von dir geht, dann geht das sicherlich auch mit dem Terrain. Du musst doch einfach nur dein eigenes Terrain in den Pickmode setzen, oder irre ich mich da gerade? | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group