ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4440653
Jetzt (Chat):
25 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
DirectX API
Re: MD2 - Textur teilweise verzerrt
Normal
AutorThema
Cobi Offline
ZFX'ler


Registriert seit:
13.05.2004

Nordrhein-Westfalen
MD2 - Textur teilweise verzerrtNach oben.
Hola,
Ich wollte im Rahmen einer Erkältung mal meinen alten MD2-Loader für DX umschreiben. Soweit so gut nur treiben mich gerade die Textur-Koordinaten in den Wahnsinn.
Seltsamerweise scheint es im großen und ganzen richtig aber an einigen Stellen treten verzerrungen auf.
Ich verzichte in meinem Code auf die glCommand-Liste und lade die Textur-Koordinaten (respektive Indizes) mit den Vertex-Indizes aus der Triangle-List.
Code:
cmd2.h:
struct MD2VertexT{
    float X, Y, Z;
    D3DXVECTOR3 Normal;
};

struct MD2TexCoordT{
    float U,V;
};

cmd2.cpp:
...
        pVertexBuffer->Lock(0, 0, &pData, 0);

        for(int j = 0; j < Header->NumVertices; j++){

            ((MD2VertexT*)pData)[j].X = CurrentFrame->Vertex[j].X * CurrentFrame->Scale[0] + CurrentFrame->Translate[0];
            ((MD2VertexT*)pData)[j].Z = CurrentFrame->Vertex[j].Y * CurrentFrame->Scale[1] + CurrentFrame->Translate[1];
            ((MD2VertexT*)pData)[j].Y = CurrentFrame->Vertex[j].Z * CurrentFrame->Scale[2] + CurrentFrame->Translate[2];

            ((MD2VertexT*)pData)[j].Normal.x = MD2_NORMAL_TABLE[CurrentFrame->Vertex[j].NormalIndex][0];
            ((MD2VertexT*)pData)[j].Normal.z = MD2_NORMAL_TABLE[CurrentFrame->Vertex[j].NormalIndex][1];
            ((MD2VertexT*)pData)[j].Normal.y = MD2_NORMAL_TABLE[CurrentFrame->Vertex[j].NormalIndex][2];
        }

        pVertexBuffer->Unlock();
...
    m_pIndexBuffer->Lock(0, 0, &pData, 0);
    m_pTexCoords->Lock(0, 0, &pDataTex, 0);

    for(int i = 0; i < Header->NumTriangles; i++){

        for(int j = 0; j < 3; j++)
            ((short*)pData)[3 * i + j] = Triangles[i].VertexIndices[j];

        for(int j = 0; j < 3; j++){

            ((MD2TexCoordT*)pDataTex)[Triangles[i].VertexIndices[j]].U = (float)(TexCoords[Triangles[i].TextureIndices[j]].s) / Header->SkinWidthPx;
            ((MD2TexCoordT*)pDataTex)[Triangles[i].VertexIndices[j]].V = (float)(TexCoords[Triangles[i].TextureIndices[j]].t) / Header->SkinHeightPx;
        }
    }

    m_pTexCoords->Unlock();
    m_pIndexBuffer->Unlock();
...

Das Ergebnis ist Folgendes:
http://img231.imageshack.us/img231/9494/fbmpim6.png
Hier scheint jemand der Beschreibung nach dasselbe Problem zu haben..
Jemand eine Idee?
(Oder einen einwandfreien DX-Loader zum vergleich?)

1 Mal gendert, zuletzt am 29.01.2009, 21:50:52 Uhr von Cobi.
28.01.2009, 15:54:29 Uhr
Cobi Offline
ZFX'ler


Registriert seit:
13.05.2004

Nordrhein-Westfalen
Re: MD2 - Textur teilweise verzerrtNach oben.
*kapush*
30.01.2009, 12:03:58 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: MD2 - Textur teilweise verzerrtNach oben.
Kommen in dem Model nach dem Laden Koordinaten kleiner 0.0 oder größer 1.0 vor (durch min/max beim Laden einfach zu messen)? Wenn ja, vielleicht ist der Texture-Coordinate-Mode schuld (Clamping) … steht er denn auf spiegeln/wiederholen?

Mal im Shader die Texturkoordinaten ausgegeben, ob dann kontinuierliche Farbverläufe sichtbar werden?

Gruß, Ky
30.01.2009, 13:24:06 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: MD2 - Textur teilweise verzerrtNach oben.
Ich hab so ähnlich aussehende Probleme im Assimpschen MD2-loader auch. An einer Lösung wäre ich ebenfalls interessiert.

