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
[DX]Multitexturing will nicht
byte3
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

[DX]Multitexturing will nicht

beantworten | zitieren | melden

Hi

Ich probier mich seit einiger Zeit an einem eigenem Strategiespiel und möchte nun Multitexturing einbauen. Hab mir dazu schon per Google ein paar Sachen rausgesucht, aber so ganz glücklich wurde ich damit nicht. Ein Fehler tritt zwar nicht auf, aber dargestellt wird auch nichts.

Ich Poste einfach mal den Code:

Customvertex Struct:


public struct Transformed2Textured
    {
        public float Rhw;
        public float X;
        public float Y;
        public float Z;
        public float W;
        public float Tu0;
        public float Tv0;
        public float Tu1;
        public float Tv1;
        public static readonly D3D.VertexFormats Format = D3D.VertexFormats.Transformed | D3D.VertexFormats.Texture1 | D3D.VertexFormats.Texture2;

        public DX.Vector4 Position
        {
            get { return new DX.Vector4(X, Y, Z, W); }
            set
            {
                X = value.X;
                Y= value.Y;
                Z = value.Z;
                W = value.W;
            }
        }
    }

Erstellung des VertexBuffer:


vb = new Microsoft.DirectX.Direct3D.VertexBuffer(typeof(Transformed2Textured), 6, Graphics.Instance.getDevice(),
                Microsoft.DirectX.Direct3D.Usage.WriteOnly | Microsoft.DirectX.Direct3D.Usage.Dynamic, Transformed2Textured.Format,
                Microsoft.DirectX.Direct3D.Pool.Default);

Code zum Zeichnen:


                        Graphics.Instance.getDevice().SetTexture(0, Graphics.Instance.getTexture(textures[i].TextureID));
                        Graphics.Instance.getDevice().TextureState[0].ColorArgument1 = Microsoft.DirectX.Direct3D.TextureArgument.TextureColor;
                        Graphics.Instance.getDevice().TextureState[0].ColorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg1;

                        Graphics.Instance.getDevice().SetTexture(1, Graphics.Instance.getTexture(textures[i].TextureID));
                        Graphics.Instance.getDevice().TextureState[1].ColorArgument1 = Microsoft.DirectX.Direct3D.TextureArgument.Current;
                        Graphics.Instance.getDevice().TextureState[1].ColorArgument2 = Microsoft.DirectX.Direct3D.TextureArgument.TextureColor;
                        Graphics.Instance.getDevice().TextureState[1].ColorOperation = Microsoft.DirectX.Direct3D.TextureOperation.BlendFactorAlpha;
                        Graphics.Instance.getDevice().RenderState.TextureFactor = Color.FromArgb(128, 0, 0, 0).ToArgb();

                        Graphics.Instance.getDevice().SetStreamSource(0, vb, 0);
                        Graphics.Instance.getDevice ().DrawPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleList, 0, 2);

                        Graphics.Instance.getDevice().SetTexture(0, null);
                        Graphics.Instance.getDevice().SetTexture(1, null);

Ich hab mich dabei etwas an dem Beitrag von Actarus orientiert:
Multitexturing (Textur Koordinaten)

Die Texturen werden richtig geladen, Position und Tu/Tv Werte sich auch korrekt.
Bei mir sind die Tu/Tv werte der ersten Textur identisch mit dennen der zweiten, ich denke aber das ist ok so.

Ohne das Multitexturing hat das ganze schon Funktioniert, seitdem hat sich nur weniges geändert.

1. D3D.CustomVertex.TransformedTextured wurde durch Transformed2Textured ersetzt.
2. Code zum zeichnen wurde angepasst.


Ich hoffe mir kann heir jemand bei der Lösung des Problems behilflich sein.
Danke!

bye
private Nachricht | Beiträge des Benutzers
mcs
myCSharp.de - Member



Dabei seit:
Beiträge: 8

beantworten | zitieren | melden

hi,

ist ein bisschen schwer ohne den restlichen Code, aber was mir aufgefallen ist:



Graphics.Instance.getDevice().SetTexture(0, Graphics.Instance.getTexture(textures[i].TextureID));  // hier 
                        Graphics.Instance.getDevice().TextureState[0].ColorArgument1 = Microsoft.DirectX.Direct3D.TextureArgument.TextureColor;
                        Graphics.Instance.getDevice().TextureState[0].ColorOperation = Microsoft.DirectX.Direct3D.TextureOperation.SelectArg1;

                        Graphics.Instance.getDevice().SetTexture(1, Graphics.Instance.getTexture(textures[i].TextureID)); // und hier (textures[i]) zweimal die gleiche Textur

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



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Ja, ist mir bekannt das dort zwei mal die gleiche Textur verwendet wird. Ich dachte das sei kein Problem, habs aber nun mal geändert, mir wird dennoch nichts angezeigt.

Welcher restliche Code würde denn zur Problemlösung beitragen?
Ich dachte mir da das ganze vorher, ohne dem Multitexturing, funktioniert hat und ich dort auch nichts verändert habe, ich den Code nicht Posten brauch.

Das einzige was mir dazu noch einfällt wär, das ich evtl. etwas beim erstellen des Direct3D Device vergessen hab.

Hier der Code dazu:


presentParams.Windowed = true;
presentParams.EnableAutoDepthStencil = true;
presentParams.AutoDepthStencilFormat = Microsoft.DirectX.Direct3D.DepthFormat.D16;
frm.ClientSize = new System.Drawing.Size(1024, 768);
presentParams.SwapEffect = D3D.SwapEffect.Discard;
presentParams.BackBufferWidth = 1024;
presentParams.BackBufferHeight = 768;
presentParams.BackBufferFormat = Microsoft.DirectX.Direct3D.Format.A8R8G8B8;
presentParams.BackBufferCount = 0;
presentParams.PresentationInterval = Microsoft.DirectX.Direct3D.PresentInterval.Immediate;
device = new D3D.Device(0, D3D.DeviceType.Hardware, frm, D3D.CreateFlags.SoftwareVertexProcessing, presentParams);
device.DeviceResizing += new System.ComponentModel.CancelEventHandler(cancelResize);

device.RenderState.AlphaBlendEnable = true;
device.RenderState.SourceBlend = D3D.Blend.SourceAlpha;
device.RenderState.DestinationBlend = D3D.Blend.InvSourceAlpha;
device.SetRenderState(D3D.RenderStates.Wrap0, false);
device.VertexFormat = Transformed2Textured.Format;

Muss man denn irgendwo noch irgendwas einstellen damit Multitexturing funktioniert?
Die Texturen müssen nicht irgendwie besonders geladen werden oder ein bestimmtes Format haben?

Ist denn mein CustomVertex struct richtig?
Dort habe ich das Gefühl etwas nicht richtig gemacht zu haben.
private Nachricht | Beiträge des Benutzers
byte3
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Hah! Nach langer Zeit des rumprobierens bin ich auf die Lösung gekommen.
Der Code von mir ist zu 99% korrekt, nur in meinem Customvertex Struct Zeile 3 steht public float Rhw;, diese muss gelöscht werden.

Als ich meine CustomVertex erstellt habe hatte ich CustomVertex.TransformedTextured als Vorlage genommen, ich dachte mir das meine CustomVertex genau so aussehen muss wie die Vorlage, nur eben mit 2 paar Texturcoordinaten. Naja, falsch gedacht.

Ich habe keine ahnung wieso das so ist, wär nett wenn mir das jemand erklären könnte.
private Nachricht | Beiträge des Benutzers