Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

08.08.2004, 10:36

3D Bibliothek hilfe

Ich habe mal vor langer Zeit eine 2D Lib angefangen. Diese basierte auf DX7 und sollte dem Anfänger einen sehr leichten Einstieg in die Spieleprogrammierung ermöglichen http://mitglied.lycos.de/gidxgraphic/gidx20/ . Nun den Quellcode der Lib habe ich nicht mehr. Und habe vor einiger Zeit mit der 3D Version begonnen. Diese basiert auf DX9 und ein paar Funktionen sind schon fertig.

Ein kurzes Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include "gidx.h" 

int main() 
{ 
    Graphic(640,480,0,GX_WINDOWED); 
    while(1) 
    { 
        // 

    } 

    return 0; 
}


Dies initialisiert DX9. Mehr ist nicht nötig. Funktionen zur Enumeration sind auch schon fertig.

Meine Frage mal an euch. Wie mache ich weiter?

Es soll ja möglichst einfach zu bedienen sein. Als nächste meine ich müsste man die Mögichkeit schaffen Vertices zu definieren. Und mit einfachen Befehlen zu bewegen.

Ich möchte hier ein paar Ideen sammeln. Also nur her mit euren Vorschlägen.

DrthM2001

Alter Hase

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

2

08.08.2004, 13:35

Nenn das Graphic erstmal GIDXInit() oder so weil man sich unter dem Namen sonst nix vorstellen kann. Ich würd als nächstes noch eine Exit-funktion machen, und dann erst die Mathematik, und dann so kleine Hilfsfunktionen wie verkettete Listen, und Logbuch.
Also wenn das so eine "leicht-zu-benutzende" Engine werden soll, wer will dann da einzelne vertices malen?!?!? Mach lieber eine Modellklasse, nimm 3ds oder Milkshape etc.

Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "gidx.h"

char keys[256);
int main()
{
     Initstructure Blabla;
     GIDXDisplayDialog(&Blabla);
    GIDXInit(Blabla);
     GIDXModel Solider;
      Solder=ModelManager.LoadModel(Soldier.md2);
    while(1)
    {
        //Szenenstart vorbereiten
        Solder.Draw(0.0f, 0.0f);
        UpdateKeys(&keys);
    }
     GIDXExit();
    return 0;
}


Mal so gaaaaaaaanz grob ;p

Anonymous

unregistriert

3

08.08.2004, 14:00

Zitat von »"DrthM2001"«

...
Also wenn das so eine "leicht-zu-benutzende" Engine werden soll, wer will dann da einzelne vertices malen?!?!? ...


Da hast du Recht :ohoh:



Eine Draw-Funktion soll es nicht geben. Die Engine soll selbständig Objekte zeichnen wenn diese im Sichtbereich sind. Natürlich müsste man noch eine Funktion haben um Objekte evt. zu verstecken.

Hier habe ich noch ein Beispiel aus einer früheren Version der 3D Engine die noch auf DX7 basierte.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    gxClear(GX_COLOR_BUFFER_BIT|GX_DEPTH_BUFFER_BIT);

    gxLoadIdentity();

    gxRotate(angle,rotx,roty,rotz);
    
    gxEnable(GX_CULLING_CW);

    gxTranslate(0.0f,0.0f, 100.0f);

    gxBegin(GX_LINELIST);
        gxColor(.0f,1.0f,.0f);
        for(int i=0; i<g_cnt; i++)
        {       
            gxVertex(myVertex[i].x,myVertex[i].y,myVertex[i].z);
        }
    gxEnd();


    gxEnable(GX_CULLING_CCW);

    gxTranslate(0.0f,0.0f, 100.0f);

    gxBegin(GX_TRIANGLELIST);
        gxColor(0.0f,0.0f,.0f);
        for(i=0; i<g_cnt; i++)
        {       
            gxVertex(myVertex[i].x,myVertex[i].y,myVertex[i].z);
        }
    gxEnd();

    gxFlush();
    
    gxColor(0,1,0);
    gxPrint(10,10,"gxRotate(%f,%f,%f,%f)",angle,rotx,roty,rotz);

    gxPageFlip();


Die Ählichkeit mit OpenGL ist rein zufällig :rolleyes:

zumindestens ist es einer erhebliche Vereinfacherung. Nur machen mir die FVF sorgen. Wie soll man das am besten unterbringen ???

Obwohl das Problem wegfallen würde wenn man nur Modelle laden kann. Aber ich möchte doch eine Möglichkeit bieten auch selber Objekte zu erstellen.

Nur stellt sich mir immer die Frage. Wie flexibel sollte eine Engine sein. ???

Anonymous

unregistriert

4

08.08.2004, 14:12

Zitat von »"DrthM2001"«

Ich würd als nächstes noch eine Exit-funktion machen, und dann erst die Mathematik, und dann so kleine Hilfsfunktionen wie verkettete Listen, und Logbuch.


Ist schon alles drin. Das was du als Quellcode siehst ist nur die Spitze. Im Hintergrund läuft einiges ab. Die Engine verwaltet eingies. Und sorgt auch dafür das alles richtig runtergefahren wird ect...

Auf dem Screenshot kann man im Hintergrund ein Konsolenfenster sehen. Dieses ist die Ausgabe der Engine. Im vorderen Fenster ist die Ausgabe für die eigentliche Anwendung (Spiel).


(Link)

5

09.08.2004, 00:52

1) Für die leute die C++ haben sollte ein Namensraum rein. Es geht einfach nichts ohne.

2) Das man ein Graphic-Objekt Initialisiert finde ich absolut logisch. Man will ja auch Grafik haben ;D

3) Es ist nicht schön für einen Coder wenn man einfach alles kopiert. Das gilt auch für die Entwickler von OpenGL.


So....das mal vorweg. Eins ist sicher. Wenn die Engine leicht zu handhaben sein soll, ist es unbedingt notwendig ein Modell-Format zu benutzen. Eigenes oder fertiges ist wurscht. Aber man sollte natürlich auch die Möglichkeit haben, Modelle im Code zu generieren. Hier hast du zwei Möglichkeiten.
a) Der User definiert eine Struktur
b) Der User machts so wie in OGL
Das Problem mit dem FVF ist schnell behoben. Mit den Vertex Deklarationen hat man die volle Kontrolle. Tutorial findest du auf meiner Seite.

Schwer wird es mit Animationen. Empfehle einen Animation-Controller zu verwenden. Der ist allgmein und damit vereinfacht sich die Anwendung. Da jedes Objekt auf die gleiche Art bewegt wird. Das schließt die einfache Transformation mit ein.

Eine Engine sollte natürlich immer so flexibel wie möglich sein. Aber da sie auf Anfänger abziehlt, dürften Einschränkungen nicht störend sein. Daher kannst du auf viele Schalter verzichten und das meiste vollautomatisiert ablaufen lassen. Vermeide auch Init-Methoden. Jedes Objekt sollte so erstellt werden wie du es schon mit deinem Graphic-Objekt gemacht hast. Nur das der User natürlich eine Instanz haben muss, mit der er Arbeiten kann.
Das sollte auch für dein Graphic-Objekt der Fall sein. Das Objekt sollte einfach nur Funktionen bieten wie Nebel-Einstellungen oder Methoden für das Starten, Löschen und Beenden einer Szene, etc.
Alle Klassen greifen auf eine Controller-Klasse, im Hintergrund, zurück die alles Managed. Ein Singleton-Design ist dafür perfekt geeignet.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

6

09.08.2004, 13:09

hmmm zum namespace. Eigetlich will ich nur C verwenden. Die Engine selber ist in C++ Programmiert die Verwendung läuft, aber über Funktionen. Ich habe immer das Gefühl das vor allem Anfänger Probleme mit C++, den Klassen ect. haben.

Zitat von »"DragonMaster"«


Jedes Objekt sollte so erstellt werden wie du es schon mit deinem Graphic-Objekt gemacht hast. Nur das der User natürlich eine Instanz haben muss, mit der er Arbeiten kann.