Gruß,
Alex
30.01.2009, 17:48:31 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: MD2 - Textur teilweise verzerrtNach oben.
Ich habe mich zwar noch nie mit dem Format beschäftigt, aber das hier ist meine Einschätzung:

Statt die Texturkoordinaten der Eckpunkte einmal zu setzen, kann es sein, dass du sie mehrmals setzt, wenn mehrere Dreiecke auf denselben Eckpunkt zugreifen …

Dass die Texturkoordinaten nicht in den Eckpunkten, sondern in den Dreiecken vermerkt sind, wird den Sinn haben, die Textur auf benachbarten Dreiecken wiederholen zu können, ohne Normalenvektor, Animationen usw. für jedes Vertex mehrfach definieren zu müssen …

Stell dir jetzt folgende Situation vor, in der es zwei benachbarte Dreiecke gibt, die sich zwei Eckpunkte teilen, auf denen sich die Textur aber periodisch wiederholt:
http://www.abload.de/img/skizzem47z.png

So. Über meine Paint-Skillz darf nur meckern, wer einen besseren Vorschlag hat, oder ihn zumindest besser illustriert …

Edit: Ein paar Informationen mehr darüber, wie du Vertex-, Index- und Texture-Buffer nutzt wären nicht schlecht … oder auch, wie groß sie überhaupt sind … aber so wie ich die Situation einschätze dürfte es garkeinen Index-Buffer geben, nur einen Vertex-Buffer mit 3×Header->NumTriangles Elementen, der als Triangle-List gerendert wird. Kann aber auch sein dass ich totalen Schwachsinn rede, wie gesagt, höre heute zum ersten Mal davon …

3 Mal gendert, zuletzt am 30.01.2009, 19:36:32 Uhr von Krishty.
30.01.2009, 19:25:39 Uhr
Cobi Offline
ZFX'ler


Registriert seit:
13.05.2004

Nordrhein-Westfalen
Re: MD2 - Textur teilweise verzerrtNach oben.
Yes, genau daran lag es!
Ich habe die Vertices ohne Textur-Koordinaten gespeichert da ich Tweening nutze und mit einem seperaten TexCoord Stream etwas bandbreite sparen wollte.
Wenn ich für die einzelnen Frames jeweils die Vertices Speicher und anhand der Dreiecke einen einzigen Index-Buffer anlege sollte sich ja auch noch der ein oder andere überlappende Vertex einsparen lassen..
Naja, jetzt bleiben die Textur-Koordinaten in der Vertex-Struktur und das ganze wird ohne Index-Buffer als Trianglelist gerendert. Sollte bei dem bisschen auch keinen Bottleneck ergeben.
Vielen Dank! (Auch für die liebevolle Illustration )

Hier nochmal der neue Code:
Code:
struct MD2VertexT{
    float X, Y, Z;
    D3DXVECTOR3 Normal;
    float U, V;
};
...
    for(int i = 0; i < Header->NumFrames; i++){

        LPDIRECT3DVERTEXBUFFER9    pVertexBuffer;
        VOID*                    pData;
        MD2Frame*                CurrentFrame = (MD2Frame*)(MD2 + Header->OffsetFrames + (40 + sizeof(MD2Vertex) * Header->NumVertices) * i);

        g_App.GetDevice()->CreateVertexBuffer(sizeof(MD2VertexT) * Header->NumTriangles * 3,
                                              D3DUSAGE_WRITEONLY,
                                              0,
                                              D3DPOOL_MANAGED,
                                              &pVertexBuffer,
                                              NULL);

        pVertexBuffer->Lock(0, 0, &pData, 0);

        for(int j = 0; j < Header->NumTriangles; j++){

            for(int k = 0; k < 3; k++){

                ((MD2VertexT*)pData)[3 * j + k].X = CurrentFrame->Vertex[Triangles[j].VertexIndices[k]].X * CurrentFrame->Scale[0] + CurrentFrame->Translate[0];
                ((MD2VertexT*)pData)[3 * j + k].Z = CurrentFrame->Vertex[Triangles[j].VertexIndices[k]].Y * CurrentFrame->Scale[1] + CurrentFrame->Translate[1];
                ((MD2VertexT*)pData)[3 * j + k].Y = CurrentFrame->Vertex[Triangles[j].VertexIndices[k]].Z * CurrentFrame->Scale[2] + CurrentFrame->Translate[2];

                ((MD2VertexT*)pData)[3 * j + k].Normal.x = MD2_NORMAL_TABLE[CurrentFrame->Vertex[j].NormalIndex][0];
                ((MD2VertexT*)pData)[3 * j + k].Normal.z = MD2_NORMAL_TABLE[CurrentFrame->Vertex[j].NormalIndex][1];
                ((MD2VertexT*)pData)[3 * j + k].Normal.y = MD2_NORMAL_TABLE[CurrentFrame->Vertex[j].NormalIndex][2];

                ((MD2VertexT*)pData)[3 * j + k].U = (float)(TexCoords[Triangles[j].TextureIndices[k]].s) / Header->SkinWidthPx;
                ((MD2VertexT*)pData)[3 * j + k].V = (float)(TexCoords[Triangles[j].TextureIndices[k]].t) / Header->SkinHeightPx;
            }
        }

        pVertexBuffer->Unlock();

        m_Frames.push_back(pVertexBuffer);
    }
