Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
DirectX: Tutorial
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Super Tutorial Hauptmann echt supereinfach zum nachmachen

@cynos:
Im Prinzip genügt dazu eh eine Suche über google, da DirectInput zumindest unter C++ einige Male auftaucht. Und den Code von C++ nach C# zu "übersetzen" ist ja nicht wirklich schwer...
private Nachricht | Beiträge des Benutzers
mcs
myCSharp.de - Member



Dabei seit:
Beiträge: 8

beantworten | zitieren | melden

Zitat
Original von hauptmann
spiel mal ein wenig mit den Parametern rum. Also z.B. das Vertex Processing mal auf Software stellen oder.

Danke für Deine Hilfe Hauptmann, die Parameter hatte ich schon bei allen, bei welchen dies möglich war auf software gestellt, hatte damit aber leider keinen Erfolg. Nun habe ich aber vor kurzen Visual Studio 2003 installiert und siehe da, es läuft. Sonst hat sich meines Wissens nichts relevantes geändert kein neuer GraKa Treiber, keine Neuinstallation von DirectX überhaupt nichts, aber was solls Hauptsache es funktioniert. Nochmals danke, bin sehr gespannt auf die weiteren Teile deines Tutorials - immer weiter so.

mcs
fastest code is no code
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 771
Herkunft: Österreich/Kärnten

Themenstarter:

beantworten | zitieren | melden

Input -> Output

Nun, in unseren Anwendungen war jetzt zwar bereits etwas Bewegung. In Spielen kommt jedoch noch ein weiterer Faktor
hinzu: Der Userinput. Ohne diesen gäbe es eigentlich keine Spiele. Deshalb sehen wir uns einmal eine vereinfachte Form
an, die wir in unseren Anwendungen nutzen können. Unser Ziel ist einfach: Wir wollen anhand der Leertaste steuern
ob sich unser Objekt dreht oder nicht.
Dazu überschreiben wir einfach die Funktion ProcessCmdKeys der Basisklasse Form. Diese liefert uns im einem Parameter
die gerade gedrückte Taste.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
	return base.ProcessCmdKey( ref msg, keyData );
}

Nun können wir unseren bisherigen Eventhandler für Input löschen und fügen hier folgendes ein:

if(keyData == Keys.Escape)
		Application.Exit();

Nun kommen wir zum eigentlichen Teil: Zunächst reduzieren wir den Rendercode auf eine Box(und löschen nebenbei natürlich
überflüssigen Code für das zweite Objekt aus dem letzten Tutorial)

		private void Render()
		{
			if (device == null) 
				return;


			//Clear the backbuffer to a blue color 
			device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
			//Begin the scene
			device.BeginScene();

			device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 3.0f,-5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) );
			device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );

			Matrix world;
			world = Matrix.Scaling(0.5f,0.5f,1.5f);
	
			device.Transform.World = world;

			box.DrawSubset(0);

			device.EndScene();
			device.Present();
		}

Nun müssen wir eine Variable vom Typ bool in unsere Klasse aufnehmen, die anzeigt ob das Objekt derzeit rotieren soll
oder nicht:

bool rotate = false;

Und schon kommen wir wieder zur ProcessCmdKey Funktion:

if(keyData == Keys.Space)
		rotate = !rotate;
Wir fragen ab ob die Leertaste(Space) gedrückt wurde, wenn ja dann wird roate invertiert(aus false wird true gemacht,
aus true false).

Nun müssen wir jedoch noch in die Render Funktion etwas ändern.
Vor dem device.Transform.World = world müssen wir noch abfragen ob rotate auf true ist, wenn ja dann müssen wir unser
Objekt drehen lassen.

	Matrix world;
	world = Matrix.Scaling(0.5f,0.5f,1.5f);

	if(rotate)
		world *= Matrix.RotationX(Environment.TickCount * (float)0.0025);
			
	device.Transform.World = world;

	box.DrawSubset(0);

Und damit ist es schon fertig. So einfach kann Benutzereingabe sein ^^
Wie immer ist das fertige Projekt im Visual Studio .net 2003 Format dabei. Außerdem ist in der Zip Datei das Tutorial als Txt enthalten ...
Attachments
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

