Autor Beitrag
Crichton-X
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 20.12.06 17:48 
Hallo,

ich möchte eine Direct3D.Mesh zeichnen, die den
CustomVertex.PositionColored format hat.

Das Problem ist, dass das Dreieck gezeichnet wird, jedoch nicht mit
Vertex-Farben.

Ich würde mich über Hilfe freuen.

Hier ist der Quelltext:

Ressourcen:

ausblenden volle Höhe 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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
/// <summary>
  /// Dieses Gitterobjekt beschreibt ein Polygon.
  /// </summary>
  public class BXMesh_Polygon : BXBasisMesh
  {
    private Mesh m_Mesh = null;
    
    /// <summary>Konstruktor der Klasse BXMesh_Polygon.</summary>
    public BXMesh_Polygon(BXGrafik grafik, string name)
    {
      ErschaffeEigenschaften(grafik, BXMeshTyp.Polygon, name);
    }
    
    /// <summary>
    /// Gibt das Gitterobjekt zurück.
    /// Die Methode "GibDirect3DMesh" für
    /// die Rückgabe des Direct3D-Gitterobjekt benutzen.
    /// </summary>
    /// <returns>Ein Direct3D-Mesh.</returns>
    public override Mesh GibMesh()
    {
      return m_Mesh;
    }
    
    /// <summary>Lädt das Gitterobjekt im Speicher.</summary>
    public override void Initialisieren()
    {
      short[] index = {012};
      CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3];
      verts[0] = new CustomVertex.PositionColored(010, Color.Blue.ToArgb());
      verts[1] = new CustomVertex.PositionColored(-1, -0.25f0, Color.Green.ToArgb());
      verts[2] = new CustomVertex.PositionColored(1, -0.25f0, Color.Orange.ToArgb());
      m_Mesh = new Mesh(13, MeshFlags.Managed, CustomVertex.PositionColored.Format, Grafik.Device);
      m_Mesh.SetVertexBufferData(verts, LockFlags.None);
      m_Mesh.SetIndexBufferData(index, LockFlags.None); 
      
      Vector3 vektor = new Vector3();
      float radius = 0;
      GraphicsStream str = m_Mesh.LockVertexBuffer(LockFlags.None);
      radius = Geometry.ComputeBoundingSphere(str,
                                              m_Mesh.NumberVertices,
                                              m_Mesh.VertexFormat, 
                                              out vektor);
      m_Mesh.UnlockVertexBuffer();
      Sphere = new BXSphere(vektor, radius);
      RessourcenStatus = BXRessourcenStatus.Initialisiert;
    }
    
    /// <summary>Entfernt das Gitterobjekt aus dem Speicher.</summary>
    public override void Entfernen()
    {
      if(m_Mesh != null)
      {
        m_Mesh.Dispose();
        m_Mesh = null;
        RessourcenStatus = BXRessourcenStatus.Entfernt;
      }
    }
  }

SzeneKnoten:

 /// <summary>
    /// Diese Klasse beschreibt ein SzeneKnoten die ein
    /// Basis-Gitterobjekt ist.
    /// </summary>
    public class BXSzeneKnoten_BasisMesh : BXSzeneKnoten
    {
      
      private BXBasisMesh m_BasisMesh = null;
      
      /// <summary>Konstruktor der Klasse BXSzeneKnoten_BasisMesh.</summary>
      public BXSzeneKnoten_BasisMesh(BXGrafik grafik, string name, BXBasisMesh mesh)
      {
        m_BasisMesh = mesh;
        ErschaffeEigenschaften(grafik, BXSzeneKnotenTyp.BasisMesh, name);
        Reset();
      }
      
      /// <summary>
    /// Diese Methode muss vor dem Rendern ausgeführt werden.
    /// Sie muss die gleiche Methode bei den Kinder-SzeneKnoten
    /// ausgeführen.
    /// Sie ist für Animation und andere Berechnungen gedacht.
    /// </summary>
    public override void VorDemRendern(float zwischenZeit)
    {
      if(Sichtbar)
      {
        if(m_BasisMesh != null)Aktualisieren(m_BasisMesh);
        if(Grafik.Level.Kamera3D.SphereInFrustum(Sphere.Position, Sphere.Radius))Grafik.RenderManager.RegistriereSzeneKnoten(this, BXRenderfolge.Solide);
        Kind_VorDemRendern(zwischenZeit);
      }
    }
    
    /// <summary>
    /// Diese Methode Rendert den SzeneKnoten.
    /// </summary>
    public override void Rendern()
    {
      if(m_BasisMesh.RessourcenStatus == BXRessourcenStatus.Initialisiert)
      {
        Grafik.Device.RenderState.ColorVertex = true;
        Grafik.Device.RenderState.CullMode = Cull.Clockwise;
        Grafik.Device.SetTransform(TransformType.World, AbsoluteTransformation);
        Grafik.Device.VertexFormat = m_BasisMesh.GibDirect3DMesh().VertexFormat;
        m_BasisMesh.GibDirect3DMesh().DrawSubset(0);
        
      }
    }


Moderiert von user profile iconUGrohne: Beitragsformatierung überarbeitet.
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 20.12.06 19:57 
Wenn irgendetwas dunkel ist, liegt doch die Vermutung nahe, dass ein Licht fehlt :wink: . Im Gegensatz zum echten Leben gibt es in mDX in den RenderStates aber auch die Möglichkeit, das gesamte Lighting abzuschalten.
Crichton-X Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 22.12.06 15:16 
Ich entschuldige mich für die späte Antwort.
Leider besitze ich kein Internet und muss
zum nächsten i-Net Cafe hingehen.

Zum Thema:

Also wird eine Vertex-Farbe nur gezeichnet wenn Licht an ist.
Über diese Möglichkeit habe ich nicht nachgedacht,
da beim CustomVertex.TransformedColored auch ohne Licht die Vertex-Farben dargestellt werden.
Ist das beim jeden Position-Vertex so, dass die Vertex-Farben nur gezeichnet werden,
wenn Licht an ist?

Ich werde dies ausprobieren.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 23.12.06 17:01 
Wie gesagt, entweder du schaltest ein Lichtlein an oder deaktivierst das gesamte Lighting. Wahrscheinlich lässt sich das auch für jedes Mesh einzeln regeln (wenn alle Stricke reißen, gibts immer noch Shader), aber dazu kann ich mangels Erfahrung nicht mehr sagen.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 23.12.06 20:54 
Ein kleiner Hinweis am Rande: Inzwischen hat Microsoft das XNA GameStudio in einer Final Version herausgebracht. Das basiert auf Visual Studio C# Express und bietet ein ziemlich gutes Framework für die Spieleentwicklung. Es gibt inzwischen auch schon einige gute Tutorials dazu.
Crichton-X Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 24.12.06 15:28 
Ich habe das jetzt hinbekommen.

Vielen Dank für die Hilfe.