...
    g_App.GetDevice()->SetTexture(0, m_pTexture);

    g_App.GetDevice()->SetStreamSource(0, m_Frames[Frame1], 0, sizeof(MD2VertexT));
    g_App.GetDevice()->SetStreamSource(1, m_Frames[Frame2], 0, sizeof(MD2VertexT));

    g_App.GetDevice()->DrawPrimitive(D3DPT_TRIANGLELIST,
                                     0,
                                     m_NumTriangles);

Und der glorreiche Ritter auf seiner Würfelburg
http://img98.imageshack.us/img98/1663/knightlb4.png
Grüße!
30.01.2009, 23:37:03 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: MD2 - Textur teilweise verzerrtNach oben.
Wow, über ein unbekanntes Format geschaut und nach einem kleinen Fehlschluss direkt den Fehler im Loader erwischt … ich bin wie Dr. House, nur dass ich euch weniger beleidige … das übernehmen meine Illustrationen für mich

Eins noch … ich finde deine ständigen verschachtelten Dereferenzierungen schauderhaft … mach es so:
Code:
MD2VertexT & CurrentVertex = ((MD2VertexT*)pData)[3 * j + k];
const MD2TexCoordT & CurrentTexCoord = TexCoords[Triangles[j].TextureIndices[k]];
CurrentVertex.U = float(CurrentTexCoord.s) / Header->SkinWidthPx;
CurrentVertex.V = float(CurrentTexCoord.t) / Header->SkinHeightPx;
Darf ich fragen, was die kleinen Dreiecke auf den Blöcken sind? Lichtquellen für Global Illumination? Sonst sehr hübsch

Gruß, Ky

Edit: Sag mal, kann es sein, dass dein Fenster nicht die richtige Größe hat und der Back-Buffer darum runterskaliert wird? Wenn du wirklich 800×600 Pixel anzeigen möchtest, dann muss du ::AdjustWindowRectEx() benutzen, um das Fenster ein wenig größer zu machen (oder alternativ ::GetClientRect() um den Back-Buffer kleiner zu machen) …

3 Mal gendert, zuletzt am 30.01.2009, 23:50:18 Uhr von Krishty.
30.01.2009, 23:44:22 Uhr
Cobi Offline
ZFX'ler


Registriert seit:
13.05.2004

Nordrhein-Westfalen
Re: MD2 - Textur teilweise verzerrtNach oben.
Der Backbuffer ist schon korrekt, nur meine Grafikkarte ist halb-kaputt, deswegen zock ich immoment auch nur Quake 2 mit Software Renderer..
Lichtquellen für Global Illumination, schön wärs.
Referenzen statt schachteln wird beherzigt.
31.01.2009, 00:24:51 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: MD2 - Textur teilweise verzerrtNach oben.
Schön dass es gelöst ist, unsere Probleme löst das natürlich nicht. Vielleicht bilde ich mir aber auch nur ein dass bei uns was falsch ist, bei der kleinen Texturauflösung ist das manchmal etwas schwer zu sagen

Könntest du dein Testmodell mal irgendwo uploaden bzw. mir zumailen? Nur zum Testen, versteht sich.

Gruß,
Alex
31.01.2009, 00:31:34 Uhr
Cobi Offline
ZFX'ler


Registriert seit:
13.05.2004

Nordrhein-Westfalen
Re: MD2 - Textur teilweise verzerrtNach oben.
Das Model gibts hier
http://polycount.com/models/quake2/pknight/
Den Code meines MD2-Loaders hab ich auch mal hochgeladen
http://rapidshare.com/files/191797762/Tischdecke.rar.html
Viel Erfolg
31.01.2009, 00:36:46 Uhr
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel