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

1

12.01.2011, 09:01

CustomVertex - Klasse erweitern

Hallo Zusammen

Ich bin auf ein Problem gestossen, als ich in meinem Grafikprogramm mit Texturen anfing. Konkret geht es darum, dass ich einer Fläche eine Textur geben kann. Das funktioniert auch wunderbar. Im Programm kann man dann die Ansicht umschalten (Drahtgitter, nur Farben, nur Texturen).

Und jetzt kommt das Problem, gibt es ein Vertex - Format, welches mit Farben und Texturen funktioniert? Oder muss ich jedesmal prüfen, welche Ansicht das gerade aktiv ist und je nach dem dann das Format setzten, das wäre ja mega umständlich.

Folgende Formate gibt es ja:
PositionColored, PositionColoredTextured, PositionNormal, PositionNormalTextured... und so weiter.

Im MOment brauche ich CustomVertex.PositionNormalTextured. Mit diesem kann ich aber keine Farbe zuweisen, somit funktioneirt die Ansicht "nur Farben" nicht.
Eigentlich bräuchte ich folgendes Format: PositionNormalTexturedColored, oder so ähnlich =) Aber das gibt es nicht.

Kann ich diese Klasse (CustomVertex) erweitern, oder wie löse ich das am besten?

Danke und Gruss
MasterCHief

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

2

12.01.2011, 09:20

Das sollte auf jeden Fall funktionieren, nur da wäre noch etwas zu klären: Welche API und könnten wir etwas Code sehen? Wie zB sind die Formate nun aufgebaut? Sind das Flags so das man mehrere verbinden kann?

Ich nehme mal stark an, dass dies so ist :)

mfg Mark

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DerMark« (12.01.2011, 09:33)


3

12.01.2011, 09:31

Hey, danke für die schnelle Antwort.

Mir ist schlussendlich egal wie das man das lösen kann, ich bin mit jedem Weg zufrieden (solange ich ihn verstehe =)

Ich erstelle eine Liste mit dem Format, in diese schreibe ich alle meine Vertices zum rendern

C#-Quelltext

1
List<CustomVertex.PositionNormalTextured> pointRenderList = new List<CustomVertex.PositionNormalTextured>();


Dann erstelle ich einen Vertexbuffer und setzte das Vertexformat:

C#-Quelltext

1
2
3
4
5
6
7
VertexBuffer vb = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), pointRenderList.Count, device, Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);

GraphicsStream stream = vb.Lock(0, 0, 0);
stream.Write(pointRenderList.ToArray());
vb.Unlock();

device.VertexFormat = CustomVertex.PositionNormalTextured.Format;


und schlussendlich wird das ganze noch gezeichnet:

C#-Quelltext

1
2
device.SetStreamSource(0, vb, 0);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, (pointRenderList.Count / 3));


Je nach dem ob ich eben die Textur anzeige, wird vor dem Zeichnen diese noch gesetzt. Jedoch habe ich mit obigem verwendetem Format, keine Möglichkeit eine Farbe für die einzelnen Vertices festzulegen.

HOffe das bringt dir was, danke

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

4

12.01.2011, 09:33

Ich rate mal das du mit WindowsMobile D3D arbeitest? Man muss ja den Typ der Vertexstruktur angeben wenn man einen vertexBuffer erstellt http://msdn.microsoft.com/en-us/library/ms130610.aspx also sollte es nicht allzu schwer sein sich einen eigenen Typ zu basteln der dies was du wünschst kann.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct MyVertex
{
  public float X;
  public float Y;
  public float Z;
  public float Nx;
  public float Ny;
  public float Nz;
  public int Color;
  public float Tu;
  public float Tv;

   public static readonly VertexFormats Format = VertexFormats.Position |  VertexFormats.Normal | VertexFormats.Diffuse | VertexFormats.Texture0;
}


Wie genau die Fields selbst angeordnet sein müssen müsstest du aber selbst mal schauen, möglicherweise ist mein beispiel da noch fehlerhaft.

5

12.01.2011, 09:42

WOW, danke.. das ist denke ich das was ich gesucht habe.

Das mit der eigenen Struktur habe ich zwar versucht, ausser das ich halt das FOrmat nicht abrufen konnte.

C#-Quelltext

1
public static readonly VertexFormats Format = VertexFormats.Position |  VertexFormats.Normal | VertexFormats.Diffuse | VertexFormats.Texture0;


Ich denke so könnte das funktionieren, ich probier das mal aus, und melde mich dann nochmal, aber trozdem danke jetzt schon =)

6

12.01.2011, 10:07

Also, ich hab das jetzt mal so versucht umzusetzen. Nur funktioniert das nicht wie gewünscht =) (wär ja auch zu schön gewesen)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
struct MyVertex
{
            public Vector3 Position;
            public Vector3 Normal;
            public int Color;
            public float Tu;
            public float Tv;

            public static readonly VertexFormats Format = VertexFormats.Position | VertexFormats.Normal | VertexFormats.Diffuse | VertexFormats.Texture0;
}


Diese Struktur verwende ich nun, und folgendermassen setzte ich sie:

C#-Quelltext

1
2
3
4
5
6
7
8
MyVertex p1 = new MyVertex();
p1.Position = v;
p1.Tu = tu;
p1.Tv = tv;
p1.Color =c.ToArgb();
p1.Normal = n;

pointRenderList.Add(p1);


Wenn ich nunr nur mit Farbe anzeige, dann funktioniert das wunderbar, kann auch die Farbe ändern und so weiter.
Wenn ich aber eine Textur definiere und diese Anzeigen möchte, ändert sich zwar die Ansicht, aber keine Textur wird angezeigt.

Die Ansicht ändert sich einfach in der Farbe, von Auge betrachtet behaupte ich das die angezeigte Farbe immer ca. die durchschnittsfarbe der Textur ist.

Wie kann ich das ändern, oder was habe ich verbockt =) ?

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

7

12.01.2011, 10:32

Die Durchschnittsfarbe der Textur? Hast du davon mal ein Screenshot parat? Eventuell sind ein par RenderStates falsch gesetzt, zB musst du ja einstellen wie sich die Farben mit der Textur verhalten sollen.

Und beachte noch:

Zitat

Wie genau die Fields selbst angeordnet sein müssen müsstest du aber selbst mal schauen, möglicherweise ist mein beispiel da noch fehlerhaft.

8

12.01.2011, 10:55

Das Problem mit der "Durchschnittsfarbe" habe ich lösen können =)

Da gabe es einen kleinen Fehler in der Struktur, statt VertexFormats.Texture0; muss man VertexFormats.Texture1; setzten, da VertexFormats.Texture0; besagt, dass eben keine Textur vorhanden ist. Somit kann ich nun Farben und Texturen wechseln =)

Aber es ist ein weiteres Problem, oder einfach etwas unschönes aufgetaucht.

Dadurch, dass ich eine Farbe und eine Textur in der Struktur habe, wird, wenn die Textur angezeigt werden soll, zusätzlich auch die Farbe angezeigt, also wenn ich zum Beispiel eine Struktur mit Textur "Gras" habe und die Farbe Rot, erhalte ich rotes Gras. Ist intressant und kann man sicherlich brauchen =)

Nur: Im Moment etwas ungünstig. HAbe das so gelöst, dass wenn eine Textur angezeigt werden soll, die Farbe einfach Weiss ist, dann gibt es keine Konflikte.

Oder weist du da abhilfe?

Danke auf jedenfall =)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

12.01.2011, 11:03

Wenn keine Vertex-Colours verwendet werden sollen, dann würde ich auch einen anderen Struct verwenden. Das spart Traffic. Klar geht das mit weiß auch, halte ich aber für Verschwendung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

10

12.01.2011, 11:07

Das Problem mit der "Durchschnittsfarbe" habe ich lösen können =)

Da gabe es einen kleinen Fehler in der Struktur, statt VertexFormats.Texture0; muss man VertexFormats.Texture1; setzten, da VertexFormats.Texture0; besagt, dass eben keine Textur vorhanden ist. Somit kann ich nun Farben und Texturen wechseln =)

Aber es ist ein weiteres Problem, oder einfach etwas unschönes aufgetaucht.

Dadurch, dass ich eine Farbe und eine Textur in der Struktur habe, wird, wenn die Textur angezeigt werden soll, zusätzlich auch die Farbe angezeigt, also wenn ich zum Beispiel eine Struktur mit Textur "Gras" habe und die Farbe Rot, erhalte ich rotes Gras. Ist intressant und kann man sicherlich brauchen =)

Nur: Im Moment etwas ungünstig. HAbe das so gelöst, dass wenn eine Textur angezeigt werden soll, die Farbe einfach Weiss ist, dann gibt es keine Konflikte.

Oder weist du da abhilfe?

Danke auf jedenfall =)

Du kannst die VertexColors benutzen um etwas mehr variation in dein Gras zu bringen, zB indem du die Vertexfarben pro Gras variierst, allerdings würde ich das eher im Shader berechnen und so wie BC bereits sagte komplett auf die Farbe verzichten.

Werbeanzeige