Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 00:32

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2003 16:08 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

WARNUNG,
ich komme heute mit vielen vielen fragen, dies wird ein ellenlanger thread ich weisses jetzt schon :P.
Also los gehts:

Ich will ne richtige brauchbare !EINFACHE! 3D Engine unter OpenGL schreiben.
Das problem ist aber, ich hab bestimmt schon 30x versucht ne engine zu bauen.
Am Ende scheitert es aber immer an der Struktur, weil ich dann irgendie total alles umcoden muss und dann wäre es einfacher komplett wieder von vorne anzufangen.

Ich will nun von anfang an wissen, wie sollte man am besten anfangen.
Delphi + OpenGL Kenntnisse hab ich, OGL nicht so ausgeprägt wie Delphi, aber es sollte reichen, die ganzen Tuts auf DGL hab ich alle durch, bis auf das Script tutorial das war mir doch ein wenig zu hoch oder irgendwie noch keine lust gehabt dafür. Schatten, Reflektion, Planar mapping, Lightmapping kapier ich alles, das ganze hatte ich ja auch schon in nem editor versucht einzubauen, wie gesagt VERSUCHT.

Jetzt mal eine Struktur die ich mir vorstelle:

***************************************************************************

zur info:
Man sollte auch einen übersichtlichen guten programmierstil bewahren:::
also wenn man nen Type record macht, dann:

Code:
  1.  
  2. type
  3.   TRFace = record
  4.   end;
  5.  


Also T = Type und R für Record...

Code:
  1.  
  2. type
  3.   TCOpenGLRenderer = class(TObject)
  4.   end;
  5.  

usw

Constanten, Globale Variablen, Variablen die in einer Klasse sind sollte man auch gut beschriften like:

Code:
  1.  
  2. const
  3.   cDefaultColorBits = 32;
  4.   cDefaultDepthBits = 24;
  5.   cDefaultFov = 90;
  6.  
  7. var
  8.   gProtocol : TStrings; // g, weil es eine Globale Variable ist.
  9.  
  10. type
  11.   TCOpenGLRenderer = class(TObject)
  12.   private
  13.     fHandle       : HWND;
  14.     fClientWidth,
  15.     fClientHeight : Integer; // f weil es in einer klasse ist... warum f... hmm.. nix besseres eingefallen;D
  16.   public
  17.     // Jede Variable wird mit einem _ begonnen, damit weiss man das ist ein Parameter
  18.     constructor Create(_Handle : HWND; _ClientWidth, _ClientHeight : Integer); override;
  19.     destructor Destroy;
  20.   published
  21.   protected
  22.   end;
  23.  
  24. implementation
  25.  
  26. var
  27.   iNumRenderers : Integer; // i wegen implentation, ist zwar auch global aber nur für diese unit.
  28.  
  29. constructor TCOpenGLRenderer.Create(_Handle : HWND; _ClientWidth, _ClientHeight : Integer); override;
  30. begin
  31.   inherited Create(_Handle, _ClientWidth, _ClientHeight);
  32.   
  33.   
  34.   fHandle := _Handle;
  35.   fClientWidth := _ClientWidth;
  36.   fClientHeight := _ClientHeight;
  37. end;
  38.  
  39. destructor TCOpenGLRenderer.Destroy;
  40. begin
  41.   inherited Destroy;
  42. end;
  43.  
  44. initialization
  45.   gProtocol := TStringList.Create;
  46.  
  47. finalization
  48.   gProtocol.SaveToFile('.\protocol.txt');
  49.   gProtocol.Free;
  50.  
  51.  


ich finde das sehr übersichtlich und man weiss dann ganz schnell um welchen
typ es sich handelt und für class, aber damit jeder den code gut verstehen kann find ich das schon wichtig.

***************************************************************************

weiter gehts mit der struktur:

// Hier stehen alle Konstanten sachen drin wie versionssnummer, variablentypen aus OGL, farbtypen usw.
engine_types.pas

was könnte da rein:
TVector
TColor
TVertex
TFace
TPolygon
TPlane
TMatrix
TTexcoord

kurzes beispiel:
Code:
  1.  
  2.   const
  3.     cDefaultFov = 45;
  4.     cDefaultNearClipping = 0.1;
  5.     cDefaultFarClipping = 1000.0;
  6.  
  7.   type
  8.     PFLoat = ^TFloat;
  9.     TFloat = Single;
  10.  


