Guybrush Threepwood Geschrieben 23. Juni 2003 Geschrieben 23. Juni 2003 Hi, ich ´hab mir in der letzten Zeit mal ein paar Direct3D 9 Tutoriols angeschaut, aber ich verstehe nie wie die Vertexstrukter aufgebaut werden muß um eine bestimmte Form zu erzielen. Folgende Struktur liefert z.B. ein Buntes Dreieck: CUSTOMVERTEX vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, }; [/PHP] Ich dachte erst das jedes Element für einen Punkt des Dreiecks stehen würde, wenn ich allerdings bestimmte Werte zuweise habe ich aufeinmal 2 Dreicke und wenn ich ein Element entferne ist es immer noch ein Dreieck:confused: Ich bin also etwas verwirrt und hoffe das mir das einer von euch erklären kann Gruß Guybrush Zitieren
Goos Geschrieben 23. Juni 2003 Geschrieben 23. Juni 2003 Hi Guybrush, also von D3D hab ich ja nu mal gar keine Ahnung ...hab mich aber mal mit OpenGL n bissl beschaeftigt. Vielleicht erzaehlst auch mal bei welchen Werten dir was passiert ist? ....und poste doch bitte auch mal noch etwas mehr Code...denn das was du hier gepostet hast zeichnet allein sicher noch kein Dreieck Goos Zitieren
Guybrush Threepwood Geschrieben 23. Juni 2003 Autor Geschrieben 23. Juni 2003 Also ich hab die Werte nicht mehr im Kopf und ich kanns hier auch leider nicht ausprobieren weil ich das Direct X 9 SDK hier nicht habe. Ok hier ist mal der ganze Code: #include <windows.h> #include <d3d9.h> LRESULT CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM); HRESULT InitD3D(); HRESULT InitVB(); HRESULT Render(); struct GLOBALS { HWND hMainWindow; IDirect3D9* pD3D; IDirect3DDevice9* pd3dDevice; IDirect3DVertexBuffer9* pVB; }g_={0,0,0,0}; struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // The transformed position for the vertex DWORD color; // The vertex color }; APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { MSG Msg; WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); wc.hCursor = LoadCursor(0,IDC_ARROW); wc.hInstance = hInstance; wc.lpfnWndProc = MainProc; wc.lpszClassName = "D3D Test"; if (!RegisterClass(&wc)) return FALSE; g_.hMainWindow = CreateWindow("D3D Test","D3D Test", WS_OVERLAPPEDWINDOW, 300,300, 350,300, GetDesktopWindow(),0, hInstance,0); ShowWindow(g_.hMainWindow,nCmdShow); UpdateWindow(g_.hMainWindow); if (InitD3D() != S_OK) { MessageBox(g_.hMainWindow,"Fehler","D3D Test",MB_APPLMODAL); } InitVB(); while(Msg.message != WM_QUIT) { if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } else Render(); } UnregisterClass("D3D Test",hInstance); return Msg.wParam; } LRESULT CALLBACK MainProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_DESTROY: { if (g_.pVB != NULL) g_.pVB->Release(); if (g_.pd3dDevice != NULL) g_.pd3dDevice->Release(); if (g_.pD3D != NULL) g_.pD3D->Release(); PostQuitMessage(0); return 0; } default: return DefWindowProc(hWnd,Msg,wParam,lParam); } } HRESULT InitD3D() { D3DPRESENT_PARAMETERS d3dpp; memset(&d3dpp,0,sizeof(D3DPRESENT_PARAMETERS)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; g_.pD3D = Direct3DCreate9(D3D_SDK_VERSION); if (g_.pD3D == NULL) { return E_FAIL; } if (g_.pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, g_.hMainWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_.pd3dDevice) != D3D_OK) { return E_FAIL; } return S_OK; } HRESULT InitVB() { // Initialize three vertices for rendering a triangle CUSTOMVERTEX vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, }; // Create the vertex buffer. Here we are allocating enough memory // (from the default pool) to hold all our 3 custom vertices. We also // specify the FVF, so the vertex buffer knows what data it contains. if( FAILED( g_.pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0, D3DFVF_XYZRHW|D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_.pVB, NULL ) ) ) { return E_FAIL; } // Now we fill the vertex buffer. To do this, we need to Lock() the VB to // gain access to the vertices. This mechanism is required becuase vertex // buffers may be in device memory. VOID* pVertices; if( FAILED( g_.pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) ); g_.pVB->Unlock(); return S_OK; } HRESULT Render() { g_.pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0); if( SUCCEEDED( g_.pd3dDevice->BeginScene() ) ) { g_.pd3dDevice->SetStreamSource( 0, g_.pVB, 0, sizeof(CUSTOMVERTEX) ); g_.pd3dDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); g_.pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); g_.pd3dDevice->EndScene(); } g_.pd3dDevice->Present(NULL,NULL,NULL,NULL ); return S_OK; } [/PHP] Zitieren
Goos Geschrieben 23. Juni 2003 Geschrieben 23. Juni 2003 Also fuer die Sache mit Wert löschen und trotzdem Dreieck haette ich wahrscheinlich ne Erklärung, kanns aber hier gerade auch nicht testen.......aber könntest du das heute Abend nochmal ausprobieren, bei welchen Werten du zwei Dreiecke bekommst? (ich bin schon sehr gespannt darauf ) Goos Zitieren
Guybrush Threepwood Geschrieben 23. Juni 2003 Autor Geschrieben 23. Juni 2003 Ja hatte ich eh vor. Weil mir kam noch die Idee das ich bei CreateVertexBuffer() dann auch anstatt 3*sizeof(), 2*sizeof() schreiben könnte/sollte. Zitieren
Goos Geschrieben 23. Juni 2003 Geschrieben 23. Juni 2003 Schonmal kein schlechter Einfall, denn wer weis, was im dritten Element deines vertices Arrays steht, welches es ansich gar nicht gibt Ach und wenn du das testest und auf deine zwei Dreiecke irgendwie kommst, dann versuch doch bitte auch noch ein D3DPT_TRIANGLESTRIP anstelle vom D3DPT_TRIANGLELIST. ...und nu schau zu, dass`d heim kommst...ich bin neugierig *g* Goos Zitieren
Guybrush Threepwood Geschrieben 23. Juni 2003 Autor Geschrieben 23. Juni 2003 Du mußt so oder so bis Morgen warten, weil ich zu Hause keinen Internetzugang habe:p Zitieren
Guybrush Threepwood Geschrieben 24. Juni 2003 Autor Geschrieben 24. Juni 2003 So ich hab gestern noch mal rumprobiert und wenn ich die Struktur so ändere: CUSTOMVERTEX vertices[] = { { 250.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, }; habe ich 2 Dreiecke. Wenn ich 1 Element entferne und dann auch 2*sizeof() schreibe, wird nichts dargestellt (was glaube ich auch verständlich ist), aber wenn ich noch ein Element hinzufüge und 4*sizeof() schreibe, bekomme ich trotzdem das selbe Dreieck:confused: Zitieren
Goos Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Moin wie du deine zwei Dreiecke machst is mir noch nicht so recht klar, aber mal sehn. Original geschrieben von Guybrush Threepwood Wenn ich 1 Element entferne und dann auch 2*sizeof() schreibe, wird nichts dargestellt (was glaube ich auch verständlich ist), aber wenn ich noch ein Element hinzufüge und 4*sizeof() schreibe, bekomme ich trotzdem das selbe Dreieck:confused: ......also...das ganze is so -> D3DPT_TRIANGLELIST Renders the specified vertices as a sequence of isolated triangles. Each group of three vertices defines a separate triangle. was soviel heisst, wie es ist vollkommen egal, was du in deinem vertices Array drine hast seiens nun 1,2,3,4,5 oder was weiss ich wieviele Punkte. Es kommt einfach darauf an, wie gross du deinen Vertex Buffer anlegst, was du ja auch mit 2*sizeof() usw. schon unterschiedlich machst. (ok, es ist unguenstig, wenn du mehr Elemente in den Buffer schieben willst, als dein Array enthaelt ) Wenn du nun D3DPT_TRIANGLELIST zeichnest und hast weniger als 3 Vertices im Buffer, dann geht nix, denn zwei Punkte ergeben kein Dreieck. Hast du aber 4 Vertices im Buffer, dann gibt das auch nur das erste Dreieck. Zwei Dreiecke werdens dann logischerweise ab 6 Vertices im Buffer. Ich hoffe, dass ich mich irgendwie verstaendlich ausgedrueckt hab. Goos Zitieren
Guybrush Threepwood Geschrieben 24. Juni 2003 Autor Geschrieben 24. Juni 2003 Die Idee hatte ich auch schon. Ich hab 6 Elemente in das Array gschrieben und die entsprechende Größe angegeben, trotzdem hatte ich nur ein Dreieck. Da mein Dreieck aber auch nicht so ganz einwnadfrei dargestellt wird, probiere ich es am besten erst nochmal in dem Original Tutorial aus. Ich schreib dann am Freitag (Mittwoch+Donnerstag=Schule:( )wie`s gelaufen ist. Zitieren
Goos Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Ich hab das gerade mal fix unter OpenGL nachgestellt und da funktioniert das mit nur einem Dreieck und bei 6 vertices dann mit 2 usw. (vielleicht muss man aber auch dazu sagen, dass es nicht ganz gleich geschieht wie in dem Beispiel hier) Ich muss mir das DX SDK wohl doch mal holen. ...ach und dann zum Testen...du verwendest das Beispiel komplett so wie du es hier gepostet hast, also nix anderes dazu, drumrum oder was weiss ich wie? Goos Zitieren
Guybrush Threepwood Geschrieben 24. Juni 2003 Autor Geschrieben 24. Juni 2003 Das ist aber glaube ich über 300MB Groß Ja ich benutze es noch genauso wie ich`s oben gepostet habe. Zitieren
Goos Geschrieben 24. Juni 2003 Geschrieben 24. Juni 2003 Original geschrieben von Guybrush Threepwood Das ist aber glaube ich über 300MB Groß Macht nix...wozu gibts denn die huebschen bunten MSDN CD`S Zitieren
Guybrush Threepwood Geschrieben 25. Juni 2003 Autor Geschrieben 25. Juni 2003 Hab´s gestern geschafft 4 Dreiecke zu erzeugen, die zusammen ein Viereck bilden und Farblich ineinanderlaufen. *ganz stolz sei* Ich mußte "nur" diese beiden Zeilen löschen: d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; [/PHP] und in der Funktion DrawPrimitiv() auch angeben das es mehr wie eine Struktur ist Heute Abend versuche ich jetzt die zu rotieren:rolleyes: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.