geil das tut! Und dankeschön an Hauptmann!

Nur hat die Sache einen hacken: Ich hab mir das ganze Programm runtergeladen und in #develop (1.0.3a) aufgeführt. Es funktioniert nicht!

Hier ist die Fehlermeldung:
Die Anwendung hat einen Ausnahmefehler verursacht, der nicht verarbeitet werden konnte.

Prozess-ID=0xf28 (3880), Thread-ID=0xcfc (3324)

Klicken Sie auf 'OK', um die Anwendung abzubrechen,
oder auf 'Abbrechen', um sie zu debuggen.

Ich hab das Programm wie gesagt runtergeladen, nicht selbst abgeschrieben, und ausgeführt.

Bitte helft mir!

thx
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 771
Herkunft: Österreich/Kärnten

Themenstarter:

beantworten | zitieren | melden

Texture Mapping

Alle unsere Objekte hatten bisher immer nur eine einzige Farbe und die Oberfläche der Objekte war glatt und durchgehend.
Jedoch hat eine solche Oberfläche so gut wie kein Objekt der realen Welt. Wenn man sich umschaut sind solche regelmäßigen
Anordnungen sehr selten und Oberflächen sind auch nicht sehr oft so glatt und "perfekt" wie wir sie bisher hatten.
Deshalb greifen wir auf das Texture Mapping zurück: Wir weisen unserem Objekt nicht einfach eine Farbe zu, sondern eine
Textur. Was ist jetzt eine Textur? Eine Textur ist ganze einfach ein Bild das wir über das Objekt legen. Dadurch können
wir jetzt zB einen Ziegelstein nicht einfach nur rot färben, sondern ihn auch ein realistisches Aussehen verpassen.
Sehen wir uns nun einmal an wie wir unsere Box texturieren können. Zunächst brauchen wir eine neue Variable vom Typ
Texture. In ihr speichern wir unsere Textur:

Texture textur;

Nun müssen wir unsere Textur laden. Das geht ziemlich einfach, da uns Direct3D die Klasse TextureLoader zur Verfügung
stellt, in der bereits vorgefertigte Funktionen zum Laden von Texturen enthalten sind:

public void OnCreateDevice(object sender, EventArgs e)
{
	Device dev = (Device)sender;

	textur = TextureLoader.FromFile(dev,"iron04.jpg");

Wir verwenden die Funktion FromFile, die als ersten Parameter das verwende Device verlangt und als zweiten das Bild,
das wir in der Textur speichern wollen. Die FromFile Funktion ist ein wahres Multitalent, denn laut SDK unterstützt
es die folgenden Bildformate: .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, und .tga
In echten Spielen sollte man wenn möglich nicht jpg verwenden, so wie ich das hier tue, jedoch ist eine jpg schön klein
und als Beispiel sollte es reichen. Der Nachteil ist halt das ein jpg als Textur nicht wirklich toll aussieht.
Der Rückgabewert der Funktion ist ein Texture Objekt das die geladene Textur enthält.
Als nächstes müssen wir unsere Box anpassen. Bisher haben wir ja die Vertices der Box mit einer Farbkomponente erweitert,
jetzt müssen wir sie mit Texturkoordinaten erweitern.
Texturkoordinaten? Was sind Texturkoordinaten?
Wenn wir eine Textur auf ein Dreieck legen, woher soll Direct3D jetzt wissen wie es die Textur auf das Dreieck legen soll?
Deshalb gibt es die Texturkoordinaten, mit ihnen können wir bestimmen wie eine Textur auf ein Dreieck gelegt werden soll.
Als Anlehnung an Vertex werden diese Koordinaten auch Texel genannt. Ein Texel ist immer zwei dimensional(Bilder sind ja
auch nur zwei dimensional) und hat also 2 Achsen: Die u-Achse und die v-Achse. Die u-Achse ist eigentlich die x-Achse,
während die v-Achse die y-Achse ist. Der Koordinatenursprung einer Textur liegt jedoch in der linken oberen Ecke.
Eine weitere Besonderheit von Texel sind das sie in einem Intervall von [0,1] liegen. Dh das es bei allen Texturen nur
Texel zwischen 0 und 1 gibt unabhängig von der eigentlichen Größe der Textur. Der Texel 0,5 liegt daher immer in der Mitte
einer Achse.
Wir müssen nun also jedem Vertex einen Texel zuweisen, der anzeigt welcher Teil einer Textur auf diesen Vertex gelegt
werden soll.
Ein Beispiel: Nehmen wir an wir haben ein Rechteck mit 4 Vertices und eine Textur. Die Textur ist ebenfalls rechteckig
und wir wollen nun die Textur auf dieses Rechteck legen. Dazu müssen wir jetzt jedem Vertex des Rechteck einen Texel
der Textur zuweisen.
Sehen wir uns es jetzt den 1. Vertex an. Nehmen wir mal an das dieser in der linken oberen Ecke liegt. Wir können diesem
Vertex jetzt den Texel (0.0/0.0) zuweisen. Oder (1.0/1.0). Uns sind hierbei keine Grenzen gesetzt. Wir wollen aber die
Textur normal auf das Rechteck legen, also so wie ein Bildprogramm uns die Textur anzeigt, so wollen wir diese auf dem
Rechteck haben. Also weisem wir dem 1. Vertex den Texel (0/0) zu. Der 2. Vertex liegt nun in der rechten oberen Ecke.
Also weisen wir diesem Vertex den Texel (1/0) zu(wir müssen auf der u-Achse ganz nach rechts). Der 3. Vertex ist nun
die linke untere Ecke. Also brauchen wir hier den Texel (0/1). Und für den letzten Vertex brauchen wir schließlich den
Texel (1/1).
Ich hoffe mit diesem Beispiel versteht man die Texturkoordinaten recht gut. Am Besten ist es hier eine Zeichnung zu machen.
Kommen wir nun zum praktischen:

box = Mesh.Box(dev,2.0f,1.0f,2.0f);
			VertexFormats format = VertexFormats.PositionNormal | VertexFormats.Texture1;
			Mesh tempBox = box.Clone( box.Options.Value, format, dev );
			box.Dispose();
			box = tempBox;

			CustomVertex.PositionNormalTextured[] verts = (CustomVertex.PositionNormalTextured[])box.VertexBuffer.Lock( 0, 
				typeof( CustomVertex.PositionNormalTextured ), 
				LockFlags.None, 
				box.NumberVertices );

Wir wir sehen ist der Code nicht allzu schwer. Das VertexFormat der Box müssen wir auf PositionNormal und Texture1 setzen.
Texture1 beschreibt, das wir pro Vertex 1 Texel haben.
Danach müssen wir noch die neuen Vertices die wir schreiben wollen erstellen. Hierbei müssen wir PositionNormalTextured
verwenden, anstatt PositionNormalColored.
Nun kommen wir zum zuweisen der Texel, was nicht sonderlich schwer ist:

for(int i=0;i < verts.Length;++i)
	{
			verts[i].Tu = verts[i].X * 0.8f;
			verts[i].Tv = verts[i].Y * 0.8f;
	}
box.VertexBuffer.Unlock();
}

Sehen wir uns jetzt das Rendern an. Bevor unsere Box normal rendern können, müssen wir noch die Textur setzen. Dh wir
müssen Direct3D sagen das es jetzt für die nächsten Operationen wo es Texturen braucht die Textur nehmen soll, die wir
gesetz haben.

device.SetTexture(0,textur);
Was hat die 0 hier zu bedeuten? Wie wir später sehen werden gibt es verschiedene Texture Stages. Die untereste dieser
Schichten ist die Stufe 0. Mit diesen Texturstages werden wir später zwei oder mehr Texturen miteinander verbinden können
und auf unser Objekt legen. Dieses Verfahren nennt man dann Multi-Texturing.
Nun können wir unser Objekt mit der Textur rendern:

box.DrawSubset(0);

Und das wars schon. Mit Texturen kann man natürlich noch viel mehr anfangen, doch dazu mehr in späteren Teilen
Anbei ist natürlich wieder das Visual Studio .net 2003 Projekt sowie die Datei iron04.jpg
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Hi Hauptmann

Hab grad noch ne Frage zum Texturing. Wieso ist die Textur da so unscharf? Im jpg ist sie doch scharf, vergrößert Direct3D die so?

