7 Replies - 836 Views - Last Post: 05 August 2013 - 01:58 PM Rate Topic: -----

#1 masar77  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-May 09

Direct3D render to texture

Posted 04 August 2013 - 12:54 PM

In order to create some bloom/blur effects around a sphere, I'm trying to understand the concept of render to texture. Right now I'm just trying to render a sphere to a texture, then applying that texture to the back buffer, but it's not working as I expected. Maybe you could spot the error(s). The program shows one sphere rotating around another.

Here I'm setting up back buffer and depth buffer:
	// create a struct to hold information about the swap chain
	DXGI_SWAP_CHAIN_DESC scd;

	// clear out the struct for use
	ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

	// fill the swap chain description struct
	scd.BufferCount = 1;                                   // one back buffer
	scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;    // use 32-bit color
	scd.BufferDesc.Width = SCREEN_WIDTH;                   // set the back buffer width
	scd.BufferDesc.Height = SCREEN_HEIGHT;                 // set the back buffer height
	scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;     // how swap chain is to be used
	scd.OutputWindow = hWnd;                               // the window to be used
	scd.SampleDesc.Count = 4;                              // how many multisamples
	scd.Windowed = TRUE;                                   // windowed/full-screen mode
	scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;    // allow full-screen switching

	// create a device, device context and swap chain using the information in the scd struct
	D3D11CreateDeviceAndSwapChain(NULL,
		D3D_DRIVER_TYPE_HARDWARE,
		NULL,
		NULL,
		NULL,
		NULL,
		D3D11_SDK_VERSION,
		&scd,
		&swapchain,
		&dev,
		NULL,
		&devcon);


	// create the depth buffer texture
	D3D11_TEXTURE2D_DESC texd;
	ZeroMemory(&texd, sizeof(texd));

	texd.Width = SCREEN_WIDTH;
	texd.Height = SCREEN_HEIGHT;
    texd.ArraySize = 1;
    texd.MipLevels = 1;
    texd.SampleDesc.Count = 4;
    texd.Format = DXGI_FORMAT_D32_FLOAT;
    texd.BindFlags = D3D11_BIND_DEPTH_STENCIL;

	ID3D11Texture2D *pDepthBuffer;
	dev->CreateTexture2D(&texd, NULL, &pDepthBuffer);

	// create the depth buffer
	D3D11_DEPTH_STENCIL_VIEW_DESC dsvd;
	ZeroMemory(&dsvd, sizeof(dsvd));

	dsvd.Format = DXGI_FORMAT_D32_FLOAT;
	dsvd.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;

	dev->CreateDepthStencilView(pDepthBuffer, &dsvd, &zbuffer);
	pDepthBuffer->Release();

	// get the address of the back buffer
	ID3D11Texture2D *pBackBuffer;
	swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);

	// use the back buffer address to create the render target
	dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
	pBackBuffer->Release();

	// set the render target as the back buffer
	devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);


	// Set the viewport
	D3D11_VIEWPORT viewport;
	ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

	viewport.TopLeftX = 0;    // set the left to 0
	viewport.TopLeftY = 0;    // set the top to 0
	viewport.Width = SCREEN_WIDTH;    // set the width to the window's width
	viewport.Height = SCREEN_HEIGHT;    // set the height to the window's height
	viewport.MinDepth = 0;    // the closest an object can be on the depth buffer is 0.0
	viewport.MaxDepth = 1;    // the farthest an object can be on the depth buffer is 1.0

	devcon->RSSetViewports(1, &viewport);



This is where I setup the texture to render to:
	D3D11_TEXTURE2D_DESC textureDesc;
	D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
	D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;

	// Initialize the render target texture description.
	ZeroMemory(&textureDesc, sizeof(textureDesc));

	// Setup the render target texture description.
	textureDesc.Width = SCREEN_WIDTH;
	textureDesc.Height = SCREEN_HEIGHT;
	textureDesc.MipLevels = 1;
	textureDesc.ArraySize = 1;
	textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
	textureDesc.SampleDesc.Count = 1;
	textureDesc.Usage = D3D11_USAGE_DEFAULT;
	textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
	textureDesc.CPUAccessFlags = 0;
	textureDesc.MiscFlags = 0;

	dev->CreateTexture2D(&textureDesc, NULL, &renderTargetTexture);

	// Setup the description of the render target view.
	renderTargetViewDesc.Format = textureDesc.Format;
	renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
	renderTargetViewDesc.Texture2D.MipSlice = 0;

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

	// Setup the description of the shader resource view.
	shaderResourceViewDesc.Format = textureDesc.Format;
	shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
	shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
	shaderResourceViewDesc.Texture2D.MipLevels = 1;

	// Create the shader resource view.
	dev->CreateShaderResourceView(renderTargetTexture, &shaderResourceViewDesc, &shaderResourceView);



