Rendern in DirectX
-
Hallo
Ich versuche mich gerade an meinem ersten Direct3D-Programm. Ich benutze dazu Scherfgens Buch und dessen TriBase-Engine. Ich zerbreche mir nun schon ewig den Kopf, warum bei mir einfach kein rotierendes Dreieck angezeigt wird. Wahrscheinlich stehe ich wieder mal völlig auf dem Schlauch. Hier mal meine Render-Funktion:
tbResult Render(float SecPassed) { tbMatrix Rotation(tbMatrixRotationY(TB_DEG_TO_RAD(Time * 90.0f))); tbMatrix Translation(tbMatrixTranslation(tbVector3(0.0f,0.0f,2.0f))); tbMatrix World = Rotation * Translation; g_pD3DDevice->SetTransform(D3DTS_WORLD, reinterpret_cast<D3DMATRIX*>(&World)); g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,63),1.0f,0); g_pD3DDevice->BeginScene(); g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,Triangle,sizeof(Vertex)); g_pD3DDevice->EndScene(); g_pD3DDevice->Present(NULL,NULL,NULL,NULL); return TB_OK; }Ich würde mich sehr über Tipps freuen.
chrische
-
Was wird denn überhaupt angezeigt? Gar nix? Oder nur ein stehendes Dreieck und dann hast die Move-Funktion nicht erweitert? Also ich habe mich ganz genau an die Anweisungen von Scherfgen gehalten und dann hat es geklappt. Du scheinst das nicht zu tun

Zum Beispiel das Clear kommt nicht vor. Dann hast die Fehlermöglichkeiten nicht eingebaut. Usw. ^^Aber bei Problemen mit dem Buch empfehle ich http://www.scherfgen-software.net
Da hat es ein Forum wo man auch prima Hilfe bekommt. Steht allerdings auch im Buch ^^Grüssli
-
Hallo
Also es wird gar kein Dreieck angezeigt. Der Hintergund wird mit der angegeben Farbe gefüllt, aber das war's.
Die Clear-Methode gibt es definitv auch in dem Beispiel von Scherfgen. Ansonsten habe ich ein paar kleine Änderungen vorgenommen, die eigentlich nichts am Ergebnis ändern sollten. Da habe ich mich wohl getäuscht.

Ich habe natürlich auch geschaut, ob ich etwas vergessen habe, aber ich kann einfach nicht sehen, wo ich einen Fehler gemacht habe.chrische
-
Also in dem Code sehe ich ansich keine Fehler. Einzig was z.b. dafür sprechen würde, dass nichts angezeigt wird, ist wenn du im Triangle nix drin hast oder nicht das richtige

Probier doch mal den Fehler einzugrenzen, indem du langsam zurück zur Standardversion von Scherfgen gehst. Also immer auskommentieren und wenn es nix verändert wieder normal setzen oder lassen usw. ^^
Aja und hab hier das Buch vor mir. Das Clear steht bei mir nicht drin

Grüssli
-
Hallo
Dravere schrieb:
Also in dem Code sehe ich ansich keine Fehler. Einzig was z.b. dafür sprechen würde, dass nichts angezeigt wird, ist wenn du im Triangle nix drin hast oder nicht das richtige

Probier doch mal den Fehler einzugrenzen, indem du langsam zurück zur Standardversion von Scherfgen gehst. Also immer auskommentieren und wenn es nix verändert wieder normal setzen oder lassen usw. ^^
Aja und hab hier das Buch vor mir. Das Clear steht bei mir nicht drin

