Seite 1 von 1

[DX11] Rendertarget ohne z-buffering

Verfasst: 18.06.2010, 19:23
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 :-(

Re: [DX11] Rendertarget ohne z-buffering

Verfasst: 18.06.2010, 20:05
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