Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
tbResult Render(float fZeit) { float fAspect; //Hier werden die Daten des Bildseitenverhälltnisses gespeichert tbMatrix mCamera; //KameraMatrix tbMatrix mProjection; //ProjektionsMatrix tbMatrix mRotation; tbMatrix mTranslation; tbMatrix mWorld; HRESULT hResult; //Leeren des Z - Buffers und BildBuffer if(FAILED(hResult = g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0))) { //Fehler beim leeren aufgetreten TB_ERROR_DIRECTX("g_p3DDevice->Clear", hResult, TB_STOP); } for (int iRender = 0; iRender <= g_iNumTriangle; iRender++) { //Rotation und Translation des Dreiecks erzeugen mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fZeit * 45.0f)); mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 0.0f)); //Beide Matrizen Kombinieren und zur Welt zusammenfügen mWorld = mRotation * mTranslation; g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld)); } //Mit der Funktion wird die Scene begonnen g_pD3DDevice->BeginScene(); //Erzeugen der KameraMatrix mCamera = tbMatrixCamera(g_vCameraPosition, g_vCameraPosition + tbVector3(sinf(g_fCameraAngle), 0.0f, cosf(g_fCameraAngle)), tbVector3(0.0f, 2.0f, 0.0f)); //Hier wird die KameraMatrix in die Scene eingesezt g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera)); //Berechnen des Bildseitenverhältnisses fAspect = (float)(g_Direct3DParameters.VideoMode.Width) / (float)(g_Direct3DParameters.VideoMode.Height); //Erzeugung udn Einsetzen der ProjektionsMatrix einma Pro Bild da es Variable ist mProjection = tbMatrixProjection(g_fFOV, fAspect, 0.0f, 250.0f); //Einsetzen g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection)); //Nun Werden die alle Würfel auf einmal gezeichnet //Zu erst wird der Vertex und danach der IndexBuffer als Datenquelle ausgelesen. g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(SVertex)); g_pD3DDevice->SetIndices(g_pIndexBuffer); //Nun Soll auch Gezeichnet werden hResult = g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, //DreieckListe 0, //BasisvertexIndex 0, //Der kleinsteIndex g_iNumCubes * 8, //Diff. zw. größtem u. kleinsten Index 0, //Von anfang an Zeichnen g_iNumCubes * 12); //12 Dreiecke Pro Würfel if(FAILED(hResult)) { MessageBox(NULL, "Das Objekt konnte nicht gezeichnet werden !", "Fehler", MB_OK | MB_ICONEXCLAMATION); //Fehler beim Zeichen ist aufgetreten TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_ERROR); } //Beenden der Scene g_pD3DDevice->EndScene(); //Speicherinhalt aus dem Speicher Holen und auf dem Bildschirm anzeigen g_pD3DDevice->Present(NULL, NULL, NULL, NULL); //Gibt 0 Zurück wenn alles OK return TB_OK; } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
tbResult InitScene() { HRESULT hResult; SVertex* pVertices; unsigned short* pusIndices; tbVector3 vCubePosition; // Vertexformat setzen - Positions-, Farb- und Texturkoordinatenangabe if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1))) { MessageBox(NULL, "VertexFormat konnte nicht gesezt werden !", "Fehler", MB_OK | MB_ICONEXCLAMATION); // Fehler beim Setzen des Vertexformats! TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR); } // Beleuchtung und Culling ausschalten, Dithering aktivieren g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); // Bilineare Texturfilter mit linearem MIP-Mapping g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // Die Textur laden if(FAILED(hResult = D3DXCreateTextureFromFileEx(g_pD3DDevice, // Device "kork3.jpg", // Dateiname D3DX_DEFAULT, // Breite D3DX_DEFAULT, // Höhe D3DX_DEFAULT, // MIP-Maps 0, // Verwendungszweck D3DFMT_UNKNOWN, // Format D3DPOOL_MANAGED, // Speicherklasse D3DX_FILTER_NONE, // Filter D3DX_DEFAULT, // MIP-Map-Filter 0, // Color-Key NULL, // Unwichtig NULL, // Unwichtig &g_pTexture))) // Die Textur { MessageBox(NULL, "Textur konnte nicht geladen werden!", "Fehler", MB_OK | MB_ICONEXCLAMATION); // Fehler! TB_ERROR_DIRECTX("D3DXCreateTextureFromFileEx", hResult, TB_ERROR); } // Und nun die Textur einsetzen g_pD3DDevice->SetTexture(0, g_pTexture); //Erstellen des VertexBuffers, Da Jeder Würfel 8 Vertizes benötigt. Ist die //Grösse des Puffers >= der Anzahl der Würel mal 8 mal Vertexgrösse. if(FAILED(hResult = g_pD3DDevice->CreateVertexBuffer(g_iNumCubes * 8 * sizeof(SVertex), 0, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1, D3DPOOL_MANAGED, &g_pVertexBuffer, NULL))) { MessageBox(NULL, "Vertex Buffer konnte nicht ersetellt werden!", "Fehler", MB_OK | MB_ICONEXCLAMATION); //Fehler beim erstellen des Vertexpuffers!!!! TB_ERROR_DIRECTX("g_pD3DDevice->CreateVertexbuffer", hResult, TB_ERROR); } //Nun wird hier der Index-Buffer erstellt jeder Würfel braucht 36 Indizes //es wird hier für ein 16bit Index Buffer verwendet if(FAILED(hResult = g_pD3DDevice->CreateIndexBuffer(g_iNumCubes * 36 * 2, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &g_pIndexBuffer, NULL))) { MessageBox(NULL, "Indexbuffer konnte nicht erstellt werden!", "Fehler", MB_OK | MB_ICONEXCLAMATION); //Fehler beiom erstellen des Index Buffers TB_ERROR_DIRECTX("g_pD3DDevice->CreateIndexBuffer", hResult, TB_ERROR); } //Hier werden nun der INdex und der Vertex Buffer komplett geperrt g_pVertexBuffer->Lock(0, 0, (void**)(&pVertices), D3DLOCK_NOSYSLOCK); g_pIndexBuffer->Lock(0, 0, (void**)(&pusIndices), D3DLOCK_NOSYSLOCK); //int iCube = 1; tbVector3 vCube; int iStartVertex; int iStartIndex; for(int iCube = 0; iCube < g_iNumCubes; iCube++) { //Position des Würfels bestimmen vCube = tbVector3(0.0, 0.0, 2.0f); //StartVertex und StartIndex für die Würfel berechnen, //Diese Werte beschreiben an welcher Stelle im Index und VertexBuffer //dei DAten des Aktuellen Würfels beginnen. iStartVertex = iCube * 8; iStartIndex = iCube * 36; //Vertizes Für diesen Würfel erstellen, Als erste die Position pVertices[iStartVertex + 0].vPosition = vCube + tbVector3(-1.0f, 1.0f, -1.0f); pVertices[iStartVertex + 1].vPosition = vCube + tbVector3(-1.0f, 1.0f, 1.0f); pVertices[iStartVertex + 2].vPosition = vCube + tbVector3( 1.0f, 1.0f, 1.0f); pVertices[iStartVertex + 3].vPosition = vCube + tbVector3( 1.0f, 1.0f, -1.0f); pVertices[iStartVertex + 4].vPosition = vCube + tbVector3(-1.0f, -1.0f, -1.0f); pVertices[iStartVertex + 5].vPosition = vCube + tbVector3(-1.0f, -1.0f, 1.0f); pVertices[iStartVertex + 6].vPosition = vCube + tbVector3( 1.0f, -1.0f, 1.0f); pVertices[iStartVertex + 7].vPosition = vCube + tbVector3( 1.0f, -1.0f, -1.0f); for(int iVertex = iStartVertex; iVertex < iStartVertex + 8; iVertex++) { //Texturkoordinaten auf Würfel legen pVertices[iVertex].vTexture = tbVector2Random(); //Farbe für den Würfel erzeugen pVertices[iVertex].dwColor = tbColorRandom(1.0f) * 2.0f; } } //Hier der Index int aiIndex[36] = { 0, 3, 7, 0, 7, 4, //Vorderseite 2, 1, 5, 2, 5, 6, //Rückseite 1, 0, 4, 1, 4, 5, //Rechte seite 3, 2, 6, 3, 6, 7, //Linke Seite 0, 1, 2, 0, 2, 3, //Oberseite 6, 5, 4, 6, 4, 7}; //Unterseite //Nun müssen noch die Daten aus dem VertexBuffer in den IndexBuffer übertragen werden, //Zu Jedem Indexwert muss auch noch der StartIndexwert Addiert werden. for(int iIndex = 0; iIndex < 36; iIndex++) { //Index Eintragen pusIndices[iStartIndex + iIndex] = aiIndex[iIndex + iStartVertex]; } //Nun wird der Index und der VertexBuffer entsperrt g_pVertexBuffer->Unlock(); g_pIndexBuffer->Unlock(); return TB_OK; } |
Zitat
//Nun müssen noch die Daten aus dem VertexBuffer in den IndexBuffer übertragen werden,
sie ist schon da, nur nicht da wo sie sein sollte ;D . :huhu:Zitat
Verdammt............... Wo fehlt denn nu diese doofe Klammer?
Anonymous
unregistriert
Zitat von »"Baltin"«
Quellcode
1 g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
Werbeanzeige