Texturen?



  • der oben gepostet Code bringt leider nichts zur Ausgabe.
    d.h. man sieht zumindest nichts...
    Könntet ihr mir sagen was falsch ist...

    nein, das koennen wir leider nicht - dafuer muesste man mindestens noch die "draw"-methode sehen.
    ich kann aber mal raten:
    - deine triangles sind im uhrzeigersinn definiert: backface-culling?
    - alle textur-koordinaten sind null: sind die polygone einfach schwarz?
    - benutzt du beleuchtung? (es gibt keine normalen)
    - sind sinnvolle matrizen gesetzt?



  • Zuerst die Draw-Methode

    device->SetStreamSource(0,VB_TRIANGLE,0,sizeof(CUSTOMVERTEX));
    device->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    

    Dann...bisher hat alles funktionert..bis ich die Variablen tu und tv eingeführt hab..für die Texturen..davor wurde das WireFrame schön angezeigt...
    bei solid...wurden die Farben der vertices vermischt..is ja gut und schön aber mit der Textur war das gleiche...hat einfach die Farben der eckpunkte und der am meisten in der bitmap vorkommenden Farbe angenommen...
    und das ist das problem...
    + das nichts angezeigt wird...
    Mit Worldmatrix und dgl. hab ich noch nichts gemacht..hab mir das erst ein bissl angesehen aber noch nicht implementiert weils bisher auch gefunzt hat...
    habt ihr ne idee?



  • das hoert sich fast so an, als haettest du einfach die textur-koordinaten in deine vertex-struktur eingefuegt aber das vertex-format (D3D_CUSTOMVERTEX) nicht mit angepasst...



  • Hmm, ich glaub, du machst da was falsch.

    Bye, TGGC (Get the next best thing)



  • Wie ist das eigentlich mit den Vertex Formaten? Gibts bei DirectX nicht schon die üblichen wie z.B. (XYZ, UV, Normal, Color) irgendwie fertig?



  • aber mit der Textur war das gleiche...
    hat einfach die Farben der eckpunkte und der am meisten in der bitmap vorkommenden Farbe angenommen...

    wie schon gesagt: da alle eckpunkte die gleiche textur-koordinate (0,0) haben, werden zwangslaeufig alle pixel deines polygons mit der gleichen farbe aus der textur gefuellt.

    Wie ist das eigentlich mit den Vertex Formaten?
    Gibts bei DirectX nicht schon die üblichen irgendwie fertig?

    das flexible-vertex-format ist eine entsprechende flag-kombination der enthaltenen komponenten,
    zb: D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1
    das setzt allerdings voraus, dass die jeweiligen komponenten in der vertex-struktur an der richtigen stelle stehen und der compiler keine alignment-experimente macht.
    alternative waere eine vertex-declaration.

    leider hat man bisher weder das eine noch das andere gesehen 😉



  • hellihjb schrieb:

    das flexible-vertex-format ist eine entsprechende flag-kombination der enthaltenen komponenten,
    zb: D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1
    das setzt allerdings voraus, dass die jeweiligen komponenten in der vertex-struktur an der richtigen stelle stehen und der compiler keine alignment-experimente macht.

    Das weiß ich ja, deswegen habe ich mich eben gefragt, obs nich schon das übliche gibt in DirectX:

    struct Vertex {
       float x, y, ,z;
       float u, v;
       float nx, ny, nz;
    }; //oder so
    


  • obs nich schon das übliche gibt in DirectX

    waere die frage was "das uebliche" ist...
    es waere ja unsinn, wenn alle moeglichen attribut-kombinationen schon als vertex-struktur vorgefertigt waeren.
    man moechte auch erst gar nicht ueber deren namensgebung nachdenken 😉



  • ok ich habs geschafft das bild anzeigen zu lassen..allerdings dürfte irgendwas mit dem koordinaten echt nicht stimmen...

    #include "vSprite.h"
    #include <string.h>
    
    void cVSprite::init(LPDIRECT3DDEVICE9 dev, LPCSTR Path, float set_x, float set_y){
    
    x=set_x;
    y=set_y;
    device=dev;
    
    strcpy(FileName,Path);
    
    D3DXIMAGE_INFO ImgInfo;
    D3DXGetImageInfoFromFile(FileName,&ImgInfo);
    size_x=ImgInfo.Width;
    size_y=ImgInfo.Height;
    
    // KOORDS
    square[0]=set_vertex(0,1,0,D3DCOLOR_ARGB(127,0,255,0),0,0);
    square[1]=set_vertex(1,1,0,D3DCOLOR_ARGB(127,0,255,0),1,0);
    square[2]=set_vertex(0,0,0,D3DCOLOR_ARGB(127,0,255,0),0,1);
    square[3]=set_vertex(0,0,0,D3DCOLOR_ARGB(127,0,255,0),0,1);
    square[4]=set_vertex(1,1,0,D3DCOLOR_ARGB(127,0,255,0),1,0);
    square[5]=set_vertex(1,0,0,D3DCOLOR_ARGB(127,0,255,0),1,1);
    
    BYTE *VertexBufferStart;
    
    device->CreateVertexBuffer(sizeof(square),
    						   D3DUSAGE_WRITEONLY,
    						   D3D_CUSTOMVERTEX,
    						   D3DPOOL_MANAGED,
    						   &VB_TRIANGLE,
    						   NULL);
    
    VB_TRIANGLE->Lock(0,0,(void**)&VertexBufferStart,0);
    memcpy(VertexBufferStart,square,sizeof(square));
    VB_TRIANGLE->Unlock();
    device->SetFVF(D3D_CUSTOMVERTEX);
    
    device->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
    device->SetRenderState(D3DRS_ZENABLE,TRUE);
    
    D3DXCreateTextureFromFile(device,FileName,&lpTexture);
    
    device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
    
    device->SetTexture(0,lpTexture);
    
    }
    
    void cVSprite::Set_Position(float set_x, float set_y){
    x=set_x;
    y=set_y;
    
    square[0]=set_vertex(x,y,0,		         D3DCOLOR_ARGB(127,0,255,0),0,0);
    square[1]=set_vertex(x+size_x,y,0,		 D3DCOLOR_ARGB(127,0,255,0),1,0);
    square[2]=set_vertex(x,y+size_y,0,		 D3DCOLOR_ARGB(127,0,255,0),0,1);
    square[3]=set_vertex(x,y+size_y,0,	     D3DCOLOR_ARGB(127,0,255,0),0,1);
    square[4]=set_vertex(x+size_x,y,0,	     D3DCOLOR_ARGB(127,0,255,0),1,0);
    square[5]=set_vertex(x+size_x,y+size_y,0,D3DCOLOR_ARGB(127,0,255,0),1,1);
    
    BYTE *VertexBufferStart;
    
    device->CreateVertexBuffer(sizeof(square),
    						   D3DUSAGE_WRITEONLY,
    						   D3D_CUSTOMVERTEX,
    						   D3DPOOL_MANAGED,
    						   &VB_TRIANGLE,
    						   NULL);
    
    VB_TRIANGLE->Lock(0,0,(void**)&VertexBufferStart,0);
    memcpy(VertexBufferStart,square,sizeof(square));
    VB_TRIANGLE->Unlock();
    
    device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
    
    }
    
    void cVSprite::draw(){
    
    device->SetStreamSource(0,VB_TRIANGLE,0,sizeof(CUSTOMVERTEX));
    device->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    
    }
    
    CUSTOMVERTEX cVSprite::set_vertex(float set_x,float set_y,float set_z, DWORD set_color,float set_tu,float set_tv){
    
    CUSTOMVERTEX vertex;
    
    vertex.x=set_x;
    vertex.y=set_y;
    vertex.z=set_z;
    vertex.color=set_color;
    vertex.tu=set_tu;
    vertex.tv=set_tv;
    
    return vertex;
    
    }
    

    Das ist die ganze .cpp datei...
    Ich verstehe nicht warum die koordinaten 1 bzw 0 so eine auswirkung haben...
    das ergebnis sieht ungefähr so aus:

    B-------------|   B...Bildschirm
    |        |---||   P...Bild
    |        |-P-||
    |        |---||
    |             |
    |-------------|
    

    Ich habe Biespielkoordinaten aus dem Buch genommen und eingesetzt...5 bzw -5 und dabei ist das bild um ein vielfaches vergrößert worden ...
    dann hab ich diese durch 1 bzw 0 ersetzt und dabei kam das raus...



  • So hab herausgefunden wieso...
    Der Ursprung befindet sich also genau in der Mitte des Bilschirms und nicht mehr links oben!...
    und davon ausgehend skalieren die Vertices das Bild...
    d.h. wenn ich 1 einstelle füllt das bild die rechte Hälfte bzw. das rechte obere Viertel aus...
    +Die Kamera hat sieht anscheinend nur diesen Bereich...d.h. muss ich die Kamera dann nach "hinten" verschieben damit ich das Bild sozusagenin Normalgröße betrachten kann?!



  • Der Ursprung befindet sich also genau in der Mitte des Bilschirms und nicht mehr links oben!

    willkommen in der dritten dimension 😉
    die tatsaechlichen bildschirmkoordinaten sind natuerlich abhaengig von den entsprechenden matrizen; dh genau jetzt waere der richtige augenblick, eventuelle defizite in linearer algebra auszubuegeln 🙂

    es ist uebrigens nicht notwenig jedes mal in "Set_Position" einen neuen vertexbuffer zu erstellen, du koenntest dir auch einfach den aus "init" merken...



  • Der Ursprung befindet sich also genau in der Mitte des Bilschirms und nicht mehr links oben!

    willkommen in der dritten dimension 😉

    😃
    ja ich werd mir die matrizen mal ansehen...
    @vertexbuffer: ja stimmt, danke!

    werd mich mal mit der kamera beschäftigen...
    allerdings weiß ich noch imemr nicht wie ich eiune bestimmte farbe transparent machen kann wenn ich die textur lade...



  • wie ich eiune bestimmte farbe transparent machen kann wenn ich die textur lade

    speicher' die textur mit alpha-channel und aktiviere alpha-test oder -blending.


Anmelden zum Antworten