Bäume falsch rum eingezeichnet

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

blitzuser34

Betreff: Bäume falsch rum eingezeichnet

BeitragSa, Feb 07, 2009 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich wollte mal Single Surface Trees erstellen. Folgender Code:

Code: [AUSKLAPPEN]
baumbrush=LoadBrush("Media\Baum.png",2)
Baeume=CreateMesh()
BSurface=CreateSurface(baeume,baumbrush)
For baumnummer=0 To 4999
   .baumunterwasser
   baumx#=Rnd(0,511)
   baumz#=Rnd(0,511)

   Y#=TerrainY(terrain,baumx#,Y#,baumz#)
   If Y#<40 Then Goto baumunterwasser

   v1=AddVertex(BSurface,baumx#-2,Y#,baumz,0,0)
   v2=AddVertex(BSurface,baumx#-2,Y#+4,baumz,0,-1)
   v3=AddVertex(BSurface,baumx#+2,Y#,baumz,-1,0)
   v4=AddVertex(BSurface,baumx#+2,Y#+4,baumz,-1,-1)

   tr1=AddTriangle(BSurface,v1,v2,v3)
   tr2=AddTriangle(BSurface,v2,v3,v4)
   
   v5=AddVertex(BSurface,baumx#,Y#,baumz-2,0,0)
   v6=AddVertex(BSurface,baumx#,Y#+4,baumz-2,0,-1)
   v7=AddVertex(BSurface,baumx#,Y#,baumz+2,-1,0)
   v8=AddVertex(BSurface,baumx#,Y#+4,baumz+2,-1,-1)

   tr3=AddTriangle(BSurface,v5,v6,v7)
   tr4=AddTriangle(BSurface,v6,v7,v8)
Next
EntityFX baeume,16


Nur blöderweiße werden die nahen Bäume vor den entfernten Bäumen gezeichnet. So sehe ich also einen kleinen Baum vor einem großen. Bei Masked ist das jedoch nicht so.

user posted image

aMul

Sieger des Minimalist Compo 01/13

BeitragSa, Feb 07, 2009 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau das gleiche wird gerade im Thread nebenan besprochen.

Der Grund ist, dass DX7 bei der Verwendung von Alpha den Z-Buffer nicht beachtet.

Die Lösung ist, wie du selbst erkannt hast, den Masked-Modus zu benutzen oder die Bäume in der Reihenfolge zu erstellen wie sie gezeichnet werden sollten, was natürlich sehr aufwändig ist, wenn man sich bewegen möchte, da ständig geupdated werden muss.

Ich empfehle deshalb erstere Variante(mit guten Texturen ist es auch hier kein Problem gut aussehende Blätter hinzubekommen. Man sehe sich kommerzielle Spiele an).
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

NightPhoenix

BeitragSa, Feb 07, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit das keiner falsch versteht, auch wenn mein Post hier eher unnötig ist: Das ist in DX9 auch so. Ich wollt nur nicht, das schonwieder jeder denkt DX7 ist schuld und böse.
Speedtree verwendet ebenso Flag4, statt Flag2, Flag4 ist auch schneller, weil die Graka keine "halbtransparenzen" berechnen muss, sondern nur volltransparent, oder untransparent.
MfG.

*edit*
Oh ach übrigens kannst du bei SingleSurface kein Flag2 benutzen, weil dann zwangsweise solche fehler auftreten Wink Würdest du jedes Objekt mit Flag2 einzeln mit anderen meshkoordinaten rendern gäbe es auch keine z-buffer fehler. SingleSurface, außer Particle Engines also gründsätzlich mit Flag4

Noobody

BeitragSa, Feb 07, 2009 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt nicht mal an DirectX, sondern einfach daran, wie ein 3D - Engine aufgebaut ist.
Man könnte das Problem schon vermeiden, wenn man alle transparenten Triangles von hinten nach vorne durchsortiert, aber wie man das in Echtzeit schaffen will, hat leider noch niemand rausgefunden Razz
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

blitzuser34

Betreff: Terrain Problem

BeitragMi, März 18, 2009 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich krustel den Thread noch mal raus weil ich ein Prob habe:

user posted image

Wie man sieht wird das Terrain von Richtung Norden bis Osten nicht richtig eingezeichnet.
Das Terrain habe ich mit CreateMesh, CreateSurface, CreateVertex und CreateTriangle erstellt.
Es sind insgesammt 4 übereinander vorhanden. Im Screenshot sind jedoch alle bis auf eine Alpha 0.

Muss ich des jetzt sortieren? Wenn ja, wie? Oder wie soll ich ein Terrainsystem aufbauen damit das nicht passiert?

Blitzuser34

Megamag

BeitragMi, März 18, 2009 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Würde Heighmap nicht auch gehen?

blitzuser34

BeitragMi, März 18, 2009 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich bin ja wegen der Texturierung umgestiegen:

user posted image

Zu sehen ist weiterhin das Problem. Ach ja: ich hab einen Timer drin!!

Holzchopf

Meisterpacker

BeitragMi, März 18, 2009 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Lädst du die Texturen mit Alphaflag 2?
Dies führt nämlich zu z-Buffer-Problemen.

Vielleicht sind ja teiltransparente Texturen in dienem Fall gar nicht notwendig oder evtl kannst du gewisse transparente Stellen erreichen, indem du einfach den entsprechenden Vertices alpha verpasst.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

blitzuser34

BeitragMi, März 18, 2009 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

das Problem ist gelöst. Man muss auf das untere Terrain nur EntityFX 2 anwenden.

Hier ein funktionierender BeispielCode:

Code: [AUSKLAPPEN]
;----------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------
;
;FearCry Editor 2
;
;----------------------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------

Const editorname$="FearCry Editor 2";Konstanter Name setzen

Graphics3D 1440,900,32,1;Fenster erstellen
SetBuffer BackBuffer();Backbuffer setzen
AppTitle editorname$;Fenstertitel setzen
HidePointer;Windowszeiger verstecken

Include "DevilGui.bb";DevilGui laden
GUI_InitGUI("Skins\WinVista.skin");Gui initialisieren

Global camera1=CreateCamera();Kamera für das Spiel erstellen
CameraRange camera1,0.5,200;Kamerasichtweise einstellen
CameraFogMode camera1,0;CameraFog einstellen
MoveEntity camera1,0,2,0;Kamera an Startposition setzen

AmbientLight 255,255,255;Grundlicht setzen

Global brush1=LoadBrush("Texturen\Gras_braun.jpg");Brush 1 laden
Global brush2=LoadBrush("Texturen\Gras_grün.jpg");Brush 2 laden
Global brush3=LoadBrush("Texturen\Sand.jpg");Brush 3 laden
Global brush4=LoadBrush("Texturen\Fels.jpg");Brush 4 laden

Global terrain1=CreateMesh();Terrain 1 Mesh erstellen
Global terrain2=CreateMesh();Terrain 2 Mesh erstellen
Global terrain3=CreateMesh();Terrain 3 Mesh erstellen
Global terrain4=CreateMesh();Terrain 4 Mesh erstellen

EntityFX terrain1,2;Effekte für Terrain 1 setzen
EntityFX terrain2,2+32;Effekte für Terrain 2 setzen
EntityFX terrain3,2+32;Effekte für Terrain 3 setzen
EntityFX terrain4,2+32;Effekte für Terrain 4 setzen

Global terrainsurface1=CreateSurface(Terrain1,brush1);Surface 1 erstellen
Global terrainsurface2=CreateSurface(Terrain2,brush2);Surface 2 erstellen
Global terrainsurface3=CreateSurface(Terrain3,brush3);Surface 3 erstellen
Global terrainsurface4=CreateSurface(Terrain4,brush4);Surface 4 erstellen

Dim terrain1vertex(127,127);Dim für vertex des 1. Terrains erstellen
Dim terrain2vertex(127,127);Dim für vertex des 2. Terrains erstellen
Dim terrain3vertex(127,127);Dim für vertex des 3. Terrains erstellen
Dim terrain4vertex(127,127);Dim für vertex des 4. Terrains erstellen

Dim terrain1triangle(126,126,1);Dim für die Triangles des 1. Terrains erstellen
Dim terrain2triangle(126,126,1);Dim für die Triangles des 2. Terrains erstellen
Dim terrain3triangle(126,126,1);Dim für die Triangles des 3. Terrains erstellen
Dim terrain4triangle(126,126,1);Dim für die Triangles des 4. Terrains erstellen

For X=0 To 127
   For Z=0 To 127
      terrain1vertex(X,Z)=AddVertex(terrainsurface1,X,0,Z,X,Z);Vertexpunkte für Terrain 1 erstellen
      terrain2vertex(X,Z)=AddVertex(terrainsurface2,X,0,Z,X,Z);Vertexpunkte für Terrain 2 erstellen
      terrain3vertex(X,Z)=AddVertex(terrainsurface3,X,0,Z,X,Z);Vertexpunkte für Terrain 3 erstellen
      terrain4vertex(X,Z)=AddVertex(terrainsurface4,X,0,Z,X,Z);Vertexpunkte für Terrain 4 erstellen
      
      VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen
      VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen
      VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen
   Next
Next

For X=0 To 126
   For Z=0 To 126
      terrain1triangle(X,Z,0)=AddTriangle(terrainsurface1,terrain1vertex(X,Z),terrain1vertex(X,Z+1),terrain1vertex(X+1,Z));Triangle 1 für Terrain 1 erstellen
      terrain1triangle(X,Z,1)=AddTriangle(terrainsurface1,terrain1vertex(X,Z+1),terrain1vertex(X+1,Z+1),terrain1vertex(X+1,Z));Triangle 2 für Terrain 1 erstellen
      terrain2triangle(X,Z,0)=AddTriangle(terrainsurface2,terrain2vertex(X,Z),terrain2vertex(X,Z+1),terrain2vertex(X+1,Z));Triangle 1 für Terrain 2 erstellen
      terrain2triangle(X,Z,1)=AddTriangle(terrainsurface2,terrain2vertex(X,Z+1),terrain2vertex(X+1,Z+1),terrain2vertex(X+1,Z));Triangle 2 für Terrain 2 erstellen
      terrain3triangle(X,Z,0)=AddTriangle(terrainsurface3,terrain3vertex(X,Z),terrain3vertex(X,Z+1),terrain3vertex(X+1,Z));Triangle 1 für Terrain 3 erstellen
      terrain3triangle(X,Z,1)=AddTriangle(terrainsurface3,terrain3vertex(X,Z+1),terrain3vertex(X+1,Z+1),terrain3vertex(X+1,Z));Triangle 2 für Terrain 3 erstellen
      terrain4triangle(X,Z,0)=AddTriangle(terrainsurface4,terrain4vertex(X,Z),terrain4vertex(X,Z+1),terrain4vertex(X+1,Z));Triangle 1 für Terrain 4 erstellen
      terrain4triangle(X,Z,1)=AddTriangle(terrainsurface4,terrain4vertex(X,Z+1),terrain4vertex(X+1,Z+1),terrain4vertex(X+1,Z));Triangle 2 für Terrain 4 erstellen
   Next
Next

PositionEntity terrain1,0,.000,0;Positionieren des ersten Terrains
PositionEntity terrain2,0,.002,0;Positionieren des zweiten Terrains
PositionEntity terrain3,0,.004,0;Positionieren des dritten Terrains
PositionEntity terrain4,0,.006,0;Positionieren des vierten Terrains

UpdateNormals terrain1;Normalen neu berechnen für Terrain 1
UpdateNormals terrain2;Normalen neu berechnen für Terrain 2
UpdateNormals terrain3;Normalen neu berechnen für Terrain 3
UpdateNormals terrain4;Normalen neu berechnen für Terrain 4

Global key_escape_hit;Keyhit Variable für Escape Taste

Global key_w_down;Keydown Variable für w Taste
Global key_a_down;Keydown Variable für a Taste
Global key_s_down;Keydown Variable für s Taste
Global key_d_down;Keydown Variable für d Taste

Global key_grosstelltaste_down;Variable für die Großtaste

Global mouse_2_hit;Mousehit für Taste 2
Global mouse_2_down;Mousedown für Taste 2

Global MausX;Variable für Maus X Koordinate
Global MausY;Variable für Maus Y Koordinate

Global firstmillisecs;Variable für die frameunabhängige Programmierung
Global secondmillisecs;Variable für die frameunabhängige Programmierung
Global schleifenzeit;Variable für die frameunabhängige Programmierung

Global mouseXsaved;X-Koordinate für Rechtsklick
Global MouseYsaved;Y-Koordinate für Rechtsklick
Global Umsichtsmodus;Modusvariable
Global movespeed#;Variable für Bewegungsgeschwindigkeit

;----------------------------------------------------------------------------------------------------------------

For X=0 To 127
   For Z=0 To 127
      TextureStaticTerrain(X,Z,Rand(1,4))
      ModifyStaticTerrain(X,Z,Rand(0,5))
   Next
Next

Repeat;Anfang der Hauptschleife
   
   firstmillisecs=MilliSecs();Millisekunden messen
   
   key_escape_hit=KeyHit(1);Escape Taste abrufen
   key_w_down=KeyDown(17);W Taste abrufen
   key_a_down=KeyDown(30);A Taste abrufen
   key_s_down=KeyDown(31);S Taste abrufen
   key_d_down=KeyDown(32);D Taste abrufen
   key_grosstelltaste_down=KeyDown(42);Großstelltaste
   
   mouse_2_hit=MouseHit(2);Maus Taste 2 abrufen
   mouse_2_down=MouseDown(2);Maus Taste 2 abrufen
   
   MausX=MouseX();Maus X Koordinate abrufen
   MausY=MouseY();Maus Y Koordinate abrufen
   
   movespeed#=0.002;Normale Geschwindigkeit setzen
   If key_grosstelltaste_down=1 Then movespeed#=movespeed#*5;Wenn Beschleunigen Taste dann schneller
   If key_w_down=1 Then MoveEntity camera1,0,0,movespeed#*schleifenzeit;Kamera nach vorne bewegen
   If key_s_down=1 Then MoveEntity camera1,0,0,-movespeed#*schleifenzeit;Kamera nach hinten bewegen
   If key_a_down=1 Then MoveEntity camera1,-movespeed#*schleifenzeit,0,0;Kamera nach links bewegen
   If key_d_down=1 Then MoveEntity camera1,movespeed#*schleifenzeit,0,0;Kamera nach rechts bewegen
   
   If Umsichtsmodus=1 Then;Wenn man sich umsieht
      TurnEntity camera1,(MausY-mouseYsaved)*0.5,-(MausX-mouseXsaved)*0.5,0;Maus drehen
      RotateEntity camera1,EntityPitch(camera1),EntityYaw(camera1),0;Z-Achse auf 0 setzen
      MoveMouse mouseXsaved,MouseYsaved;Maus an Koordinate schieben
      If mouse_2_down=0 Then Umsichtsmodus=0;Wenn wieder losgelassen umschalten
   EndIf;Ende der Überprüfung
   
   If mouse_2_hit=1 Then;Wenn Rechtsklick dann in Umsichtsmodus umschalten
      mouseXsaved=MausX;X-Koordinate speichern
      MouseYsaved=MausY;Y-Koordinate speichern
      Umsichtsmodus=1;Modus umschalten
   EndIf;Ende der Überprüfung
      
   UpdateWorld;Kollision updaten
   RenderWorld;Welt rendern
   
   If key_escape_hit=1 Then;Wenn Escapetaste gedrückt wird
      askforendmessage=GUI_MsgBox("Beenden?","Wollen sie "+editorname$+" wirklich beenden?",2);Fragen ob Editor verlassen werden soll
      If askforendmessage=1 Then Exit;Wenn mit Ja bestätigt den Editor verlassen
   EndIf;Ende der Überprüfung
   
   GUI_UpdateGUI();Gui updaten und zeichnen
   
   Flip 0;Bild auf den Bildschirm setzen aber nicht auf ihn warten, damit die FPS Zahl nicht durch den Monitor bestimmt wird
   
   secondmillisecs=MilliSecs();Millisekunden messen
   schleifenzeit=secondmillisecs-firstmillisecs;Schleifenzeit ausrechnen
   
Forever;Ende der Hauptschleife

;----------------------------------------------------------------------------------------------------------------

ClearWorld;Komplette 3D-Szene entfernen
End;Programm beenden

;----------------------------------------------------------------------------------------------------------------

;Funktion zum Ändern der Höhe
Function ModifyStaticTerrain(X,Z,High#)
   If X>=0 And X<=127 And Z>=0 And Z<=127 Then;Überprüfen ob im richtigen Bereich
      VertexCoords terrainsurface1,Terrain1Vertex(X,Z),X,High#,Z;Terrain 1 modifizieren
      VertexCoords terrainsurface2,Terrain2Vertex(X,Z),X,High#,Z;Terrain 2 modifizieren
      VertexCoords terrainsurface3,Terrain3Vertex(X,Z),X,High#,Z;Terrain 3 modifizieren
      VertexCoords terrainsurface4,Terrain4Vertex(X,Z),X,High#,Z;Terrain 4 modifizieren
      
      VertexNormal terrainsurface1,Terrain1Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 1
      VertexNormal terrainsurface2,Terrain2Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 2
      VertexNormal terrainsurface3,Terrain3Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 3
      VertexNormal terrainsurface4,Terrain4Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 4
   EndIf
End Function

;Funktion zum Texturieren des Terrains
Function TextureStaticTerrain(X,Z,Layer)
   If X>=0 And X<=127 And Z>=0 And Z<=127 Then;Überprüfen ob im richtigen Bereich
      Select Layer;Passendes Terrain auswählen
         Case 1;Wenn Terrain 1
            VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen
            VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen
            VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen
         Case 2;Wenn Terrain 2
            VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,1;Alphawerte für Terrain 2 setzen
            VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen
            VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen
         Case 3;Wenn Terrain 3
            VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen
            VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,1;Alphawerte für Terrain 3 setzen
            VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen
         Case 4;Wenn Terrain 4
            VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen
            VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen
            VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,1;Alphawerte für Terrain 4 setzen
      End Select
   EndIf
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group