Vertexbuffer mit Indizes lässt sich nicht rendern
-
Ich habe testweise einen Würfel erstellt, der besteht aus einem Vertexbuffer mit 24Vertizes (6Seiten mit je 4Vertizes) und einen Indexbuffer mit 36Indizes (6für jede Seite, da jede Seite aus 2Dreiecken besteht).
Außerdem hat das ganze eine Textur.
Die Daten in den Vertex- und Index-Buffern stimmen, habe mir alles ausgeben lassen und kontrolliert.
Allerdings zeigt es auch nichts sauber an, die Textur wird rechts oben im Fenster angezeigt und der Hintergrund wechselt zwischen grün und pink.
Habe sicher irgendeine Kleinigkeit vergessen (kenn mich mit DX nicht so super aus).Ich werde mal den Code Auszugsweise posten:
Vertexstruktur
struct UntransVertex { //Im Tutorial vom DX SDK wird TEX1 verwendet, warum nicht TEX0? static const DWORD FVF = D3DFVF_XYZ | D3DFVF_TEX1; float x,y,z; float u,v; };D3D Initialisierung
D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferCount = 2; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.BackBufferWidth = 0; d3dpp.BackBufferHeight = 0; if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } D3DXMATRIX mat; D3DXVECTOR3 pos( 0, 0, -6 ); D3DXVECTOR3 la( 0, 0, 0 ); D3DXVECTOR3 up( 0, 1, 0 ); D3DXMatrixLookAtLH( &mat, &pos, &la, &up ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &mat ); //Fensterauflösung ist 640*480 => 4/3 aspect D3DXMatrixPerspectiveFovLH( &mat, D3DX_PI / 4, 1.333f, 1.0f, 10000.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &mat );Die Render-Funktion
VOID Render() { if( NULL == g_pd3dDevice ) return; // Clear the backbuffer to a black color g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); // Begin the scene if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { // Rendering of scene objects can happen here D3DMATERIAL9 material = { 0 }; D3DCOLORVALUE tmp = { 1, 0, 0, 0 }; material.Diffuse = tmp; g_pd3dDevice->SetTexture( 0, g_pTex ); g_pd3dDevice->SetMaterial( &material ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); g_pd3dDevice->SetIndices( g_pIb ); g_pd3dDevice->SetStreamSource( 0, g_pVb, 0, sizeof( UntransVertex ) ); g_pd3dDevice->SetFVF( UntransVertex::FVF ); g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12 ); g_pd3dDevice->SetStreamSource( 0, NULL, 0, 0 ); // End the scene g_pd3dDevice->EndScene(); } // Present the backbuffer contents to the display g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); }Ich verwende das Grundgerüst von Tutorial01 aus dem Sample, da ich derzeit noch keine aktive Awendung hab, also ohne Benutzeraktionen wird nicht gerendet nur wenn etwas passiert (im mom ist das bei WM_MOUSEMOVE der Fall), wenn ich also die Maus bewege fängt der Hintergrund von dem anfangs schwarz(wenn ich gar nichts mache) zu diesem grün zu pink geflacker anzufangen und die Textur wird rechts oben angezeigt.
Das Material zu verwenden und die entsprechenden TextureStageStates habe ich eingefügt, weil ich dachte, dass D3D vllt. Probleme hat, weil ich da keins habe, aber hat nichts geändert.
-
was für ausgaben macht direct3d im debugger?
-
D3D sagt
Direct3D9: (ERROR) :Invalid flag D3DCLEAR_ZBUFFER: no zbuffer is associated with device. Clear failed.
Dachte ich hätte AutoDepthStencilFormat gewählt in den D3DPRESENT_PARAMETERS, aber da hab ich mich wohl getäuscht.
Habe das jetzt nachgeholt, jetzt ist das Grün-Pink-Flackern weg, aber die Textur hängt immernoch rechts oben.
Meine Vertizes für den Würfel sehen so aus:static UntransVertex cube[ 24 ] = { //front { 0, 5, 0, 0, 0 }, //1 { 0, 0, 0, 0, 1 }, //2 { 5, 0, 0, 1, 1 }, //3 { 5, 5, 0, 1, 0 }, //7 //back { 0, 5, 5, 0, 0 }, //6 { 0, 0, 5, 0, 1 }, //5 { 5, 0, 5, 1, 1 }, //4 { 5, 5, 5, 1, 0 }, //8 //left { 0, 5, 0, 0, 0 }, //1 { 0, 0, 0, 0, 1 }, //2 { 0, 0, 5, 1, 1 }, //5 { 0, 5, 5, 1, 0 }, //6 //right { 5, 5, 0, 0, 0 }, //7 { 5, 0, 0, 0, 1 }, //3 { 5, 5, 5, 1, 1 }, //8 { 5, 0, 5, 1, 0 }, //4 //top { 0, 5, 5, 0, 1 }, //6 { 0, 5, 0, 0, 1 }, //1 { 5, 5, 0, 1, 1 }, //7 { 5, 5, 5, 1, 0 }, //8 //bottom { 0, 0, 5, 0, 1 }, //5 { 0, 0, 0, 0, 1 }, //2 { 5, 0, 0, 1, 1 }, //3 { 5, 0, 5, 1, 0 } //4 };Der Würfel sitzt am Koordinatenursprung und dehnt sich dann in die positiven Achsenrichtungen aus (je 5Einheiten).
-
Nach einigem experimentieren bin ich dahinter gekommen, dass alles einwandfrei läuft, wenn ich die Koordinaten im Bereich [-1;1] angebe.
Das wundert mich jetzt doch etwas. Kann mir jemand erklären wie ich bei Direct3D meine Koordinaten wählen muss und wie ich dann Größen entsprechend verwenden kann?
Ich habe meine nahe Clipping Ebene bei 1.0 und die Ferne bei 10000.0
Gedacht sind diese Einheiten als Zentimeter (der Würfel wäre also 5cm X 5cm X 5cm).Wie macht man das denn richtig?