Focusing on just the sphere in question, if you look at the code below, what I'm trying todo is drawing the sphere to the texture (renderTargetView), then switch to back buffer (devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);)/>/>, draw a quad that fills the screen with the texture applied. Although I have commented out the lower half of the code, the sphere is still rendered like before and visible. How is that possible? If I do not comment out the lower half and draw the quad, there's no difference.

			// Set and clear render target
			devcon->OMSetRenderTargets(1, &renderTargetView, zbuffer);
			devcon->ClearRenderTargetView(renderTargetView, D3DXCOLOR(0.4f, 0.2f, 0.0f, 1.0f));
						
			devcon->PSSetShaderResources(0, 1, &pTextureSun);
			devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
			devcon->Draw(sizeOfVertexVector, 0);

			// set the shader objects
			/* Below is commented out
			devcon->VSSetShader(pVS_glow, 0, 0);
			devcon->PSSetShader(pPS_glow, 0, 0);
			
			// set the render target as the back buffer
			devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);
						
			devcon->IASetVertexBuffers(0, 1, &pVBufferQuad, &stride, &offset);
			devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
			devcon->PSSetShaderResources(0, 1, &shaderResourceView);
			devcon->Draw(6, 0);
		*/


This post has been edited by masar77: 04 August 2013 - 12:59 PM


Is This A Good Question/Topic? 0
  • +

Replies To: Direct3D render to texture

#2 anonymous26  Icon User is offline

  • D.I.C Lover

Reputation: 0
  • View blog
  • Posts: 3,638
  • Joined: 26-November 10

Re: Direct3D render to texture

Posted 04 August 2013 - 06:33 PM

Have you looked up 'environment mapping'? That should point you in the right direction.
Was This Post Helpful? 0
  • +
  • -

#3 masar77  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-May 09

Re: Direct3D render to texture

Posted 04 August 2013 - 11:35 PM

View PostButchDean, on 04 August 2013 - 07:33 PM, said:

Have you looked up 'environment mapping'? That should point you in the right direction.


Thanks for your reply, I'm not sure what you mean since that is not what I want to do, can you explain?
Was This Post Helpful? 0
  • +
  • -

#4 masar77  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-May 09

Re: Direct3D render to texture

Posted 05 August 2013 - 12:33 AM

The code below is run before render to texture, if I comment out it, the sphere now seems to be rendered to texture. Although it's still not working correctly (when I draw the quad, I get an empty screen with the back buffer's background color).

			// set the render target as the back buffer
			devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);
			cBuffer.doBlur = 0;
			devcon->PSSetShaderResources(0, 1, &pTextureEarth);
			devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
			devcon->Draw(sizeOfVertexVector, 0);


This post has been edited by masar77: 05 August 2013 - 12:34 AM

Was This Post Helpful? 0
  • +
  • -

#5 masar77  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-May 09

Re: Direct3D render to texture

Posted 05 August 2013 - 01:05 AM

Update, when I draw the quad, it shows the background color of the texture, but not the sphere.
			// Set and clear render target
			devcon->OMSetRenderTargets(1, &renderTargetView, zbuffer);
			devcon->ClearRenderTargetView(renderTargetView, D3DXCOLOR(0.4f, 0.2f, 0.0f, 0.3f));
						
			devcon->PSSetShaderResources(0, 1, &pTextureSun);
			devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
			devcon->Draw(sizeOfVertexVector, 0);
			
			// set the shader objects
			devcon->IASetInputLayout(pLayoutGlow);
			devcon->VSSetShader(pVS_glow, 0, 0);
			devcon->PSSetShader(pPS_glow, 0, 0);
			
			// set the render target as the back buffer
			devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);
						
			devcon->IASetVertexBuffers(0, 1, &pVBufferQuad, &stride, &offset);
			devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
			devcon->PSSetShaderResources(0, 1, &shaderResourceView);
			devcon->Draw(6, 0);


Was This Post Helpful? 0
  • +
  • -

#6 anonymous26  Icon User is offline

  • D.I.C Lover

Reputation: 0
  • View blog
  • Posts: 3,638
  • Joined: 26-November 10

Re: Direct3D render to texture

Posted 05 August 2013 - 04:43 AM

Environment mapping is a form of dynamic texturing where the textured object mirrors its environment. Although you are not trying to mirror your environment you are still trying to render to texture, so environment mapping will give you some good pointers.
Was This Post Helpful? 1
  • +
  • -

#7 masar77  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 31
  • Joined: 28-May 09

Re: Direct3D render to texture

Posted 05 August 2013 - 04:44 AM

Setting up the blend state properly fixed the problem.
Was This Post Helpful? 0
  • +
  • -

#8 anonymous26  Icon User is offline

  • D.I.C Lover

Reputation: 0
  • View blog
  • Posts: 3,638
  • Joined: 26-November 10

Re: Direct3D render to texture

Posted 05 August 2013 - 01:58 PM

Awesome.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1