Hab Anisotropisches Filtering aktiviert, damit sieht es ein wenig besser aus. Nur wie bekommt man die Textur schärfer?
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 771
Herkunft: Österreich/Kärnten

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von KRambo
Hi Hauptmann

Hab grad noch ne Frage zum Texturing. Wieso ist die Textur da so unscharf? Im jpg ist sie doch scharf, vergrößert Direct3D die so?

Hab Anisotropisches Filtering aktiviert, damit sieht es ein wenig besser aus. Nur wie bekommt man die Textur schärfer?
das hängt vorallem am jpeg

Sieh dir mal das Beispiel im DirectX SDK zum Thema Texturen an, da wird auch eine jpeg geladen und die ist auch sehr unscharf.

Ich werde aber bald zeigen wie man die Texturqualität erhöhen kann ^^
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Naja ich sollte in ein paar Tagen ne lauffähige Version haben, wo die Tex nich so unscharf iss. Mit Filtering wirkt sie nicht so pixelig, aber sonst nützt das auch nix bei der Schärfe...hoffe bis dahin hast du wieder was. Find ich auf jeden Fall super und leicht verständlich das Ganze
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

Kann mir da denn jetzt jemand helfen?
Ich würde auch sehr gerne mit DirectX programmieren!
Und das Geld für Visual Studio hab ich nich.
Hier nochmal das Problem:
Ich hab mir die .zip Datei heruntergeladen und in #develop laufen lassen (natürlich nach dem importieren)
Aber es tut nicht!

Weis da jemand weiter?
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 771
Herkunft: Österreich/Kärnten

Themenstarter:

beantworten | zitieren | melden

hmm, kann viele Ursachen haben. Fehlermeldungen?
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

Hier ist die Fehlermeldung:

Die Anwendung hat einen Ausnahmefehler verursacht, der nicht verarbeitet werden konnte.

Prozess-ID=0xf28 (3880), Thread-ID=0xcfc (3324)

Klicken Sie auf 'OK', um die Anwendung abzubrechen,
oder auf 'Abbrechen', um sie zu debuggen.

Wär nett wenn ihr mir helfen könntet.
Danke schonmal im voraus.
private Nachricht | Beiträge des Benutzers
Fab96
myCSharp.de - Member



Dabei seit:
Beiträge: 66

beantworten | zitieren | melden

Wenn du debuggen lässt kommt dann eine FileNotFound Exception ?

wenn ja ist als references sicherlich irgendwas drin was nichtintalliert ist. jedenfalls war das mal bei mir so.
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Die Meldung hatte ich auch mal. War weil das Managed DirectX nicht "richtig" installiert war auf dem Rechner, danach gings...
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

was meinst du mit "nicht richtig installiert"?

was hast du denn gemacht damit es wieder weg ging?
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Im Ordner wo das Setup liegt, gibts nen eigenen Ordner, wo eine extra Setup-Datei für Managed liegt. Die hab ich installiert, dann gings auch. Die andere installiert glaub ich nur das "normale" DirectX...

Musste nur ein bischen Suchen da in den Ordnern die Bezeichnungen sind eh selbsterklärend. Weiss den Ordnernamen nicht auswendig...
private Nachricht | Beiträge des Benutzers
Fab96
myCSharp.de - Member



Dabei seit:
Beiträge: 66

beantworten | zitieren | melden

Die MDXREDIS.msi ? sprich manadged DirectX redistutable oderwie man das schreibt.
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

hm... meinst du mit dem Ordner in dem das Setup ist den ornder C:\Programme\directx oder so ähnlich?
oder bin ich völlig im falschen film?
In dem Ordner is bei mir nämlich gar nichts auser der Ordner setup und der is auch leer.
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

hat sich jetzt halbwegs erledigt. Ich habe mir VC# 2005 Express beta runtergeladen, jetzt tut es.
Wär aber trotzdem nett wenn ihr mir sagen könntet warum es in #develop nicht tat.
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Hm wenn du DirectX installierst und die eine Setup hast, dann doppelklickst du und er fragt nach nem Ordner. Da wird dann alles entpackt. Dann hast du da mehrere Unterordner und das Setup wird automatisch gestartet. Nur bin ich draufgekommen, dass die Installation nich immer ganz funktioniert, und dann muss man das 2te Setup in dem betreffenden Ordner auch ausführen, dann gehts...ich glaub die Struktur geht so irgendwie \DirectX\Managed DirectX\Debug und da iss ne msi drin....
private Nachricht | Beiträge des Benutzers
shady
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