Das problem ist aber, das es später wenn wir viele solche Klassen haben, dann alles
unübersichtlich wird, deswegen sollte man jeden eigenen typ in ne eigene datei speichern.

wie ist es aber nun, muss TVector ne Klasse werden ? Ne Klasse wäre unsinnig, da diese immer
wieder initialisiert werden muss, also nehmen wir anstatt class nen object.
Da dieses Object viele proceduren braucht, würde ich sagen... ne eigene datei wäre sinnvoll.
engine_vector.pas. <- da soll dann wirklich nur der vector drin sein... oder könnte man da noch was reinmachen.

und so gehts weiter halt, ich könnte jetzt jede typ erläutern, aber ich will heut au noch heim ne ?



So hab ich bis jetzt immer angefangen meine engine zu mache, alles codemässig gut strukturiert aber
so gut wie nix geplant, was überhaupt in die engine rein muss.
Das sollte man eigentlich vorher machen, aber ich denke ich bin nicht der einzigste der einfach drauf los proggt.
Was natürlich total der fehler ist :(

Also was bringt uns dieser code oben, wenn nix geplant wurde... nix, also sollte man sich erstmal ne planung überlegen:

itsch, ni, san, go:

- Eine Types Unit mit kleintypen und konstanten

- Eine OpenGLRenderer mit Initialisierung von mehreren Rendernkontexten, unabhängig ob Panel oder Form,
berechnungen für Timebased movement, FPS usw sollten auch drin sein.

- Eine Vector Unit mit funktionen zum addieren, subtrahieren, multiplizieren, dividieren
von Vectoren und mehr (dotproduct, length, crossproduct, invert, interpolate usw)

- Eine Texture Unit mit funktionen um Texturen des typs BMP, JPG, TGA zu laden und zu über glBindTexture zu benutzen.
Darin sollte auch eine Texture Listen klassen sein, damit man texturen dynamisch verwalten kann.

- Eine Matheunit in den alle wichtigen Funktionen zum berechnen der wichtigesten dinge drin sind.
Ich finds nicht gut, z.b. die geometry.pas von Mike Lischke zu nehmen, weil 1. sie ist in assembler (das verstehen nich viele leute)
und 2. ist diese total riesig und man muss dann die type strukturen von mike nehmen.

- Eine World Unit, wo Leveldaten gerendert und berechnet wird.
Meiner meinung nach das komplexeste an einer engine.

- Eine Physics Unit, wo Berechnungen drin sind, z.b. Ego-Shooter bewegung (Nehe Style).
Kollionsberechnung ??? Gehört diese da rein ?

- Eine Light Unit, tja... jetzt kommt das problem, light units was soll da rein ???
Radiosity berechnung, diese könnte man ja auch in der world unit machen, TCLight ? TOLight ? TRLight ?

- Eine Sound Unit, für sound halt... ist das einfachste überhaupt an ner engine.

- Eine Steuerungs Unit, Steuerung halt, GetKeyAsyncState ? Oh man, einfacher gehts wirklich nicht.

- Eine Netzwerk Unit, das ist schon kompilizierter, was darein soll... weiss ich selbst nicht.



So, das ist mal ne struktur wie ichs mir vorstelle.
Jetzt will ich mal eure ideen, vorschläge hören:::

Ok, dat wars... sorry kann sein das es ein bissel komisch geschrieben ist, ich nehme
kaum acht auf rechtschreibung.

matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2003 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 26, 2003 15:57
Beiträge: 50
Wohnort: Hamminkeln
hm, also ich schreib mal einfach, was mir in den sinn kommt:

- mach für die Vektoren kein Object oder Record oder Class, packs einfach in ein Array rein, das is leicht zu verwalten und man kanns auch schon als VertexArray nutzen.

- überleg dir, wie du das ganze darstellen willst, VertexObjects, VertexArrays, DisplayLists. Das sind so die Möglichkeiten, darauf hin musst du auch deine Mesh Verwaltung hin trimmen.

- Wie soll dien Lighting aussehn, Lightmaps, mit Shadowmap oder dynamisch. Wenn dynamisch, dann musst du dich entscheiden, welche Methode du nimmst. Oder evtl auch ne mischung. Wie sollen an sich die Schatten aussehn, projizierte Schatten, Stencil Schatten

- Wie willst du deine Geometry animieren? Keyframe, Boneanimation, oder beides.

- Stell dir das mit dem SOund nich so einfach vor, ne gute SOund Engine is nich so simpel, wie man denken mag, schau die mal OpenAL an.

- leg keine riesige Struktur an, sondern mach alles Stück für Stück, sonst legst du das projekt von anfang an zu groß aus und es wird nix, also fang mit einer Klasse an und erweiter das dann

- drauflos programmieren ist nich weiter schlimm, aber du darfst nur kleine Schritte machen, bau dir ein Basisgerüst und erweiter dieses. So mach ich es jedenfalls.

- welche Extensions willst du unterstützen? Evtl musst/kannst/solltest du auf den jeweiligen Grafikchip hin optimieren.

- Wie willst du dein Geländer verwalten. Octree, BSP, Portal Darauf hin musst du auch deine Verwaltung auslegen.

so, das ist so das, was mir als erstes in den SInn kam.

mfg,
DEnnis.

_________________
Bush's on a highway to hell with the whole world blind, leading it straight into the flames.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2003 22:05 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich habe mal ein Struktur Bild von meiner Engine hochgeladen. Ob das für einen selber sinnvoll oder nicht ist muß jeder selber entscheiden, denn jeder hat vermutlich einen anderen Programmierstil. Zumindest ist das eine denkbare Lösung.<a href='http://www.delphigl.com/upload/enginestruct.zip' target='_blank'>http://www.delphigl.com/upload/enginestruct.zip</a>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2003 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 26, 2003 15:57
Beiträge: 50
Wohnort: Hamminkeln
mir ist noch was eingefallen:
du solltest darüber nachdenken, ob du auf MultiThreading aufbauen willst, oder nich. Das dürfte die Struktur deiner Engine doch erheblich beeinflussen.

Und noch ein Rat von mir, fang nicht mit irgendeiner Unit an, sondern bau die erst eine Basisklasse, in die du alles implementierne kannst, um es zu testen, dann hat man schneller Ergebnisse und bleibt daher motivierter. Und klammer dich dabei nicht an optimale Leistung, sondern erstmal an leserlichkeit und leichtverständlichkeit, schliesslich wirst du noch viel an der Basisklasse rumwurschteln. Optimier lieber erst hinterher, wenn alles läuft, sonst baust du diene Funktionen 10 oder 15 mal um und das ist nich Sinn der Sache.

mfg,
Dennis.

_________________
Bush's on a highway to hell with the whole world blind, leading it straight into the flames.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2003 23:19 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
ein vektor und ein vertex beinhalten eigentlich die gleichen daten (3*float oder 3*integer ...)
ich hab daher ein TVectorVertex = array[0..2] of TGLFloat; draus gemacht.


gruß
rochus

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 09:57 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also ich hab mich überlegt, das die engine nicht Grafikkarten abhängig sein soll, sondern z.b. Bumpmapping einmal Hardware seitig über Register_Combiners oder Softwareseitig über Emboss Bumpmapping. Und z.b. Grafiken wo kein MultiTexturing oder nur 2 einheiten davon haben, soll der rest dann mit normalen Blending gemacht werden, oder wenn man z.b. kein Detailmapping will, kann man das abschalten, Grafiken die 4 oder höher texturen pro pass rendern können sollen natürlich alles schön mit MultiTexturing darstellen.
Alles soll aber abschaltbar sein, also Bumpmapping, Detailmapping, Lightmapping sollte immer abgeschaltet werden können.

Was Schatten angeht, im moment kenn ich nur Stencil Buffer schatten methode, die ich auch kapier... den rest kapier ich momentan noch nicht.

Wegen dem Vertex:

Also nen Vertex ist bei mir das:

Code:
  1.  
  2. type
  3.   TVertex = record
  4.      Position : TVector;
  5.      Texcoord : TTexcoord
  6.   end;
  7.  
  8.   TVertices = array of TVertex;
  9.  
  10.   TFace = record
  11.     StartIndex,
  12.     EndIndex : Longint;
  13.   end;
  14.  
  15.   TFaces = array of TFace;
  16.  
  17.   TWorld = class(TObject)
  18.   private
  19.     fFaces : TFaces;
  20.     fVertices : TVertices;
  21.   public
  22.   end;
  23.  


oder ist es sinnvoller die texcoords einzeln zu machen und dann auch über StartIndex, EndIndex zuzuweisen ?

Code:
  1.  
  2. type
  3.   TTexcoords = array of TTexcoord;
  4.  
  5.   TVectors = array of TVector;
  6.  
  7.   TFace = record
  8.     Normal : TVector;
  9.     StartIndex,
  10.     EndIndex : Longint;
  11.   end;
  12.  
  13.   TFaces = array of TFace;
  14.  
  15.   TWorld = class(TObject)
  16.   private
  17.     fFaces : TFaces;
  18.     fVectors : TVectors;
  19.     fTexcoords : TTexcoords;
  20.   public
  21.   end;
  22.  


Jetzt kurze frage zu Faces, in einem Face müssen ja wirklich nur Index daten und die Normale stehen oder ?
Und ein Face hat ne Start korrdinaten (Start eines Polygons A) und ende Koordinaten (Ende eines Polygons C).
oder sollte man mehrere korrdinaten beachten ? Also z.b. um nen 5 Eck zu machen ?

wie siehts aus mit Shadern, wie könnte man ne einfache shader struktur machen, wo man für jedes Face unterschiedliche Texturen drüberlegen kann, nicht immer nur Base-Light-Detail-Bump.
Wo man auch Blendoperationen einstellen kann alle q3a. Weil ich will keine Statische Texture Struktur, weil für manche sachen brauch man einfach kein bumpmapping, Lightmapping usw.

Wegen dem MultiThreading... ich wüsste jetzt nicht warum ich Threads benutzen sollte, und wie... :(
Hatte es so vor, einfach ein normales Idle Loop zum Rendern und berechnen zu nehmen.
Für was bräuchte man Threads bei ner Engine, versteh ich jetzt nich ganz.

matane,
Final

PS: Ich hab mich überlegt, muhahahha Krasses deutsch wa ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 11:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Das hast du dir ja was vorgenommen.

Ich betrachte deine TVertex und frage mich:
- wie du Texturkoordinaten für multiple Textureinheiten unterstützt
- ob du keine punktweisen Farb/Alphakanalinformationen brauchst
- ob Punktnormale generell eine schlechte Idee sind

Ich sehe dein TFace und frage mich:
- ob du alle Schnittpunkte eines "Faces" via GL_POLYGON versenden willst
- ob du evtl. die Möglichkeit berücksichtigst Schnittpunktdaten mittels GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP zu optimieren, oder WENIGSTENS die Möglichkeit viele Dreiecke zu einem glBegin glEnd Paar, bzw. glDrawElements zusammenzufassen
- wo du die Ebenengleichung speicherst, auf dass man evtl. mal Kollisionserkennung auf Polygonebene einbauen kann

Ich inspiziere dein TWorld und frage mich:
- wann du eigentlich Materialeinstellungen und Texturen änderst
- ob alle deine Vertices als Weltkoordinaten vorliegen, da anscheinend keine Möglichkeit vorgesehen wird, die ModelView Matrix zu ändern
- ob es nicht ganz praktisch wäre zumindest noch eine weitere Unterteilungsmöglichkeit in Objekte zu haben, die unabhängig voneinander bearbeitet werden können

Wenn ich mir das jetzt durchlese, klingt es kritischer, als es eigentlich gemeint ist - also nichts für ungut (ich wollte nur nicht so elendsviel schreiben).

Du solltest dir erst mal überlegen, was du konkret mit deiner Engine machen willst - denn je nach Art der Anwendung, kommen evtl. völlig andere spezielle Algorithmen zum Einsatz. DANN kann man anfangen sich zu überlegen, wie die entsprechenden Szenarien am besten im Speicher repräsentiert und als Grafik dargestellt werden - ganz zu schweigen von Sound- und (evtl.) Netzwerkunterstützung.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 13:47 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Zitat:
Das hast du dir ja was vorgenommen.


Jo ich weiss ^_^

Zitat:
Ich betrachte deine TVertex und frage mich:
- wie du Texturkoordinaten für multiple Textureinheiten unterstützt
- ob du keine punktweisen Farb/Alphakanalinformationen brauchst
- ob Punktnormale generell eine schlechte Idee sind


Texture Koordinaten tja da gehts schon los, das müsste man dann mit dem Shader system verbinden.
Also wenn man 4 Texturen angibt für ne wand z.b. Base-Bump-Lightmap-Detail, dann brauchst ja für jeden Vertex 4 Texcoords.

Farb,Alphakanalinformationen brauchst, meinst du alphakanal bei ner Texture ?? der wird in der texture gespeichert wo sonst.

Punktnormale, erstens versteh ich deine satzaufstellung nicht und zweitens wenn du meinst für jeden Vertex, wieso ich dachte immer es reicht wenn man für ein Face eine Normale hat.

Zitat:
Ich sehe dein TFace und frage mich:
- ob du alle Schnittpunkte eines "Faces" via GL_POLYGON versenden willst
- ob du evtl. die Möglichkeit berücksichtigst Schnittpunktdaten mittels GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP zu optimieren, oder WENIGSTENS die Möglichkeit viele Dreiecke zu einem glBegin glEnd Paar, bzw. glDrawElements zusammenzufassen
- wo du die Ebenengleichung speicherst, auf dass man evtl. mal Kollisionserkennung auf Polygonebene einbauen kann


GL_TRIANGLE_STRIP, weil das funzt bis jetzt am besten ohne probs :D, GL_POLYGON brauch ich nich, es soll ja alles nur Dreiecke sein. Ebenengleichung ? du meinst Plane ?? Wo könnte man die speichern auch im Face ?

Zitat:
Ich inspiziere dein TWorld und frage mich:
- wann du eigentlich Materialeinstellungen und Texturen änderst
- ob alle deine Vertices als Weltkoordinaten vorliegen, da anscheinend keine Möglichkeit vorgesehen wird, die ModelView Matrix zu ändern
- ob es nicht ganz praktisch wäre zumindest noch eine weitere Unterteilungsmöglichkeit in Objekte zu haben, die unabhängig voneinander bearbeitet werden können

Jop als Weltkoordinaten, aber wegen Modelviewmatrix ... hmm daran hab ich gar nicht gedacht.
Objekt:

Code:
  1.  
  2. TObjekt = record
  3.  &nbsp;Name : String[60];
  4.  &nbsp;StartFaceIndex,
  5.  &nbsp;EndFaceIndex : Integer;
  6.  &nbsp;Rotate,
  7.  &nbsp;Position,
  8.  &nbsp;Scale &nbsp; &nbsp; : TVector;
  9.  &nbsp;end;
  10.  


matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 13:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 26, 2003 15:57
Beiträge: 50
Wohnort: Hamminkeln
@MultiThreading:

Du wirst nunmal nich schaffen, deine CPU allein mit deiner Engine durchgehend voll auszulasten, also verschenkst du Leistung und damit Zeit, was sich in der FramRate wiederspiegelt. Du kannst z.B. den Grafikteil von Input, Sound und Netzwerkcode trennen und diese dann parallel laufen lassen, wobei halt alles in deiner HAuptklasse zusammenlaeuft. Dadurch lastest du deine CPU aus und deine App profitiert, wenn du es richtig machst, auch deutlich von HyperThreading :)

@Vertices und TexCoords:
warum willst du das noch in nem Record machen? der Zugriff auf ein Array ist deutlich einfacher, wie ich finde.
Im übrigen solltest du das ganze trennen, da du sonst denke ich nur schlecht vertex arrays nutzen kannst, jedenfalls ist das meine Befürchtung dabei.

@Fallback:
Mit den Fallbackmethoden hast du dir ja was aufgehalst! Du vervielfachst den Aufwand dadurch merklich, wenn du das ganze emulieren willst.
Du brauchst das eigentlich nicht, da man irgendwo schon ein paar Hardwaresache als Standard annehmen kann. MultiTexturing unterstuetzen die meisten karten mit mind. 4 textureinheiten, also is der fallback davon relativ sinnlos und nebenbei bemerkt auch extreeeem ressourcenfressend, da du ja alles mehrmals zeichnest.

mfg
Dennis.

_________________
Bush's on a highway to hell with the whole world blind, leading it straight into the flames.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 14:23 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Wenn du manchmal OpenGL Licht verwendest, solltest du schon die Möglichkeit offen halten, Normale pro Punkt zu vergeben, um weiche Farbübergänge zu erhalten. Ausserdem kannst du noch, unabhängig von der Textur, eine (ab OpenGL 1.4 zwei) Farben (RGBA) pro Punkt vergeben, mit der du z.B. die Textur überblenden kannst. (Ab OpenGL 1.4 gibt's sogar noch eine Nebelkoordinate).


