DirectX 9 Sphere Texture



  • Hallo,
    hab zur zeit ein merkwürdiges problem mit Texturen für ein Sphere.
    Mein Code funktioniert eigentlich, diesmal aber irgendwie nicht.

    #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_TEX1)
    
    struct CUSTOMVERTEX
    {
    
    	FLOAT x, y, z;   
    	FLOAT tu, tv;		
    	DWORD color;
    	D3DXVECTOR3 pos;     
    	D3DXVECTOR3 norm;    
    
    };
    
    	if (TRUE) {
    		d3ddev->SetTexture(0, texture);
    			}
    
    LPDIRECT3DVERTEXBUFFER9 CloneVertexBuffer;
    
    	D3DXCreateSphere(d3ddev, 50.0f, 50, 50, &CloneMesh, NULL);
    
    	CloneMesh->CloneMeshFVF(0, CUSTOMFVF, d3ddev, &Mesh);
    
    	if (SUCCEEDED(Mesh->GetVertexBuffer(&CloneVertexBuffer)))
    	{
    		CUSTOMVERTEX *pVertices = NULL;
    		int nNumVerts = Mesh->GetNumVertices();
    		CloneVertexBuffer->Lock(0, 0, (void**)&pVertices, 0);
    		{
    
    		}
    		for (int i = 0; i < nNumVerts; i++) {
    			pVertices->tu = (pVertices->x) / D3DX_PI + 0.5f;
    			pVertices->tv = (pVertices->y) / D3DX_PI + 0.5f;
    
    		}
    

    Die Textur wird nicht richtig angezeit, viel zu klein.

    Für hilfe vielen Dank.


  • Mod

    welches format sollte denn dein FVF/vertex haben?



  • Ich nutze ein Customvertex das muss nicht kompliziert sein genau wie das FVF.

    struct CUSTOMVERTEX
    {
    
        FLOAT x, y, z;  
        FLOAT tu, tv;      
    
    };
    

    Das hier würde mir als Vertext schon reichen.

    Und das hier als FVF.

    #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_TEX1)
    

    Mir ist aufgefallen das beim debugen nach einer kleinen änderung jetzt diese Fehlermeldung angezeigt wird: Access violation writing location.

    Geänder hab ich diesen Teil

    for (int i = 0; i < nNumVerts; i++) {
    			pVertices->tv = (pVertices->x) / D3DX_PI + 0.5f;
    			pVertices->tu = (pVertices->y) / D3DX_PI + 0.5f;
    			pVertices++;
    		}
    

    Und zwar ein pVertices++; hinzugefügt.


  • Mod

    dein vertexformat war wohl vorher inkompatibel zum FVF.

    der neue fehler ist natuerlich nicht toller 🙂

    schau nach ob du beim lock wirklich den pointer bekommst (ueberpruef ob ein fehler zurueckgegeben wird).
    vergisst du auch nicht das lock wieder zu unlocken? (der code ausschnitt deckt das nicht ab).



  • Danke für die Hilfe.

    So geht es jetzt zwar aber die Textur für die Sphere wird nicht richtig angezeigt.
    Alle andere schon.

    #define CUSTOMFVF (D3DFVF_XYZ |  D3DFVF_TEX1 )
    
    struct CUSTOMVERTEX
    {
    
    	FLOAT x, y, z;    // from the D3DFVF_XYZRHW flag
    	FLOAT tu, tv;		//Texture Coridinates
    };
    
    	int nNumVerts = CloneMesh->GetNumVertices();
    		CloneVertexBuffer->Lock(0, 0, (void**)&pVertices, 0);
    		{
    
    		}
    		for (int i = 0; i < nNumVerts; i++) {
    			pVertices->tv = (pVertices->x) / D3DX_PI+ 0.5f;
    			pVertices->tu = (pVertices->y) / D3DX_PI + 0.5f;
    			pVertices++;
    		}
    
    		CloneVertexBuffer->Unlock();
    		CloneVertexBuffer->Release();
    	}
    

    Kann man vieleicht über TextureStages die Texture richtig ausrichten ?.
    Oder fehlt in meinem FVF vieleicht etwas?.


  • Mod

    ElTorro schrieb:

    die Textur für die Sphere wird nicht richtig angezeigt.
    Alle andere schon.

    was bedeutet das nur 😉

    CloneVertexBuffer->Release();
    

    [/quote]
    sicher dass du den buffer gleich nach dem unlock freigeben moechtest?

    Kann man vieleicht über TextureStages die Texture richtig ausrichten ?.
    Oder fehlt in meinem FVF vieleicht etwas?.

    um was zu erreichen, von welchem ausgangspunkt? ich kann die ganze zeit nur annehmen was passiert, aber jetzt hab ich keine ahnung 😉



  • Also mein Code sieht jetzt so aus

    #define CUSTOMFVF (D3DFVF_XYZ |  D3DFVF_TEX1 | D3DFVF_NORMAL)
    
    struct CUSTOMVERTEX
    {
    
    	FLOAT x, y, z;    // from the D3DFVF_XYZRHW flag
    	FLOAT tu, tv;		//Texture Coridinates
    	D3DXVECTOR3 norm;
    };
    
            LPDIRECT3DVERTEXBUFFER9 CloneVertexBuffer;
    
    	D3DXCreateSphere(d3ddev, 50.0f, 50, 50, &CloneMesh, NULL);
    
    	CloneMesh->CloneMeshFVF(0, CUSTOMFVF, d3ddev, &Mesh);
    	CUSTOMVERTEX *pVertices = NULL;
    
    	if (SUCCEEDED(StarBallMesh->GetVertexBuffer(&CloneVertexBuffer)))
    	{
    		int nNumVerts = CloneMesh->GetNumVertices();
    		CloneVertexBuffer->Lock(0, 0, (void**)&pVertices, 0);
    		{
    
    		}
    		for (int i = 0; i < nNumVerts; i++) {
    			pVertices->tv = (pVertices->norm.x) / D3DX_PI+ 0.5f;
    			pVertices->tu = (pVertices->norm.y) / D3DX_PI + 0.5f;
    			pVertices++;
    		}
    
    		CloneVertexBuffer->Unlock();
    		CloneVertexBuffer->Release();
    	}
    ;
    

    Leider werden die Texturen nur leer angezeigt.


  • Mod

    aus welcher doku hast du diese reihenfolge der vertexdaten? ich glaube die ist verkehrt (lange her seit ich das letzte mal DX9 style gemacht hab).



  • Vielen Dank für die Hilfe.

    Ich hab das Problem jetzt mit einem zweiten Vertext und FVF extra für das Sphere gelöst.

    Über Texturstages hat es nicht funktioniert keine ahnung warum.


  • Mod

    nun geht alles? super! 🙂



  • Falls jemanden die lösung interesiert.

    Extra für Sphere ein Vertex und FVF

    struct _VERTEX
    {
    	D3DXVECTOR3 pos;     
    	D3DXVECTOR3 norm;    
    	float tu;            
    	float tv;
    } VERTEX, *LPVERTEX;
    #define FVF_VERTEX    D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1
    

    Das Sphere sieht dann so aus.

    LPDIRECT3DVERTEXBUFFER9 VertexBuffer;
    LPD3DXMESH Mesh;
    LPD3DXMESH BallMesh;
    D3DXCreateSphere(d3ddev, 10.0f, 50, 50, &Mesh,NULL);
    
    Mesh->CloneMeshFVF(0, FVF_VERTEX, d3ddev, &BallMesh);
    
    	if (SUCCEEDED(BallMesh->GetVertexBuffer(&VertexBuffer)))
    	{
    		int nNumVerts = Mesh->GetNumVertices();
    		CloneVertexBuffer->Lock(0, 0, (void**)&LPVERTEX, 0);
    		{
    
    		}
    		for (int i = 0; i < nNumVerts; i++) {
    			LPVERTEX->tu = asinf(LPVERTEX->norm.x) / D3DX_PI+ 0.5f;
    			LPVERTEX->tv = asinf(LPVERTEX->norm.y) / D3DX_PI + 0.5f;
    			LPVERTEX++;
    		}
    
    		VertexBuffer->Unlock();
    		VertexBuffer->Release();
    	}
    ;
    

    So funktioniert es bei mir.


  • Mod

    danke fuers posten der Loesung 👍


Anmelden zum Antworten