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
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mirac« (08.12.2014, 09:56)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Doch, wenn's möglich ist, macht man das eigentlich schon. Zumindest versucht man es.Nein man rendert normalerweise nicht die Szene mit einem einzigen Draw-Call.
SwapChain::Present rendert überhaupt gar nichts.zum Schluss wenn alle Objekte einer Szene in den Backbuffer gezeichnet sind, renderst du die Szene mittelsIDXGISwapChain:resent.
Und wenn man das so macht, geht sämtliche Performance an hunderten Bind-Calls kaputt.du schreibst dir eine Klasse für ein Objekt, diese beinhalten einen Vertex- und einen Indexbuffer, sowie alle weiteren benötigten Daten (z.B. Poition, Rotation etc.)
Klingt vernünftig. Z.B. XNA sammelt alle Vertex-Daten aller Objekte in einem gemeinsamen Buffer und rendert sie dann in einem einzigen Call.So wie ich das in meinem Beispiel-Programm (welches ein Dreieck zeichnet) gemacht habe, werden diese Dreiecke einfach in einem std::vector<VERTEX> geschrieben, und dann über den Renderer gerndert. Dieser
schreibt die Daten in den Buffer und rendert diese. (Das Programm funktioniert)
C-/C++-Quelltext |
|
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 |
#include "stdafx.h" #include "CRenderer.h" /* * Constructor of CRenderer * ----------------------- * */ CRenderer::CRenderer(CDirectX* p_directx) : m_directx(p_directx) {}; /* * Destructor of CRenderer * ---------------------- * */ CRenderer::~CRenderer() {}; /* * Function CRenderer::Render * -------------------------- * * Renders the vertexes in the buffer * */ void CRenderer::Render(std::vector<VERTEX>* p_ver) { // Convert to Array VERTEX ver[MAX_PRIMITIVE]; int i = 0; for(std::vector<VERTEX>::iterator it = p_ver->begin(); it != p_ver->end(); it++) { ver[i] = *it; i++; } // Create buffer D3D11_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = D3D11_USAGE_DYNAMIC; bd.ByteWidth = sizeof(VERTEX) * sizeof(ver)/sizeof(ver[0]); bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; m_directx->dev->CreateBuffer(&bd, NULL, &m_directx->vbuffer); // Fillin buffer D3D11_MAPPED_SUBRESOURCE ms; m_directx->devcon->Map(m_directx->vbuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); memcpy(ms.pData, ver, sizeof(ver)); m_directx->devcon->Unmap(m_directx->vbuffer, NULL); // Render UINT stride = sizeof(VERTEX); UINT offset = 0; m_directx->devcon->IASetVertexBuffers(0, 1, &m_directx->vbuffer, &stride, &offset); m_directx->devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_directx->devcon->Draw(sizeof(ver)/sizeof(ver[0]), 0); // Delete the buffer SafeRelease(&m_directx->vbuffer); }; /* * Function CRenderer::Clear * ------------------------- * * Clears the screen * */ void CRenderer::Clear(D3DXCOLOR p_color) { m_directx->devcon->ClearRenderTargetView(m_directx->backbuffer, p_color); }; /* * Function CRenderer::Present * --------------------------- * * Presents the backbuffer as the frontbuffer * */ void CRenderer::Present() { m_directx->swapchain->Present(0, 0); }; // |
C-/C++-Quelltext |
|
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 |
#include "stdafx.h" #include "CWindow.h" #include "CDirectX.h" #include "CRenderer.h" /* * Function WinMain * ---------------- * * This function ist the startpoint of our application * */ int WINAPI WinMain(HINSTANCE p_hInstance, HINSTANCE p_hPrevInstance, LPSTR p_lpCmdLine, int p_nCmdShow) { // Create Window CWindow window(p_hInstance); window.Create(L"DirectX Test", 800, 600); // Create DirectX CDirectX directx; directx.Init(&window); // Render CRenderer renderer(&directx); std::vector<VERTEX> ver; ver.push_back(VERTEX(0.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f))); ver.push_back(VERTEX(0.45f, -0.5, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f))); ver.push_back(VERTEX(-0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f))); // Enter the main loop MSG msg; while(window.IsOpen()) { if(window.HasMsg()) { msg = window.GetMsg(); TranslateMessage(&msg); DispatchMessage(&msg); if(msg.message == WM_QUIT) window.Close(); } renderer.Clear(D3DXCOLOR(0.0f, 1.0f, 0.5f, 1.0f)); renderer.Render(&ver); renderer.Present(); } return EXIT_SUCCESS; }; // |
Gut. Aus Performancesicht solltest du aber dringend den Vertexbuffer nicht in jedem Frame neu erstellen. Das ist sauteuer.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dafür braucht's dann wieder einen neuen Batch + RenderCall. Mit dem richtigen Shader sollte das aber auch in einem gehen.Und wie bildet XNA dann verschiedene Texturen oder andere Zustände ab?
Werbeanzeige