aber dann müste es dann doch auch mit VC# 2005 nicht funktionieren oder?
Ich mein, wenn es an DirectX liegt, dann sollte es doch jetzt auch nicht funktionieren.
private Nachricht | Beiträge des Benutzers
KRambo
myCSharp.de - Member



Dabei seit:
Beiträge: 355

beantworten | zitieren | melden

Ka ich progge auch noch nich lange Managed DX
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 771
Herkunft: Österreich/Kärnten

Themenstarter:

beantworten | zitieren | melden

Der Indexbuffer - Indizieren von Vertices

Diesmal sehen wir uns den sogenannten Indexbuffer an. Indexbuffer sind dazu da um Vertices zu reduzieren.
Bei einer Indizierung fallen nämlich doppelte Vertices weg und man kann so einen Vertexbuffer deutlich optimieren.
Nehmen wir an wir wollen zwei Dreiecke zeichnen. Grafisch würde das so aussehen:
1 2|4


0|3 5

Die Nummern geben dabei die einzelnen Vertices an. Für dieses Beispiel bräuchten wir also 6 Vertices in einem
Vertexbuffer. Jedoch fällt uns auf das zwei Vertices mit den selben Koordinaten zweimal im Vertexbuffer stehen.
Ist das nicht sinnloser Verbrauch von Speicherplatz? Deshalb erstellt man nun einen Indexbuffer in dem man
speichert, an welcher Position welcher Vertex ist. (sry, aber ihr solltet den Beitrag quoten oder die im zip beiliegende Tutorial.txt ansehen, dort wird die Tabelle richtig dargestellt -.- )
Index Wert Vertex
0 0 (x0,y0)
1 1 (x1,y1)
2 2 (x2,y2)
3 0 (x0,y0)
4 2 (x2,y2)
5 5 (x5,y5)

Wie wir in der Tabelle sehen müssen wir nur mehr 4 verschiedene Vertices speichern, nicht mehr 6 verschiedene.
In diesem Beispiel mag das nicht als viel erscheinen, aber wenn man große Objekte hat, kann man mit Indexbuffer
viel einsparen und sehr gut optimieren. Zu beachten ist aber, dass man jedoch 6 Indices braucht. In DirectX SDK
Hilfe wird übrigens empfohlen nur mit indizierten Vertices zu arbeiten. Und nun können wir bereits zu Praxis
kommen. Direct3D stellt uns die Klasse IndexBuffer zur Verfügung, um einen IndexBuffer zu erstellen. Wir werden
jedoch nicht direkt mit dem Indexbuffer arbeiten sondern verwenden ein Mesh Objekt. Ein Mesh Objekt ist einfach
eine Klasse die das Arbeiten mit Vertexdaten vereinfacht.

Mesh Object;

Sehen wir uns nun die OnCreateDevice Funktion an. Hier erstellen wir zuerst 4 Vertices, danach 6 Indices und
speichern diese im Mesh Objekt:

		public void OnCreateDevice(object sender, EventArgs e)
		{
			Device dev = (Device)sender;

			CustomVertex.PositionOnly[] verts = { 			
										new CustomVertex.PositionOnly(-1f,  0f, -1f),
										new CustomVertex.PositionOnly( 1f,  0f, -1f),
										new CustomVertex.PositionOnly( 1f,  0f,  1f),
										new CustomVertex.PositionOnly(-1f,  0f,  1f),
			};

			short[] indices = { 0,1,2,		// erstes Dreieck
								  0,2,3 };	// zweites Dreieck

Dieser Code bietet uns keine Probleme. Wir verwenden short Indices aus Speicherplatzgründen, da wird ja nur kleine
Werte brauchen(von 0 bis 3) und so müssen wir auf dem RAM der Grafikkarte pro Index nur 2 Bytes verwenden anstatt
4 Byte wie bei int. Die Zahlen im indices Array weisen auf die Vertices hin, die beim Zeichnen verwendet werden.
Für das erste Dreieck verwenden wir die Vertices 0, 1 und 2. Fürs zweite 0, 2 und 3.

Object = new Mesh(indices.Length / 3,verts.Length,MeshFlags.WriteOnly,CustomVertex.PositionOnly.Format,
							  device);

			Object.VertexBuffer.SetData(verts,0,LockFlags.None);
			Object.IndexBuffer.SetData(indices,0,LockFlags.None);

		}

