Laden...
H
hauptmann myCSharp.de - Member
Schüler Österreich/Kärnten Dabei seit 19.07.2003 704 Beiträge
Benutzerbeschreibung

Forenbeiträge von hauptmann Ingesamt 704 Beiträge

10.04.2005 - 19:52 Uhr

Du befindest dich momentan im FAQ Forum von myCSHARP.de Hier findest du häufig gestellte Fragen zu verschiedenen Themenbereichen aus der .NET Welt.

Falls du eine Idee für einen FAQ Beitrag haben solltest, so schickt bitte eine PM an das myCSharp.de-Team (siehe Kontakt zum Team).

Danke!

PS: Poweruser könnten im Forum "FAQ" direkt Themen erstellen und antworten (siehe Gruppe Poweruser/Experten).

03.04.2005 - 21:35 Uhr

** 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)

02.04.2005 - 15:33 Uhr

Hi!

von Microsoft gibt es einen Setup Bootstrapper. Damit kannst du zu einem Windows Installer das .net Framework hinzufügen:
http://www.microsoft.com/downloads/details.aspx?familyid=66350891-d15b-446b-bd69-f7f849224a00&displaylang=en
http://support.microsoft.com/default.aspx?scid=kb;en-us;836158

Dann gibt es noch Thinstall: http://thinstall.com/help/index.html?linking_netframework.htm
Das analysiert deine Anwendung und linkt alle benötigen Assemblies zu deinem Programm hinzu. Dadurch wird das Programm größer, aber du brauchst das .net Framework nicht installieren

01.04.2005 - 15:03 Uhr

Original von Rene Paschold
Ach echt, das war ein Aprilscherz ??????

Hmm ich habe jetzt aber schon zwei Java Bücher bestellt .. grummel

und ich hab mich grad bei der NASA für die Entwicklung des Mars Rover beworben -.-

01.04.2005 - 14:00 Uhr

Ich darf mal kurz Leon Chism zitieren:

"If you look at where Java is in the industry and marketplace, it's everywhere"

Und genau deswegen, Java ist überall. War .net schonmal am Mars? Java ist besser, schneller, einfacher als .net

30.03.2005 - 15:52 Uhr

Und wenn man gewisse Teile als Webservice implementiert und diese dann von seinem Programm aus aufruft? An den Code vom Webservice kommt man ja nicht so einfach ran.

Vorrausetzung ist halt Internetverbindung und ein eigener Server.

28.03.2005 - 20:11 Uhr

Rauchen nein, Blutcolagehalt ist aber ziemlich hoch ^^
Und ich mach nur eine Kampfsportart. Ansonsten bin ich nicht soo sportlich(außer halt ski fahren usw.)

27.03.2005 - 12:17 Uhr

Hi!

das ist die eigentlich Definiton, ja. Aber ich habe den Code etwas abgewandelt so das immer 91 herauskommt(indem ich zuerst jede Zahl > 101 auf < 101 bringe durch subtrahieren)

27.03.2005 - 12:03 Uhr

Noch nie was von der 91er Funktion gehört? IIRC heißt die auch McCarthy Funktion.
Definiert durch:
f(n) = 91
Man bekommt für jede beliebige Zahl 91 heraus(daher f91)

26.03.2005 - 11:07 Uhr

Hi!

den Code hab ich gestenr recht spät geschrieben, da achtet man nicht mehr so auf das ^^

Das wegen schlechter Lesbarkeit ist naja, nicht so schlimm. Das ist eine festvordefinierte Funktion, daher, was will man da kommentieren? Außer halt über der Funktion die Definition aufschreiben.

25.03.2005 - 23:58 Uhr

Hi nochmal,

ich habe das jetzt folgendermaßen gelöst:


		public static int f91(params int[] p)
		{
			if(p[0] > 100)
			{
				if(p.Length == 1) 
				{
					while(p[0] > 100)
						p[0] -= 100;

					return f91(p[0],p.Length);
				}
				else
					return p[0]-10;
			}
				else
					return f91( f91(p[0]+11,p.Length),p.Length);
		}

