Texturen?



  • hi!
    Ich bastle gerade eine Sprite Klasse wobei ich auf ein paar Probleme gestoßen bin..
    zuerst mal der code:

    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;
    
    square[0]=set_vertex(x,y,1,0xFFFFFF,0,0);
    square[1]=set_vertex(x+size_x,y,0,0xFFFFFF,0,0);
    square[2]=set_vertex(x+size_x,y+size_y,0,0xFFFFFF,0,0);
    square[3]=set_vertex(x+size_x,y+size_y,0,0xFFFFFF,0,0);
    square[4]=set_vertex(x,y+size_y,0,0xFFFFFF,0,0);
    square[5]=set_vertex(x,y,0,0xFFFFFF,0,0 );
    
    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);
    
    }
    
    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;
    
    }
    

    1.)
    Das Problem ist dass keine Textur angezeigt wird...
    Allerdings wurde, bevor ich die variablen tu und tv eingeführt habe, das Gitternetz der Vertices korrekt angezeigt...
    +Als ich dann die Textur geladen habe, wurden die Farben der Textur mit denen der Vertices vermischt und ausgegeben...

    SetTextureStageState(0,D3DTSS_COLORP,D3DTOP_SELECTARG1);
    

    Sollte dies verhindern, allerdings verstehe ich nicht wieso die Farben überhaupt angezeigt wurden, weil ja die Zuweisung von Textur->Vertices vollkommen gefehlt hat!
    Ich bin nochnicht so vertraut mit der Texturierung und hoffe ihr könnte mir dabei helfen...

    2.)Beim Durchblättern meines schlauen Buchs, bin ich auf den hinweis gestoßen dass Direct3D 8 Texturen gleichzeitig verwalten kann...
    bedeutet dass das ich

    device->SetTexture(0,lpTexture);
    

    8 mal hintereinander aufrufen kann (ohne anderen Code dazwischen) und nicht mehr oder dass ich prinzipiell nur 8 Texturen verwalten kann?!?!

    MfG Kuldren



  • device->SetFVF(D3D_CUSTOMVERTEX);
    set_vertex(x,y,1,0xFFFFFF,0,0);
    

    da eigentlich alle relevanten stellen fehlen, rate ich erstmal das vertex-format: x,y,z, farbe, u,v ? 😉
    nur weil du keine textur-koordinaten in den vertexbuffer schreibst, heisst das nicht, dass keine drinstehen 🙂
    du kannst mit direct3d 8 textur-pipelines adressieren; praktischer weise ist dafuer der erste parameter gut 😉
    wenn du texturen einer bestimmten pipeline aktivierst, solltest du auch dafuer sorgen, diese irgendwann zu deaktivieren - sonst bleiben die halt an...
    warum schreibst du deine vertexdaten nicht direkt in den vertexbuffer?



  • da eigentlich alle relevanten stellen fehlen, rate ich erstmal das vertex-format: x,y,z, farbe, u,v ?

    Sorry..hatte ich vergessen...dachte es ist aus dem set_vertex ersichtlich...

    aufbau:

    struct CUSTOMVERTEX{
    
    	float x,y,z;
    	DWORD color;
    	float tu,tv;
    
    };
    
    class cVSprite{
    
    	float x,y,size_x,size_y;
    	LPDIRECT3DDEVICE9 device;
    	CUSTOMVERTEX square[6];
    	LPDIRECT3DVERTEXBUFFER9 VB_TRIANGLE;
    	LPDIRECT3DTEXTURE9 lpTexture;
    	char FileName[1024];
    
    public:
    
    		cVSprite(){};
    
    		void init(LPDIRECT3DDEVICE9 dev,LPCSTR Path,float set_x, float set_y);
    
    		void Set_Position(float set_x, float set_y);
    
    		void draw();
    
    		CUSTOMVERTEX set_vertex(float set_x,float set_y,float set_z, DWORD set_color,float set_tu,float set_tv);
    
    };
    
    Warum schreibst du deine vertexdaten nicht direkt in den vertexbuffer?
    

    wie genau?



  • wie genau?

    volatile CUSTOMVERTEX *VertexBuffer;
    VB_TRIANGLE->Lock(0,0,(void**)&VertexBuffer,0);
    VertexBuffer[0]=set_vertex(x,y,1,0xFFFFFF,0,0);
    // ...
    VB_TRIANGLE->Unlock();
    


  • Du kannst das beliebig oft aufrufen und auch beliebig viele Texturen haben. Aber es gibt eben nur 8 Sampler bzw. sind es je nach Hardware ehh weniger. Bitte lies das nächste mal die Doku!

    Bye, TGGC (Get the next best thing)



  • Irgendwie ist die Kernfrage untergegangen...
    der oben gepostet Code bringt leider nichts zur Ausgabe. d.h. man sieht zumindest nichts...
    Könntet ihr das mal testen bzw. mir sagen was falsch ist...
    Probleme-> Farben verschwimmen oder nichts wird ausgegeben...
    (wie oben beschrieben)

    +Ich würde gerne eine Farbe in der textur transparent machen(wenn es dann funktioniert)...leider steht in meinem schlauen buch nur was von eine "Ebene" zu einem gewissen Grad transparent machen...

    Du kannst das beliebig oft aufrufen und auch beliebig viele Texturen haben. Aber es gibt eben nur 8 Sampler bzw. sind es je nach Hardware ehh weniger

    Danke für die Info!

    MfG Kuldren



  • 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