Grüssli
Ich weiß nicht, welche Auflage du hast, aber in der 2. Auflage Seite 143.
Ich habe die Renderfunktion schon komplett mit der von Scherfegn getauscht und trotzdem habe ich nichts gesehen. Ich stelle mal den ganzen Code rein:#include <Windows.h> #include <TriBase.h> #include <vector> #include "Direct3DEnum.h" #include "InitDirect3D.h" #include "InitWindow.h" #include "ErsteDreieck.h" #include "Resource.h" #ifdef _DEBUG #pragma comment(lib,"tribased.lib") #else #pragma comment(lib,"tribase.lib") #endif #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"dxerr9.lib") class Vertex { public: tbVector3 Position; DWORD Color; }; float Time = 0.0f; Vertex Triangle[3]; SDirect3DParameters D3DParam; tbResult Render(float SecPassed); tbResult Move(float SecPassed); tbResult InitScene(void); tbResult ExitScene(void); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { tbInit(); GetDirect3DParameters(&D3DParam); InitWindow(D3DParam.VideoMode.Width,D3DParam.VideoMode.Height,"Erstes Dreieck",LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_SMALL))); InitDirect3D(&D3DParam, g_hWindow); InitScene(); tbDoMessageLoop(Render,Move); ExitWindow(); ExitDirect3D(); tbExit(); return 0; } tbResult InitScene(void) { g_pD3DDevice->SetFVF(D3DFVF_XYZW | D3DFVF_DIFFUSE); g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); float Aspect = static_cast<float>(D3DParam.VideoMode.Width) / static_cast<float>(D3DParam.VideoMode.Height); tbMatrix Projection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),Aspect,0.1f,100.0f); g_pD3DDevice->SetTransform(D3DTS_PROJECTION,reinterpret_cast<D3DMATRIX*>(&Projection)); Triangle[0].Position = tbVector3(0.0f,1.0f,0.0f); Triangle[1].Position = tbVector3(1.0f,-1.0f,0.0f); Triangle[2].Position = tbVector3(-1.0f,-1.0f,0.0f); Triangle[0].Color = tbColor((BYTE)255,0,0); Triangle[1].Color = tbColor((BYTE)0,255,0); Triangle[2].Color = tbColor((BYTE)0,0,255); return TB_OK; } tbResult Render(float SecPassed) { tbMatrix Rotation(tbMatrixRotationY(TB_DEG_TO_RAD(Time * 90.0f))); tbMatrix Translation(tbMatrixTranslation(tbVector3(0.0f,0.0f,2.0f))); tbMatrix World = Rotation * Translation; g_pD3DDevice->SetTransform(D3DTS_WORLD, reinterpret_cast<D3DMATRIX*>(&World)); g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , D3DCOLOR_XRGB(0,0,63),1.0f,0); g_pD3DDevice->BeginScene(); g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,Triangle,sizeof(Vertex)); g_pD3DDevice->EndScene(); g_pD3DDevice->Present(NULL,NULL,NULL,NULL); return TB_OK; } tbResult Move(float SecPassed) { Time += SecPassed; return TB_OK; }chrische
-
Es liegt wahrscheinlich am FVF. Benutzt mal D3DFVF_XYZRHW. Dazu muss du noch eine Variable für das RHW deklarieren. Also ein Float und benutz, für jede Ecke des Dreieck, den Wert 1.0f. Hättes im DXSDK nachgeguckt, hättes du es schneller gefunden!
MFG Lars
-
-
Hallo
Ich habe statt:
g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);das hier
g_pD3DDevice->SetFVF(D3DFVF_XYZW | D3DFVF_DIFFUSE);benutzt und schon ging es nicht.
chrische
-
Ist ja klar, da Direct3D einen 4D Vector für die Vertices verlangt. Du ihn aber nur ein 3D Vector gibst!
MFG Lars
-
chrische5 schrieb:
Ich habe statt:
g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);das hier
g_pD3DDevice->SetFVF(D3DFVF_XYZW | D3DFVF_DIFFUSE);benutzt und schon ging es nicht.
Na das ist ja ein Ding! f'`8k
AutocogitoBye, TGGC (\-/ returns)
-
Hallo,
setz mal die Z-Koordinate deines Dreiecks > 0.0f
Triangle[0].Position = tbVector3(0.0f,1.0f,1.0f); Triangle[1].Position = tbVector3(1.0f,-1.0f,1.0f); Triangle[2].Position = tbVector3(-1.0f,-1.0f,1.0f);Dann sollte es eigentlich was anzeigen.
-
class Vertex { public: tbVector3 Position; DWORD Color; };Versuch mal, deine Vertizes al sstruct und nicht als Klasse zu deklarieren.
struct Vertex { tbVector3 Position; DWORD Color; };