Ich plane es zu Zeit so das es einen Zeiger geben wird der auf einen Speicherplatz zeigt in dem die nötigen Informationen zum Objekt gespeichert sind.

so ählich habe ich es auch in der 2D Lib gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
LPIMG    imgBild;

...
   loadimage("Bitmap.bmp",&imgBild,VIDEOMEMORY);
   maskimage(imgBild,color(GREEN));
   drawimage(100,100,imgBild,SETCOLORKEY);
...


Nur ist 3D (vor allem aus technischer Sicht) viel anspruchsvoller.

Noch eine Frage:

-Habt ihr schon mal einen Vertexcache programmiert?
-Wie läuft das mit dem Vertexcache ab?
-Wie werden Daten reingeschrieben?
-Wie und wann werden diese gerendert?
-Wie groß sollte so ein Vertexcache sein?
-Was ist wenn der Vertexchace voll ist und nicht alle Daten eines Objekts konnten reingeschreiben werden?

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

7

09.08.2004, 16:49

Zitat von »"gombolo"«


Noch eine Frage:

-Habt ihr schon mal einen Vertexcache programmiert?
-Wie läuft das mit dem Vertexcache ab?
-Wie werden Daten reingeschrieben?
-Wie und wann werden diese gerendert?
-Wie groß sollte so ein Vertexcache sein?
-Was ist wenn der Vertexchace voll ist und nicht alle Daten eines Objekts konnten reingeschreiben werden?


Jaja, eine Frage... :)

Also, kommt auf den Cache drauf an und auf den Input-Level...so ein ganz interner lowlevel-Cache sortiert einfach die Geometriedaten...und wenns voll ist, wird's zum rendern geschickt!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Anonymous

unregistriert

8

09.08.2004, 18:24

Ja solche Sachen meine ich. Wann ist der cache voll? bei 5000,10000,100000 Vertices? Und was soll er sortieren an der Geomentrie?

Wie ich das bischer verstanden habe gibt es ein Pool. In diese werden die Vertices abgelegt. Solange bis der Pool voll ist. Wenn er voll ist wird der Inhalt gerender. Was ist aber damit das evt. in einem Pool mehrer Objekte vorhanden sind. Diese verschiedene Texturen und Materialien benutzen?

PS: Ich weiss nur eine Frage :rolleyes:

9

09.08.2004, 18:38

Das ist mit Sortierung gemeint ;)

Der VertexCache besitzt mehere Stränge. Eben für jedes Material eine. Wenn ein Objekt gerendert werden soll werden die Vertice in den Cache geuppt und in den passenden Strang eingehängt. Wenn der Cache voll ist wird alles auf einmal gerendert. Gemacht wird das um die auslastung der Graka zu verbessern.

Die größe des Cache ist beliebig und sollte auch im Code Variable sein. Es kann durchaus sein das die optimale Größe von der Graka abhängt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

10

09.08.2004, 20:40

Ich weiss es geht darum die DrawPrimitive-Aufrufe zu verringern.

Mir war/ist noch nicht klar wie ich das in meine Lib einbaue. Ich möchte den Benutzer nicht mit Sachen "erschlagen" wie z.B. den Vertexcache.

Eigentlich wollte ich so viel wie möglich automatisieren.

Ein paar Gedanken:

-Es muss ein Standardmaterial(Standardvertexcache) geben
dieser wird verwendet wenn keine Textur zugewiesen wurde.

-Wird eine Textur geladen wird ein neues Pool angelegt. Alle Vertices die später diese Textur bekommen werden dort hineingeladen.

-Beim Rendern wird die Textur gesetzt und das dazugehörige Pool aktiviert und der Inhalt gerender.

-Trotzdem muss man den Entwickler die Möglichkeit geben selber zu entscheiden wann ein Objekt gerendert wird.

-Was ist mit der Regel Back to Front zu rendern um Fehler bei transparenten Objekten auszuschalten.

Werbeanzeige