Ist quasi optionale Paramter -.-

Naja, trotzdem ist wohl die Overloading Version besser, weil hier kann es relativ leicht zu Exceptions und falschen Typkonvertierungen kommen

25.03.2005 - 23:41 Uhr

hi!

params lässt aber nur eine variable Anzahl an Parametern gleichen Typs zu.
zB


void f91(params int[] n)
{
  Console.Write("{0} Argumente übergeben",n.Length);
}

Ich brauche aber zwei Paramter: Einen int und einen bool, wobei der bool optional sein soll.
Aber ich habs jetzt über Overloading gemacht, funktioniert ganz gut

25.03.2005 - 17:25 Uhr

Hi!

danke. Ich hatte gehofft das vielleicht besser machen zu können -.-
Naja, ich hoffe für eine der nächsten C# Versionen gibts optionale Paramter

25.03.2005 - 17:07 Uhr

Hi!

Kann ich es irgendwie bewerkstellen einen Parameter optional zu machen(wie bei C++ mit Default Werten für Parameter)
Ich hab folgende Funktion


    public static int f91(int n, bool reserved)
    {
        // mehre male selbstaufrufen, wo reserved eine Rolle spielt
    }

Derzeit muss der User die halt mit f91(zahl,true) aufrufen, aber ich würde gerne dem User den zweiten Parameter ersparen. Kann ich das irgendwie machen außer einfach eine Funktion f91 und eine Funktion f91a definieren, wobei f91 einfach die Zahl und true an f91a weitergibt.

21.03.2005 - 16:31 Uhr

Ich denke das du um das schreiben eines Device Treibers für USB nicht herumkommen wirst.
http://www.codeproject.com/system/ddtxt.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/buses/hh/buses/USBhdr_685e1afc-535e-455d-9719-a5cd1633b942.xml.asp

Der erste Link gibt dir einen ÜBerblick wie du einen Treiber schreibst, der zweite zeigt dir dann die genauen Daten wie du auf den USB Port aus einem Device Treber heraus zugreifen kannst.

20.03.2005 - 23:53 Uhr

ah, selbst gefunden: Die USerControl Klasse hat ja ein Propetie Page -.-
Mit Page.ToString kann ich dann die Seite herausfinden in der das Control gehostet wird.

Manchmal sieht man den Wald vor lauter Bäumen nicht ^^

20.03.2005 - 23:35 Uhr

wenns um einen 486er geht würde ich dir raten dir irgendwoher MS QuickC 2.5 zu holen. Das liefert eine Grafiklibrary mit mit der du ziemlich einfach DOS Grafiken machen kannst(auch komplexe Sachen wie zB ein Diagramm sind mit ein paar Funktionsaufrufen gemacht).

Damit hast du zwar eher nicht so schöne Grafik, dafür ist es aber zeckmäßig, schnell und mehr oder weniger portabel.

20.03.2005 - 21:53 Uhr

Hi!

Ich habe folgendes Problem: Ich habe einen User Control für meinen Siteheader gemacht und diesen binde ich in verschiedene aspx Seiten ein. Jetzt würde ich gerne wenn das Control in der Site a.aspx angezeigt wird soll das Bild a.jpg angezeigt werden(html img Tag), wenn das Control in der Seite b.aspx eingebunden wurde b.jpg.

Gibts da eine Möglichkeit das zu machen?

19.03.2005 - 14:09 Uhr

http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/

Ich hoffe dieser Artikel hilft dir weiter. Dabei wird das ActiveX Control MSComm per P\Invoke eingebunden.

Das Problem bei .net 2.0 ist halt noch das es eine Beta ist, und sowas sollte man doch in einer Umgebung wie einer Firma nicht einsetzen -.-

19.03.2005 - 10:46 Uhr

Hi seth!

Deine Methode hat jedoch das Problem das keine Unterverzeichnisse behandelt. Zb D:!mobackups\test ...

18.03.2005 - 20:58 Uhr