@VertexArrays:
Zitat:
Im übrigen solltest du das ganze trennen, da du sonst denke ich nur schlecht vertex arrays nutzen kannst, jedenfalls ist das meine Befürchtung dabei


Prinzipiell ja - allerdings gibt es die Möglichkeit,
1) einen Interleave festzulegen oder
2) kombinierte Vertexeigenschaften in Vertex Arrays zu übergeben, was je nach OpenGL Implementation sogar schneller sein kann, als unterschiedliche Vertex und Normale- Arrays (z.B.) zu verwenden.
Mit einzelnen Arrays ist man aber auf jeden Fall flexibler.

Zitat:
GL_POLYGON brauch ich nich, es soll ja alles nur Dreiecke sein

Da hab' ich deinen Code missverstanden - ich dachte jede Plane sollte ein koplanares, konvexes Vieleck sein

Beim nochmaligen Durchlesen hab' ich deinen Beitrag ohnehin ziemlich schlampig überflogen - du hast ja gefragt, welche Möglichkeit flexibler ist - und hast das Ganze ja noch gar nicht implementiert:

Eindeutig die Zweite:

<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> TWorld = <span class='reserved'>class</span>(TObject)
<span class='reserved'>private</span>
fFaces : TFaces;
fVectors : TVectors;
fTexcoords : TTexcoords;
<span class='reserved'>public</span>
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Nenn es nicht TWorld sondern von mir aus TObj3D, leg (wenn du's brauchst) ein paar zusätzliche Arrays für zusätzliche Textureinheiten/Vertexfarben/Punktnormale an, speichere eine potentielle Transformation, Textur, Material mit ab, eventuell Kindobjekte/Joints/Bones/Vertexlisten für Frameanimationen - und du hast den Grundstein eines brauchbaren Objektsystems (allerdings erst für die graphische Darstellung unterschiedlicher Einzelobjekte).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 14:31 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So sinnlos ist es nicht, es gibt noch viele leutz die ne GeForce 2 oder niedriger haben, und haben nunmal nur 2 Textures pro pass. Das reicht gerade mal für base+Lightmapping, das problem ist ja auch. Das ich ja shader machen will, wo ich sagen kann.. das ne oberfläche 4 Texturen haben kann und z.b. ne Fenster scheibe Blending nur eine Texture braucht, verstehst du... das ist das problem.
Das Blending braucht man ja z.b. auch für Partikel.

Aber das mit dem Threads ist ne gute idee, das glaube ich versuch ich zu machen, also einfach 4 Unterschiedliche Threads machen ?, Render, Berechnungen, Sound, Tastatur ?

Ok, hab mir grad mal überlegt wie man ne soundengine machen kann, also sounds abzuspielen ist nicht schwer, aber das dynamisch auf Erreignisse wirken lassen ist hard.

matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2003 15:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 26, 2003 15:57
Beiträge: 50
Wohnort: Hamminkeln
render thread kannst nich machen, OpenGL is nich threadsicher!
du kannst eine hauptklasse machen, in der deine renderschleife is und von der aus, wird z.B. Sound, Netzcode, Phyik/Animation angesprochen, musst du halt selbst durchdenken, wie du das aufbaust.

@Fallback:
Du kannst es nich allen recht machen und wenn du es gleich so groß aufziehn willst, dann wird dir das Projekt wahrscheinlich übern Kopf wachsen. Wenn du 4 Texturen benutzen willst, aber nur 2 unterstütz werden, hieße das, dass du die Geometry 2mal zeichnen müsstest, da die meisten Oberflächen nunmal wahrscheinlich mehr als 2 Texturen haben werden, dann wirst du fast die gesamte Geometry 2mal zeichnen müssen, was einen deutlichen Leistungseinbruch zur Folge hätte und wer will am Ende noch mit 15FPS oder so noch ein Programm laufen lassen? Du musst dir über den Sinn im klaren sein. Es ist z.B. sinnvoll, wenn automatisch entschieden wird, ob Shader benutzt werden, oder ähnliches, aber jede Extension mit nem Fallback auszurüsten ist wirklich sinnlos.

mfg,
Dennis.

_________________
Bush's on a highway to hell with the whole world blind, leading it straight into the flames.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 16, 2003 06:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dennis hat geschrieben:
render thread kannst nich machen, OpenGL is nich threadsicher!

Erkläre das mal bitte? Wieso ist OpenGL nicht Threadsave? Ich persönlich mache das innem Thread (auch schon mit mehreren) und hatte überhaupt keine Probleme.

Dennis hat geschrieben:
Wenn du 4 Texturen benutzen willst, aber nur 2 unterstütz werden, hieße das, dass du die Geometry 2mal zeichnen müsstest, da die meisten Oberflächen nunmal wahrscheinlich mehr als 2 Texturen haben werden, dann wirst du fast die gesamte Geometry 2mal zeichnen müssen, was einen deutlichen Leistungseinbruch zur Folge hätte

So wir die Geschwindigkeit auf kleinen Karten unweigerlich ins Bodenlose sinken (was unvermeidbar ist). Allerdings würde ich das fast für besser empfinden, wenn man die Detailtexturen und Bumpmapping weglassen würde. So könnte man auf natürlichem Wege die anzahl der Texturen auf 2 drücken. Vor allem wenn man bedenkt, dass die TNT 2 auch kein so super tolles Bumpmapping unterstützt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 16, 2003 08:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zu den Texturen:
Heutzutage würde ich auf jeden Fall Bumpmapping verwenden.
Bei diffusem Bumpmapping und zwei Texturen mußt du pro Licht halt 3 mal zeichnen, bei einer Karte mit 4 Texturen reicht eben einmal aus. Für GeForceFX und Radeon 9700 Karten gibt es ja wieder die gemeinsame Extension ARB_FRAGMENT_PROGRAM. Es ist ja nicht so aufwendig dann zwei oder drei Funktionen mehr zu schreiben.
ARB_VERTEX_PROGRAM wird ebenso wie ARB_VERTEX_BUFFER_OBJECT auf allen NVida Karten untertstüzt, auf manchen aufgrund von Hardware Beschränkungen eben nicht so effizient. Das heißt, das einzige von du wirklich unterscheiden mußt sind nur die Pixel Shader.
Die zusätzliche Geometrie bei mehreren Renderschritten macht das ganze nicht so viel langsamer, weil die Engine vermutlich ehe durch die Füllrate begrenzt wird. Auf einer GF4 ist jeder TriangleStrip bestehen aus 2 Dreiecken über einer Größe von 6*6 Pixeln durch die Füllrate begenzt. Das heißt wenn deine Flächen größer sind, dann kannst du auch mehr davon nehmen. Auf jeden Fall würde ich ein Vertex Format mit einer Größe von 32 Byte nehmen. Man kann ja Texturekoordinaten und Normalen ins smallint packen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 16, 2003 08:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ja klar, ich glaube das wäre das beste... Karten mit nur 2 Units haben nur Base+Lightmap und karten mit 4 haben dann base-bump-detail-light. Aber ich wills ja nicht Statisch machen, also base, Lightmap muss immer sein... Nein... sondern das muss ja alles über shader gesteuert werden. Also ich hab mir folgende shaderstrukutur überlegt:

engine_shader.pas:
Code:
  1.  
  2. type
  3.   TShaderProgramType = (sptTexture, sptBumpmap, sptGlossmap, sptLightmap);
  4.  
  5.   TShaderProgramBlendFunction = (spbfNone, spbfAdditive);
  6.   
  7.   TShaderProgram = record
  8.     BlendFunction : TShaderProgramBlendFunction;
  9.     PrgType : TShaderProgramType;
  10.   end;
  11.  
  12.   TShader = record // Ein Shader hat immer nur eine Texture, jedes Face kann bis zu 4 Shader haben.
  13.     TextureIndex : Longint;
  14.     Shaderprogram : TShaderProgram;  
  15.   end;
  16.  
  17.   TShaders = array [0..3] of TShader;
  18.  
  19.   TFace = record
  20.     Shaders : TShaders;
  21.   end;
  22.  


Jetzt kommt noch die frage, wo bring ich jetzt die Texture Koordinaten unter ???
Ist es sinnvoll TShaderProgramType so zu strukutiren ?

@Lars: Ich kapier nich was diffuses Bumpmapping ist, oder Refelktives, EnviromentBumpmap (Was mit übrigens verdammt gut gefällt).

EnvBumpmap ist doch einfach Bumpmap mit der Cubemap oda ? Würd ich mal annehmen?

matane,
Final

Zur info: Jeglichen Code den ich bis jetzt gepostet habe, wurde alles frei bauch raus erstellt, also es wurde bis jetzt noch nicht eine zeile code programmiert
Momentan alles noch Planung in einem sauberen Word Dokument ^_^


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 34 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 16 Queries | GZIP : On ]