Multitexturing mit Alphamaps unter DirectX sauber darstellen



  • Hallo,

    ich programmiere mit C++ in DirectX und möchte ein Terrain so darstellen, dass es auch von nahem gut aussieht. Die Größe des Terrains ist 200x100. Es soll alles ganz flach sein und keine Erhebungen haben. Die Texturen, die ich verwendet habe sind 512x512 Pixel groß. Nun habe ich bereits zwei Texturen(eine Gras und Sandtextur) mit Multitexturing und Alphamaps zusammengefügt.

    Wenn ich nun mit der Kamera ranzoome sieht es nicht so detailiert aus. Wie kann ich den Detailgrad erhöhen? Ich denke die Textur an sich ist mit 512x512 Pixel groß genug. Auch ein Test mit einer 1024x1024 Textur war nicht viel besser.

    Mir würden zur Not auch Stichwörter reichen, wonach ich suchen muss, um dieses Problem in den Griff zu bekommen.

    Gruß Urmel1



  • Ich habe jetzt mal die Textur durch Veänderung des Customvertex die Texturen weiter unterteilt. Nun gibt es aber auch das Problem, dass ich in der Mitte einen Streifen habe(wenn ich die Koordinaten z.b. auf 2.0f setze). Kennt jemand das Problem und weiss eine Lösung dazu?



  • Deine Texturen muessen wiederholbar sein (rechte Seite an die linke passen, ebenso oben/unten).



  • Erst mal Danke für Deine Antwort. Ich verwende als Textur testweise die von Nvidia zur Verfügung gestellte Grastextur. (siehe http://developer.nvidia.com/object/IO_TTVol_01.html)

    hier die Bild URL:
    http://img65.imageshack.us/img65/7956/unbenanntxt6.th.jpg

    Den Customvertex habe ich wie folgt definiert:

    struct CUSTOMVERTEX {FLOAT X, Y, Z; D3DVECTOR NORMAL; FLOAT U1, V1, U2, V2;};
    #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX4)
    

    Erstellt habe ich den Vertex folgendermaßen:

    //VERTEX BUFFER ********************************************************
    	vert_Ebene_Buffer = NULL;
    	D3DVECTOR Normale= {0.0f, 1.0f, 0.0f};
    	CUSTOMVERTEX vert_Ebene[] =
    	{
          {-200.0f, -1.2f, 100.0f, Normale, 0.0f, 4.0f, 0.0f, 4.0f},
          { 200.0f, -1.2f, 100.0f, Normale, 0.0f, 0.0f, 0.0f, 0.0f},
          {-200.0f, -1.2f,-100.0f, Normale, 4.0f, 4.0f, 4.0f, 4.0f},
          { 200.0f, -1.2f,-100.0f, Normale, 4.0f, 0.0f, 4.0f, 0.0f},
    	};
    
    	// create a vertex buffer interface called t_buffer
    	pd3ddev->CreateVertexBuffer(8*sizeof(CUSTOMVERTEX),
    															0,
    															CUSTOMFVF,
    															D3DPOOL_MANAGED,
    															&vert_Ebene_Buffer,
    															NULL);
    
    	VOID* pVoid;    // a void pointer
    
    	// lock t_buffer and load the vertices into it
    	vert_Ebene_Buffer->Lock(0, 0, (void**)&pVoid, 0);
    	memcpy(pVoid, vert_Ebene, sizeof(vert_Ebene));
    	vert_Ebene_Buffer->Unlock();
    

    Was mache ich da falsch, denn ich habe es auch mal mit einer "Tiled Textur" versucht, aber ähnliches Bild, siehe hier:

    http://img135.imageshack.us/img135/2351/unbenannt2gz1.th.jpg

    Gruß Urmel1



  • Offensichtlich ist das Gras wiederholbar und die Tapete nicht.
    Was versteht Du daran nicht?



  • Also die Tapete habe ich von dieser Seite genommen, wo ja extra die Wiederholbarkeit produziert wurde.
    http://www.cgtextures.com/content.php?action=tutorial&name=tilingpatterns
    Auf der Seite habe ich das letzte Bild genommen und in mein Projekt kopiert.

    Naja, da ich die Tapetentextur eh nicht nehmen will, sondern eine Sand/Gras Textur ist das in diesem Fall auch nicht so wild. Eine richtig saubere Lösung ist die momentane Grastextur aber auch nicht, wenn man genauer hinschaut.

    Hast Du oder jemand anderes noch eine gute Anleitung, wie man das "Tiling" gut hinbekommt? Ich hatte in der Anleitung (http://forum.worldofplayers.de/forum/showthread.php?p=6509258) nicht wirklich verstanden, wie das funktioniert, da sehr spärlich drauf eingegangen wird. Ich habe die Textur geladen und mit Photoshop den Offsetfilter jeweils auf die Hälfte der Bildgröße gestellt, in meinem Fall also auf jeweils +512. Muss ich dafür eigentlich vorher die Ränder markieren?

    Das eigentliche Ziel was über all dem steht ist, dass die Bodentextur auch beim ranzoomen etwas detaillierte dargestellt wird und nicht so verschwommen ist.

    http://img137.imageshack.us/img137/1133/unbenannt3ea5.th.jpg

    So habe ich die Textur dann gesetzt:

    pd3ddev->SetTexture(0, texture_1);
    pd3ddev->SetTexture(1, texture_1);
    // draw the textured square
    pd3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 8);
    

    Gruß Urmel1



  • pd3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 8);
    

    Warum renderst Du eigentlich 8 Triangles wenn nur zwei im Vertexbuffer drin sind?



  • Ok, danke für den Hinweis. Das war wohl ein kleiner Denkfehler.
    Hat sonst noch jemand eine Idee, wie ich die Bodentextur noch detaillierter hinbekomme? Ich denke die Größe von 1024*1024 sollte doch ausreichend sein.



  • Haeufig blendet man dazu Texturen unterschiedlichen Detailgrades mit entsprechenden Skalierungen uebereinander.
    Die detailierteste Schicht verschwindet dann bei groesserer Entfernung durch Mipmapping.


Anmelden zum Antworten