Texture Mapping in Direct3D 9



  • Hi,.

    habe vor ein paar Tagen angefangen D3D9 zu lernen. Bin auch am anfang ganz gut vorangekommen, nur hab ich im Moment ein Problem...

    Habe also ein PRogramm geschrieben, das einen Würfel rendert, dabei ist der Würfel auch rotierbar, scalierbar, etc...

    Nur klappt das mit dem Texture Mapping halt noch nicht so ganz.

    Ich lade also die Textur, und lasse die auf den Würfel zeichnen, gezeichnet wird sie, nur "irgendwie komisch"... Es sieht auß, als wenn die Textur hinter dem Würfel läge und der Würfel nur so ne Art Sichtfenster darstellt, also wie beim Colorkeying von DDraw, durch den Würfel kann man also auf den Hintergrund sehen, durch den Rest des Bildes nicht!

    Wenn ihr euch das mal anschauen wollt, hier der Link: www.codetown.de/download/D3D9Cube.zip

    Tasten:
    - Rechts, Links, Oben, Unten, PAge Up, Page Down=um verschiedene Achsen drehen
    - Plus, Minus= scalieren
    - f = FILLMODE=SOLID/WIREFRAME

    Der Code zum zeichnen der Textur ist dann der hier:

    //Beginn des Zeichenvorgangs
        if(SUCCEEDED(lpD3DDevice->BeginScene()))
        {
            InitWVPMatrices();
            lpD3DDevice->SetFVF(D3DFVF_TFCVERTEX);
    
            lpD3DDevice->SetTexture(0,SampleTexture);
    
            if(FillMode==1)
            {
                lpD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
                lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
                lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 ); 
                lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE);
            }
            else if(FillMode==0)
            {
                lpD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
                lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
                lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
                lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
            }
            //setup texture
    
            lpD3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
            lpD3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
    
            //lpD3DFont->DrawText(100,100,0,"LOL");
    
            lpD3DDevice->SetStreamSource( 0, lpD3DCubeVertexBuffer, 0, sizeof(TFCVERTEX) );
            lpD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, NumberVertices/3 );
    
            //lpD3DDevice->SetStreamSource( 0, lpD3DPlaneVertexBuffer, 0, sizeof(TFCVERTEX) );
            //lpD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
    
            //lpD3DDevice->SetStreamSource( 0, lpD3DSocketVertexBuffer, 0, sizeof(TFCVERTEX) );
            //lpD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 10 );
    
            // Ende des Zeichenvorgangs
            lpD3DDevice->EndScene();
        }
        //Das gerenderte Bild auf den Bildschrim blitten.
        lpD3DDevice->Present(NULL,NULL,NULL,NULL);
    

    Wenn ihr noch mehr Code zum gucken braucht dann sacht das, ist kein Problem das hochzuladen...

    THX
    PH



  • Das Problem kenne ich... einen Würfel zu texturieren, so dass auf jeder Seitenfläche die Textur korrekt dargestellt wird, ist nicht so einfach - wenn man nur mit 8 einmaligen Eckpunkten arbeiten möchte. Vielleicht ist es sogar ganz unmöglich - ich weiß es nicht.
    Ein Ausweg ist, für jede Seitenfläche vier Extra-Eckpunkte zu erzeugen. D.h. jeder Eckpunkt des Würfels existiert dreimal, aber mit verschiedenen Texturkoordinaten.



  • Das Problem kenne ich... einen Würfel zu texturieren, so dass auf jeder Seitenfläche die Textur korrekt dargestellt wird, ist nicht so einfach - wenn man nur mit 8 einmaligen Eckpunkten arbeiten möchte. Vielleicht ist es sogar ganz unmöglich - ich weiß es nicht.
    Ein Ausweg ist, für jede Seitenfläche vier Extra-Eckpunkte zu erzeugen. D.h. jeder Eckpunkt des Würfels existiert dreimal, aber mit verschiedenen Texturkoordinaten.

    Alles schon gemacht, insgesamt 36 Vektoren angegeben.
    IndexedPrimitives zu zeichnen muss ich erst noch lernen...

    PH


Anmelden zum Antworten