using System.IO;
...
...
Directory.Delete(@"C:\Dokumente und Einstellungen\hauptman\Lokale Einstellungen\Temporary Internet Files",true);
Directory.CreateDirectory(@"C:\Dokumente und Einstellungen\hauptman\Lokale Einstellungen\Temporary Internet Files");


Funktioniert bei mir ohne Probleme und ist schnell und einfach ^^

16.03.2005 - 18:40 Uhr

Also ich werde wahrscheinlich kommen.

16.03.2005 - 16:17 Uhr

so, jetzt hab ichs selbst gelöst bekommen. Ich musste den DTC Dienst starten, IIS neuinstallieren und jetzt funktionierts.

15.03.2005 - 15:53 Uhr

Hi!

ich habe gestern mein Windows neu aufgesetzt und wollte nun den IIS ausprobieren. Jedoch bekomme ich beim Zugriff auf localhost folgenden Fehler im Browser:

Server Application Error
The server has encountered an error while loading an application during the processing of your request. Please refer to the event log for more detail information. Please contact the server administrator for assistance.

Ich schau ins Event Log und was steht da?

Der Server konnte Anwendung '/LM/W3SVC/1/ROOT' nicht laden. Fehler 'Klasse nicht registriert

woher bekomm ich die Anwendung bzw. wie kann ich die registrieren?

14.03.2005 - 21:33 Uhr

Original von golohaas.de

Original von hauptmann
3) PHP und ASP.net haben das selbe Ziel. Die Umsetzung ist jedoch bei beiden anders und sehr verschieden.

Nein. PHP und ASP.NET haben definitiv nicht das selbe Ziel, nicht einmal das gleiche.

PHP ist eine Lösung für kleine und mittlere Webseiten, ASP.NET geht in Richtung Enterpriseentwicklung und tritt daher viel eher in Konkurrenz zu J2EE.

Man kann in ASP.NET so entwickeln wie man es auch unter PHP tun würde, allerdings geht das vollständig am Sinn und Zweck von ASP.NET vorbei. Um ASP.NET richtig anwenden zu können, sollte man von Design Patterns Ahnung haben, man sollte wissen, was für Skalierbarkeit wichtig ist und und und ...

PHP ist - böse gesagt - gut geeignet für viele Frickellösungen, bei ASP.NET wäre das Perlen vor die Säue geworfen. Mit ASP.NET kann man so viel mehr machen, und DAFÜR ist es auch gedacht. Warum in neuester Zeit jeder denkt, ASP.NET sei ein einfacher Ersatz für PHP, ist mir schleierhaft. Bei J2EE denkt das ja auch niemand ...

Ich will matthemat gar nicht die Motivation für ASP.NET nehmen, nur möchte ich darauf hinweisen, dass ASP.NET deutlich mehr Knowledge und deutlich intensivere Einarbeitung erfordert als PHP ...

ok, ich hab das jetzt so gemeint das beide eigentlich da sind um Websiten dynamisch zu erstellen, auf User Input reagieren usw.
Naja, ich beschäftige mich noch nicht solang mit ASP.net -.-

Und so wie ich das bisher immer erlebt habe, konnte ich mit ASP.net immer genau dasselbe machen wie mit PHP(hab ein wenig Erfahrung in PHP).

13.03.2005 - 22:45 Uhr

ich gehe leider nicht hin. Wollte eigentlich aber 1000km mit dem Auto in eine Richtung sind meinem Vater zu weit. -.-

Muss mal schauen das ich da mal mit dem Zug oder so rauskomme(oder fliegen)

13.03.2005 - 22:38 Uhr

Hi!

  1. ASP.net ist nicht eine Sprache. Es ist eine Technologie. Einfach gesagt erlaubt dir ASP.net dynamische Websiten zu erstellen. Nehmen wir an du willst ein Forum wie dieses hier programmieren. Mit HTML kannst du ja nur das Design festlegen, jedoch keine Dinge wie "wenn User drückt auf Button A, erstelle eine Datenbank Connection, hole die Daten und zeige sie an". Und hier setzt ASP.net an. ASP.net ist einfach ein Satz von Klassen. Diese Klassen kannst du mit C# oder Visual Basic.net ansprechen.


<%@ Page Language="VB" Debug="True" Trace="False" Strict="True" %>
<script runat="server">
    Sub Page_Load(sender As Object, e As EventArgs)
            ausgabe.InnerText = "Hello World"
    End Sub
</script>
<html>
<head>
    <title></title>
</head>
<body>
    <form runat="server">
        <p id="ausgabe" runat="server">
        </p>
    </form>
</body>
</html>

Ist zwar VB.net, aber ich denke du solltest das Grundgerüst erkennen. Das was du hier siehst kommt natürlich nicht zum Client, sondern ASP.net erstellt dir aus diesem Source eine HTML Datei.(diese ASP.net Page zeigt einfach hello world an)

  1. PHP und ASP.net haben das selbe Ziel. Die Umsetzung ist jedoch bei beiden anders und sehr verschieden.

  2. IIS mit installiertem .net Framework und aktiviertem ASP.net oder Apache mit mod_mono
    Damit ist ASP.net

07.03.2005 - 22:07 Uhr

wenns ne Windows Forms ist kannst du das Event ProcessCmdKeys verwenden. Ansonsten hol dir über P\Invoke die Funkton GetAsyncKeyState rein.

06.03.2005 - 21:45 Uhr

Original von thepaul

Original von alexander
das Forum offline System sollten wir eventuell nach hinten hinausschieben. So etwas sollte erst entwickelt werden, wenn mycsharp.de auf ASP.NET basiert.
also wird die Community doch umgestellt?

ja, die Frage ist nur wann ...

04.03.2005 - 21:02 Uhr

bzw.
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1031/cpref/html/frlrfSystemDiagnosticsProcessMembersTopic.htm

(beim SDK wird doch auch die Offline Hilfe installiert und ms-help Protokoll registriert, oder?)

04.03.2005 - 20:07 Uhr

Console.WriteLine(arrProcess[i].ProcessName);

lt. MSDN:

ProcessName Ruft den Namen des Prozesses ab.

Und wenn ich deinen Beispiel Code ausführe und mir dann die Liste ausgeben lasse bekomme ich sowas(Auszug)

svchost
winamp
spoolsv
devenv
CLI
...

04.03.2005 - 20:01 Uhr

Du musst forr eintippen und dann noch Tab drücken. IntelliSense erzeugt dir dann diesen Code:


for (int i = length - 1; i >= 0; i--)
		{
			
		}

Alternativ kannst du auch im Texteditor vom VS05 einen Rechtsklick machen, danach auf IntelliSense -> Insert Expansion -> for-iteration by index gehen, kommt aufs selbe hinaus.

(und das verschiebe ich mal hierher, weil es mehr mit der Handhabung der IDE zu tun hat, als mit der Programmierung 😉 )

02.03.2005 - 15:43 Uhr

@GIJOE:
Das sind doch jagged Arrays.(unregelmäßige Arrays)

Ein mehrdimensionales Array macht man doch so:


string[,,] a = new string[3,4,4];

			a[2,3,2] = "Hello";
			Console.WriteLine(a[2,3,2]);

@MysticEmpires:
Wie wärs mit Strukturen die in einer ArrayList gespeichert sind?
Jede Struktur hat 3 Member.


	struct Info
		{
			public string s;
			public string f;
			public string b;
		}

..
...
ArrayList lis = new ArrayList();

			Info i = new Info();
			i.s = "Wasserloch Nr. 3";
			i.f = "571264467523";
			i.b = "8716804";
			lis.Add(i);

01.03.2005 - 20:01 Uhr

Du könntest auch die Beta der MSDN verwenden -.-
http://msdn2.microsoft.com/library/default.aspx

Ladet schneller, baut aber auf Infos für .net 2.0 auf, also gibt es ein paar Unterschiede zum .net 1.0s

01.03.2005 - 19:43 Uhr

Sieh dir Console.Write() an. Diese Funktion schreibt auch auf die Konsole, macht aber keinen Zeilenumbruch.

01.03.2005 - 16:09 Uhr

Hi!

Wenn es dir nur um den Dateityp für Bilder geht kannst du auch einfach System.Drawing.Imagin.Metafile verwenden. Die Klasse hat eine Eigenschaft RawFormat das dir ein ImageFormat zurückgibt und mit dem du den Dateityp herausfinden kannst(wenn die Datei ein Bild ist)

28.02.2005 - 21:35 Uhr

Hi!

Sieh dir mal die Themen Interfaces und Reflection an. Deine Module müssen ein bestimmtes Interface implementieren, danach kannst du sie über Reflection relativ einfach in dein Programm laden.
Siehe dir dazu mal diesen Artikel auf CP an:
http://www.codeproject.com/csharp/reflection.asp

28.02.2005 - 15:24 Uhr

Hi!

ok, ich habe den Fehler jetzt gefunden. Es lag daran das ich verschiedene XML Files hatte und im Anwendungsverzeichnis ein anderes XMLFile1.xml war als ich im VS08 geschrieben hatte ^^

Jetzt funktioniert alles wie gewünscht ...

27.02.2005 - 20:25 Uhr

Hi!

mit dem 1.1 Framework funktionierts bei mir auch -.-

nur die Beta 1 will nicht ^^

27.02.2005 - 19:44 Uhr

Hi!

Anscheinend funktioniert die Funktion XmlTextRead.GEtAttribute nicht mit der .net Framework 2.0 Beta 1

Ich habe folgenden Code(das ist der aus der Hilfe, habe selbst geschriebenen auch ausprobiert)


//Load the reader with the XML file.
			reader = new XmlTextReader("XMLFile1.xml");

			//Read the ISBN attribute.
			reader.MoveToContent();
			string isbn = reader.GetAttribute("ISBN");
			Console.WriteLine("The ISBN value: " + isbn);

Und folgendes XML File


<book genre='novel' ISBN='1-861003-78' pubdate='1987'>
</book>

Jedoch liefert GetAttribute nicht zurück dh der String bleibt auf null.

Kann das ein Bug im .net Framework sein oder wie? (wie gesagt: Beta 1)

24.02.2005 - 18:27 Uhr

Ich würde selbst keins schreiben, aber wenn es interessante geben würde, würde ich sie sicher lesen

09.02.2005 - 16:38 Uhr

hmm, kann viele Ursachen haben. Fehlermeldungen?

06.02.2005 - 20:27 Uhr

James Gosling findet .NET unsicher

ähm ja ne ist klar. Heißt also wenn eine Komponente wackelt dann fällt das ganze System.

06.02.2005 - 14:10 Uhr

naja, die Fehlermeldung sagt ja schon alles: nunit.framework.dll fehlt.
Installiere mal Nunit neu

06.02.2005 - 14:03 Uhr

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 ^^

05.02.2005 - 21:35 Uhr

Original von frederics
Wie schwer ist es, den sog. Bloomeffekt hin zu bekommen? [/list]

http://www.gamedev.net/community/forums/topic.asp?topic_id=295513

Ich hoffe der Link hilft dir weiter

05.02.2005 - 15:15 Uhr

** 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

01.02.2005 - 16:51 Uhr

Hi!

danke, so ähnlich habe ich es mir schon gedacht nur denke ich das es doch auch mit weniger Aufwand gehen solle ....
Aber ich werde das mal probieren, danke 😉

31.01.2005 - 16:00 Uhr

Hi!

passt hier vielleicht nicht ganz hinein, aber ich probiers mal.

Ich würde gern ein VPN machen(Windows 2003 Server) und diese laufen lassen. Von der Config her kein Problem da ich eine statische IP habe usw.
Jedoch liegt das Problem jetzt nur indirekt bei mir. Und zwar würde sich gern ein Freund von mir auf dieses verbinden. Jedoch hat er nur die Ports 80 und 21 zur Verfügung(weil er in einem Kolping Heim wohnt und die nur diese Ports freigegeben haben).
Und jetzt suche ich schon lange wie ich meinen VPN Server so konfigurieren kann das der Verbindungen vom Port 80/21 zulässt(und natürlich die Clientseite, wie ich die konfigurieren muss).