Hier erstellen wir ein neues Mesh Objekt und setzen die VertexBuffer und IndexBuffer Werte dafür. Die Parameter
des Mesh Konstruktors sind einfach:
Der erste Parameter gibt die Anzahl der Flächen eines Objektes an. Wir brauchen logischerweise 2 Flächen. Einmal
fürs erste Dreieck und einmal fürs Zweite.
Der zweite Paramter gibt dann die Anzahl der Vertices an. Der Dritte gibt sogenannte MeshFlags an. Diese können
dazu verwendet werden der Klasse gewisse Informationen zu geben, wie sie die Daten behandeln soll. Wir wollen nur
Daten in das Mesh Objekt schreiben, jedoch keine herauslesen. Dazu geben wir MeshFalgs.WriteOnly an. Das nächste
ist das Format der Vertexdaten. Der letzte Parameter gibt dann schließlich das Device an.
Danach greifen wir direkt auf den VertexBuffer und den IndexBuffer zu und setzen die Daten mit SetData.
Nun können wir auch schon zur Renderfunktion kommen.
Diese ist diesmal auch ganz einfach:

			device.Clear(ClearFlags.Target , System.Drawing.Color.Blue, 1.0f, 0);
			
			device.BeginScene();

			device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 3.0f,-5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) );
			device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );

			device.Transform.World = Matrix.Identity;
			
			device.RenderState.CullMode = Cull.Clockwise;
			Object.DrawSubset(0);

			device.EndScene();
			device.Present();

Der Code bietet eigentlich nur vertraute Dinge -.-

Was ist jetzt jedoch wenn wir direkt aus einem VertexBuffer und einem IndexBuffer heraus rendern wollen? Dazu
können wir die Funktion DrawIndexedPrimitives verwenden (oder DrawIndexedUserPrimitives wenn wir ohne Vertexbuffer
arbeiten wollen). Doch um diese Funktion müssen wir uns erstmal nicht kümmern, da uns ja die Mesh Klasse die
meiste Arbeit abnimmt.

Wie immer gibt es das gesamte Visual Studio 2003 .net Projekt als zip zum Download.(achtung, ich verwende immer jeweils das neueste SDK dh für diese Version braucht ihr das April Update des SDKs, ich glaube aber das es mit älteren Ausgaben des SDK auch funktionieren sollte)
Attachments
private Nachricht | Beiträge des Benutzers
SGT_BOB
myCSharp.de - Member



Dabei seit:
Beiträge: 125
Herkunft: Aachen

beantworten | zitieren | melden

Wow... alle Achtung für dieses Tut.
Sowas hab ich schon lange gesucht. Mich würd mal interessieren wie lange du schon (C#) proggst und vor allem wie weit du das hier noch durchziehen möchtest. Ist doch ne ganze Menge Arbeit.
Hab mich mal vor die DX-Doku gesetzt, ist schon ziemlich viel was da drin steht (alleine D3D betreffend). Respekt vor dem der sich da durch kämpft.

Wie gesagt, nur weiter so, bin gespannt...
*************************
Ich bin root, ich darf das...
root>_
*************************
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 771
Herkunft: Österreich/Kärnten

Themenstarter:

beantworten | zitieren | melden

Hi!
Zitat
Mich würd mal interessieren wie lange du schon (C#) proggst und vor allem wie weit du das hier noch durchziehen möchtest. Ist doch ne ganze Menge Arbeit.

So ca. 2.5 Jahre und schreiben will ich das halt solange ich Zeit und Lust habe -.-

Das Tutorial ist jetzt unter Link verfügbar
private Nachricht | Beiträge des Benutzers