[DX11] Rendertarget ohne z-buffering

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

[DX11] Rendertarget ohne z-buffering

Beitrag von Grubenlord »

Hallo,
ich lege mir ganz normal nach diversen Anleitungen ein RenderTarget an:

Code: Alles auswählen

	D3D11_TEXTURE2D_DESC renderTargetTextureDesc;
		renderTargetTextureDesc.Height = textureHeight * atlasHeight;
		renderTargetTextureDesc.Width = textureWidth * atlasWidth;
		renderTargetTextureDesc.MipLevels = 1;
		renderTargetTextureDesc.ArraySize = 1;
		renderTargetTextureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
		renderTargetTextureDesc.SampleDesc.Count = 1;
		renderTargetTextureDesc.SampleDesc.Quality = 0;
		renderTargetTextureDesc.Usage = D3D11_USAGE_DEFAULT ; 
		renderTargetTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
		renderTargetTextureDesc.CPUAccessFlags = 0;
		renderTargetTextureDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;

	pd3dDevice->CreateTexture2D( &renderTargetTextureDesc, NULL, &renderTargetTexture );

		renderTargetTextureDesc.Format = DXGI_FORMAT_D32_FLOAT;
		renderTargetTextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;

	pd3dDevice->CreateTexture2D( &renderTargetTextureDesc, NULL, &depthTex );

	D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
	renderTargetViewDesc.Texture2D.MipSlice = 0;
		renderTargetViewDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
		renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;

	pd3dDevice->CreateRenderTargetView( renderTargetTexture, &renderTargetViewDesc, &renderTargetView );

	D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
	ZeroMemory( &depthStencilViewDesc, sizeof(depthStencilViewDesc) );
		depthStencilViewDesc.Format = DXGI_FORMAT_D32_FLOAT;
		depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;

	pd3dDevice->CreateDepthStencilView( depthTex, &depthStencilViewDesc, &depthStencilView);
und benutze das um meine selbst erzeugt Geometrie in eine Zwischentextur zu rendern

Code: Alles auswählen

	ID3D11RenderTargetView* oldRenderTargetViews[1] = {NULL};
	ID3D11DepthStencilView* oldDepthStencilView = NULL;
	D3D11_VIEWPORT oldVP;
	UINT noVP = 1;

	pd3dImmediateContext->OMGetRenderTargets(1, oldRenderTargetViews, &oldDepthStencilView );
	pd3dImmediateContext->RSGetViewports( &noVP, &oldVP );
//--------------------------
        pd3dImmediateContext->OMSetRenderTargets(1, &renderTargetView, depthStencilView);

    float ClearColor[4] = { 0.7f, 0.7f, 0.8f, 0.0f };
    ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView();
    pd3dImmediateContext->ClearRenderTargetView( pRTV, ClearColor );

    // Clear the depth stencil
    ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView();
    pd3dImmediateContext->ClearDepthStencilView( pDSV, D3D11_CLEAR_DEPTH, 1.0, 0 );

//--------------------------
//set constant buffer for modelviewmatrix
//--------------------------
	D3D11_MAPPED_SUBRESOURCE MapResource;
        pd3dImmediateContext->Map( constantBufferForVis, 0, D3D11_MAP_WRITE_DISCARD, 0, &MapResource );
		CB_VS_PER_OBJECT* cbForVis = ( CB_VS_PER_OBJECT* )MapResource.pData;
		D3DXMatrixTranspose( &cbForVis->m_mWorldViewProjection, &all );
        pd3dImmediateContext->Unmap( constantBufferForVis, 0 );
	pd3dImmediateContext->VSSetConstantBuffers( 1, 1, &constantBufferForVis );
//--------------------------

	pd3dImmediateContext->RSSetViewports(1, &viewport);	
        pd3dImmediateContext->IASetInputLayout( inputLayout );
	pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
	pd3dImmediateContext->VSSetShader( vsForRenderTarget, NULL, 0);
	pd3dImmediateContext->PSSetShaderResources( 0, 1, &texelPositionView );
	pd3dImmediateContext->PSSetShader( psForRenderTarget, NULL, 0);	
	pd3dImmediateContext->PSSetSamplers( 0, 1, &SamplerState );

//--------------------------
//Render geometrie
//--------------------------
		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferSix, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadSix)/sizeof(quadSix[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferSeven, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadSeven)/sizeof(quadSeven[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferEight, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadEight)/sizeof(quadEight[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferNine, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadNine)/sizeof(quadNine[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferTen, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadTen)/sizeof(quadTen[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferEleven, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadEleven)/sizeof(quadEleven[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferTwelve, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadTwelve)/sizeof(quadTwelve[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadOne)/sizeof(quadOne[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferTwo, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadTwo)/sizeof(quadTwo[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferThree, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadThree)/sizeof(quadThree[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferFour, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadFour)/sizeof(quadFour[0]) , 0);

		pd3dImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBufferFive, &stride, &offset );
		pd3dImmediateContext->Draw(sizeof(quadFive)/sizeof(quadFive[0]) , 0);

	pd3dImmediateContext->CopyResource( outputTexture, renderTargetTexture);
        pd3dImmediateContext->RSSetViewports( 1, &oldVP );

        pd3dImmediateContext->OMSetRenderTargets(1, oldRenderTargetViews, oldDepthStencilView );
        SAFE_RELEASE( renderTargetView );
        SAFE_RELEASE( depthStencilView );
Blöderweise ist die Geometrie auf der unvollständig bzw einfach nicht z-gebuffert. Woran kann das liegen? Ich suche schon so lange nach einer Lösung, aber keiner will mir helfen :-(
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Rendertarget ohne z-buffering

Beitrag von Krishty »

Für sowas – zuviel Code, um den Fehler aus der Ferne zu finden, aber relativ klar umrissene Stelle, an der es hakt – sollte PIX optimal sein. Dort kannst du dir die Ergebnisse jedes Draw-Calls anschauen, die Geometrie, die im Spiel war und kannst sogar einzelne Pixel debuggen. Damit sollte relativ schnell klar werden, warum einzelne Pixel durchkommen oder verworfen werden.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten