Direct3D 10 Programm kompiliert zwar, zeigt aber nichts an



  • Wunderschönen guten Abend :),

    Ich bin dabei mir mal eine kleine solide Grundlage, für ein weiteres Vorhaben zu verschaffen... Bis jetzt hab ich die Doku vom SDK zu rate gezogen und mir mal folgendes zusammengeschustert:

    CPhysicsD3D.cpp

    #include "CPhysicsD3D.h"
    
    CPhysicsD3D::CPhysicsD3D(HWND _hWnd, int width, int height)
    	: hWnd(_hWnd), d3dWidth(width), d3dHeight(height)
    {
    }
    
    HRESULT CPhysicsD3D::CreateD3DDevice()
    {
    	HRESULT hr;
    
    	if(FAILED(hr = CreateD3DDeviceAndSwapChain()))     return hr;
    	if(FAILED(hr = CreateD3DViewPort()))               return hr;
    	if(FAILED(hr = CreateD3DEffectAndTechnique()))     return hr;
    	if(FAILED(hr = CreateD3DInputLayout()))            return hr;
    	if(FAILED(hr = CreateD3DIndexAndVertexBuffers()))  return hr;
    	if(FAILED(hr = CreateD3DMatrices()))               return hr;
    
    	return S_OK;
    }
    
    HRESULT CPhysicsD3D::CreateD3DDeviceAndSwapChain()
    {
    	HRESULT hr;
    
    	DXGI_SWAP_CHAIN_DESC d3dSwapChainDesc;
    
    	ZeroMemory(&d3dSwapChainDesc, sizeof(d3dSwapChainDesc));
    	d3dSwapChainDesc.BufferCount = 1;
    	d3dSwapChainDesc.BufferDesc.Width = d3dWidth;
    	d3dSwapChainDesc.BufferDesc.Height = d3dHeight;
    	d3dSwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    	d3dSwapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
    	d3dSwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    	d3dSwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    	d3dSwapChainDesc.OutputWindow = hWnd;
    	d3dSwapChainDesc.SampleDesc.Count = 1;
    	d3dSwapChainDesc.SampleDesc.Quality = 0;
    	d3dSwapChainDesc.Windowed = true;
    
    	if(FAILED(hr = D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, NULL,
    												 D3D10_SDK_VERSION, &d3dSwapChainDesc, &d3dSwapChain, &d3dDevice)))  return hr;
    	ID3D10Texture2D* d3dBackBuffer;
        if(FAILED(hr = d3dSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID *) &d3dBackBuffer)))				 return hr;
    	if(FAILED(hr = d3dDevice->CreateRenderTargetView(d3dBackBuffer, NULL, &d3dRenderTargetView)))					 return hr;
    
    	d3dDevice->OMSetRenderTargets(1, &d3dRenderTargetView, NULL);
        d3dBackBuffer->Release();
    
    	return S_OK;
    }
    
    HRESULT CPhysicsD3D::CreateD3DViewPort()
    {
    	D3D10_VIEWPORT d3dViewPort;
    
        d3dViewPort.Width = d3dWidth;
        d3dViewPort.Height = d3dHeight;
        d3dViewPort.MinDepth = -10.0f;
        d3dViewPort.MaxDepth = 10.0f;
        d3dViewPort.TopLeftX = 0;
        d3dViewPort.TopLeftY = 0;
    
    	d3dDevice->RSSetViewports(1, &d3dViewPort);
    
    	return S_OK;
    }
    
    HRESULT CPhysicsD3D::CreateD3DEffectAndTechnique()
    {
    	HRESULT hr;
    
    	DWORD d3dShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;
    
    	if(FAILED(hr = D3DX10CreateEffectFromFile(L"render.fx", NULL, NULL, "fx_4_0", d3dShaderFlags, 0, 
    											  d3dDevice, NULL, NULL, &d3dEffect, NULL, NULL)))
    	{
    		MessageBox(NULL, L"FX-Datei wurde nicht gefunden!", L"Fehler", MB_OK);
    		return hr;
    	}
    
        d3dEffectTechnique = d3dEffect->GetTechniqueByName("Render");
    
    	return S_OK;
    }
    
    HRESULT CPhysicsD3D::CreateD3DInputLayout()
    {
    	HRESULT hr;
    
    	D3D10_INPUT_ELEMENT_DESC layout[] =
        {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    		{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
        };
    
    	D3D10_PASS_DESC d3dPassDesc;
    	d3dEffectTechnique->GetPassByIndex(0)->GetDesc(&d3dPassDesc);
    
    	if(FAILED(hr = d3dDevice->CreateInputLayout(layout, sizeof(layout) / sizeof(layout[0]), d3dPassDesc.pIAInputSignature, 
    												d3dPassDesc.IAInputSignatureSize, &d3dInputLayout))) return hr;
    
    	d3dDevice->IASetInputLayout(d3dInputLayout);
    
    	return S_OK;
    }
    
    HRESULT CPhysicsD3D::CreateD3DIndexAndVertexBuffers()
    {
    	HRESULT hr;
    
    	CVertex vertices[] =
    	{
    		{ D3DXVECTOR3( -1.0f,  1.0f, -1.0f ), D3DXVECTOR4( 0.0f, 0.0f, 1.0f, 1.0f ) },
    		{ D3DXVECTOR3(  1.0f,  1.0f, -1.0f ), D3DXVECTOR4( 0.0f, 1.0f, 0.0f, 1.0f ) },
    		{ D3DXVECTOR3(  1.0f,  1.0f,  1.0f ), D3DXVECTOR4( 0.0f, 1.0f, 1.0f, 1.0f ) },
    		{ D3DXVECTOR3( -1.0f,  1.0f,  1.0f ), D3DXVECTOR4( 1.0f, 0.0f, 0.0f, 1.0f ) },
    		{ D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR4( 1.0f, 0.0f, 1.0f, 1.0f ) },
    		{ D3DXVECTOR3(  1.0f, -1.0f, -1.0f ), D3DXVECTOR4( 1.0f, 1.0f, 0.0f, 1.0f ) },
    		{ D3DXVECTOR3(  1.0f, -1.0f,  1.0f ), D3DXVECTOR4( 1.0f, 1.0f, 1.0f, 1.0f ) },
    		{ D3DXVECTOR3( -1.0f, -1.0f,  1.0f ), D3DXVECTOR4( 0.0f, 0.0f, 0.0f, 1.0f ) }
        };
    
    	DWORD indices[] =
    	{
    		3,1,0,
    		2,1,3,
    
    		0,5,4,
    		1,5,0,
    
    		3,4,7,
    		0,4,3,
    
    		1,6,5,
    		2,6,1,
    
    		2,7,6,
    		3,7,2,
    
    		6,4,5,
    		7,4,6,
        };
    
        D3D10_BUFFER_DESC d3dVertexBufferDesc;
        d3dVertexBufferDesc.Usage = D3D10_USAGE_DEFAULT;
        d3dVertexBufferDesc.ByteWidth = sizeof(CVertex) * 8;
        d3dVertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
        d3dVertexBufferDesc.CPUAccessFlags = 0;
        d3dVertexBufferDesc.MiscFlags = 0;
    
        D3D10_BUFFER_DESC d3dIndexBufferDesc;
        d3dIndexBufferDesc.Usage = D3D10_USAGE_DEFAULT;
        d3dIndexBufferDesc.ByteWidth = sizeof(DWORD) * 36;
        d3dIndexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
        d3dIndexBufferDesc.CPUAccessFlags = 0;
        d3dIndexBufferDesc.MiscFlags = 0;
    
        D3D10_SUBRESOURCE_DATA d3dVertexInitData;
        d3dVertexInitData.pSysMem = vertices;
    
        D3D10_SUBRESOURCE_DATA d3dIndexInitData;
        d3dIndexInitData.pSysMem = indices;
    
        if(FAILED(hr = d3dDevice->CreateBuffer(&d3dVertexBufferDesc, &d3dVertexInitData, &d3dVertexBuffer)))  return hr;
    	if(FAILED(hr = d3dDevice->CreateBuffer(&d3dIndexBufferDesc, &d3dIndexInitData, &d3dIndexBuffer)))     return hr;
    
    	UINT offset = 0;
    	UINT stride = sizeof(CVertex);
    
        d3dDevice->IASetVertexBuffers(0, 1, &d3dVertexBuffer, &offset, &stride);
    	d3dDevice->IASetIndexBuffer(d3dIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
    
        d3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    
    	return S_OK;
    }
    
    HRESULT CPhysicsD3D::CreateD3DMatrices()
    {
    	// Welt-Matrix
    	D3DXMatrixIdentity(&d3dWorldMatrix);
    
    	// View-Matrix (Kamera)
    	D3DXVECTOR3 Eye(0.0f, 0.0f, -20.0f);
    	D3DXVECTOR3 At(0.0f, 1.0f, 0.0f);
    	D3DXVECTOR3 Up(0.0f, 1.0f, 0.0f);
    	D3DXMatrixLookAtLH(&d3dViewMatrix, &Eye, &At, &Up);
    
    	// Projektions-Matrix
    	D3DXMatrixPerspectiveFovLH(&d3dProjectionMatrix, (float) D3DX_PI * 0.5f, (float) (d3dWidth / d3dHeight), 0.1f, 100.0f);
    
    	return S_OK;
    }
    
    void CPhysicsD3D::Render()
    {
    	static float deltaTime = 0.0f, currentTime = GetTickCount(), pastTime = GetTickCount();
    	currentTime = GetTickCount();
    	deltaTime = currentTime - pastTime;
    	pastTime = currentTime;
    
    	float ClearColor[4] = {0.0f, 0.2f, 0.4f, 1.0f};
    	d3dDevice->ClearRenderTargetView(d3dRenderTargetView, ClearColor);
    
    	D3D10_TECHNIQUE_DESC d3dTechniqueDesc;
    	d3dEffectTechnique->GetDesc(&d3dTechniqueDesc);
    	for(UINT i = 0; i < d3dTechniqueDesc.Passes; i++)
    	{
    		d3dEffectTechnique->GetPassByIndex(i)->Apply(0);
    		d3dDevice->DrawIndexed(36, 0, 0);
    	}
    
    	d3dSwapChain->Present(0, 0);
    }
    
    void CPhysicsD3D::ReleaseD3D()
    {
    	if(d3dDevice)			 d3dDevice->ClearState();
    	if(d3dSwapChain)		 d3dSwapChain->Release();
    	if(d3dRenderTargetView)	         d3dRenderTargetView->Release();
    	if(d3dInputLayout)		 d3dInputLayout->Release();
    	if(d3dEffect)			 d3dEffect->Release();
    	if(d3dVertexBuffer)		 d3dVertexBuffer->Release();
    	if(d3dIndexBuffer)		 d3dIndexBuffer->Release();
        if(d3dDevice)			 d3dDevice->Release();
    }
    

    Kompiliert alles auch wunderbar und ist laut SDK Tutorial auch korrekt (hab mir natürlich alles geordnet udn so, um den Überbllick zu behalten und es für folgende Dinge brauchbar zu machen)...

    Nun vermag ich aber nicht den Fehler zu finden, Vertexbuffer wird gefüllt, Indexbuffer wird gefüllt, render-methode müsste nun das ganze zeichnen, aber dem ist nicht so... 😕 Habe vorher natürlich versucht es irgendwie allein hinzubekommen, aber jetzt denk ich mir langsam, es ist wohl besser euch mal zu fragen.

    PS: Was ich auch noch interessant fänd zu wissen, wär wie ich einen std::vector zu einem array konvertieren kann, damit ichs auch dem vertexbuffer zum futtern geben könnte ^^, ich denke grad so an's einlesen von einem Obj-File...

    Danke an alle im Voraus!



  • Bestimmt kann dir Kóyaánasqatsi weiterhelfen, unser Uberpr0.
    Ok Spaß beiseite;)

    Ich habe deinen Code nur überflogen (ist mir ehrlich gesagt bissi viel), aber was mir aufgefallen ist: Die Min/MaxDepth deines Viewports finde ich seltsam. Setze sie mal auf 0 und 1.
    Falls es das nicht ist: Gibt es keine Debug Errors oder Warnings? Sind wirklich alle HRESULT Rückgabewerte ok?

    Was ich auch noch interessant fänd zu wissen, wär wie ich einen std::vector zu einem array konvertieren kann, damit ichs auch dem vertexbuffer zum futtern geben könnte

    Da gibt es mehrere Möglichkeiten. Wenn du eine tiefe Kopie brauchst, allokiier einfach ein dynamisches Array und kopiere die Daten mit std::copy(v.begin(), v.end(), array). Für eine flache Kopie (im Falle eines VB Map() ausreichend) reicht einfach ein &v[0].



  • this->that schrieb:

    Bestimmt kann dir Kóyaánasqatsi weiterhelfen, unser Uberpr0.
    Ok Spaß beiseite;)

    Lol.



  • arghhh, hatte vergessen die viewport depth zurückzusetzen ^^ hatte nur mal geändert um zu gucken ob das damit was zutun haben könnte... hatte es nicht ^^ vernachlässigt das bitte



  • Irgendjemand, der iwas findet, was im Code das Problem auslösen könnte? :p
    Ich vergleich schon die ganze Zeit mim DirectX SDK, aber ich schein blind zu sein...



  • Alles funktioniert also, die Buffers werden aufgefüllt, die Calls laufen problemlos, nur wird nichts gezeichnet? Aus persönlicher Erfahrung tippe ich in diesen Fällen immer auf Probleme mit Mathematik (also konkret eine zerschossene Matrix im System). Ich empfehle, nach etwas derartigem zu suchen. Wo werden in deinem Code die Matrizen überhaupt gesetzt?

    MfG



  • Hier werden die eigentlich gesetzt, hab's wie gesagt erstmal Schritt für Schritt wie im SDK gemacht, um Fehler zu vermeiden... -.-:

    HRESULT CPhysicsD3D::CreateD3DMatrices() 
    { 
        // Welt-Matrix 
        D3DXMatrixIdentity(&d3dWorldMatrix); 
    
        // View-Matrix (Kamera) 
        D3DXVECTOR3 Eye(0.0f, 0.0f, -20.0f); 
        D3DXVECTOR3 At(0.0f, 1.0f, 0.0f); 
        D3DXVECTOR3 Up(0.0f, 1.0f, 0.0f); 
        D3DXMatrixLookAtLH(&d3dViewMatrix, &Eye, &At, &Up); 
    
        // Projektions-Matrix 
        D3DXMatrixPerspectiveFovLH(&d3dProjectionMatrix, (float) D3DX_PI * 0.5f, (float) (d3dWidth / d3dHeight), 0.1f, 100.0f); 
    
        return S_OK; 
    }
    

    Ich frag mich auch, ob man die Datei mit dem HLSL-Zeug grundsätzlich benötigt... Weil ab Tutorial 2 im SDK, taucht das einfach auf, ohne jede weitere Erklärung...



  • Dein At ist vermutlich falsch.



  • Ok, also ich hab ihn jetzt mal wild in alle Richtungen gucken lassen, kann aber keinen Würfel finden ^^ Das wär ja auch zu schön gewesen



  • Ok soll ich vllt einfach mal alles an Code Posten??? Vllt hilft euch das mehr...

    Ich versuche weiter den Fehler zu finden aber was ich auch mache, es mag mich wohl einfach nicht ^^



  • ach kommt schon 😃 ihr sollt ja nich meinen ganzen code neuschreiben, hinweise reichen doch völlig


Anmelden zum Antworten