Laden...

[DX]Multitexturing will nicht

Erstellt von byte3 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.349 Views
B
byte3 Themenstarter:in
3 Beiträge seit 2007
vor 15 Jahren
[DX]Multitexturing will nicht

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

M
8 Beiträge seit 2004
vor 15 Jahren

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

B
byte3 Themenstarter:in
3 Beiträge seit 2007
vor 15 Jahren

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.

B
byte3 Themenstarter:in
3 Beiträge seit 2007
vor 15 Jahren

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.