내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8용 Direct3D에서 앤티앨리어싱 사용

2014-06-18

Windows Phone 8 은 백 버퍼 표면에서 MSAA(Multi-Sample Anti-Aliasing)를 지원하지 않습니다. 이러한 제한은 모든 Windows Phone 8 응용프로그램과 Windows 스토어 응용프로그램에 있습니다. Windows Phone에서 MSAA를 사용하여 스왑 체임을 만들려고 하면 DXGI에서 DXGI_ERROR_INVALID_CALL을 반환합니다.

그러나 이 제한은 일반적인 화면 외부 렌더링 대상이 아닌 백 버퍼에만 있으므로 응용프로그램에서 보조 렌더링 대상을 사용하여 MSAA를 사용하도록 설정할 수 있습니다. 이렇게 하려면 다음과 같은 단계를 수행해야 합니다.

  1. 다중 샘플링을 사용하고 rendertarget 바인딩 플래그가 설정된 새 ID3D11Texture2D를 만듭니다. 이는 화면 외부 렌더링 대상 질감입니다.

  2. 새로 만든 렌더링 대상 질감에 대해 ID3D11RenderTargetView를 만듭니다.

  3. 렌더링 대상에 장면을 그립니다.

  4. rendertarget을 원본으로 사용하고 backbuffer를 대상으로 사용하여 ID3D11DeviceContext::ResolveSubresource를 호출합니다.

일부 질감 형식은 MSAA를 지원하지 않습니다. Windows Phone 과 같은 기능 수준 9_3 단말기에서 다중 샘플링 앤티앨리어싱을 지원하는 렌더링 대상 형식 목록은 Direct3D 10Level9 형식의 하드웨어 지원을 참조하세요.

다음 단계에서는 화면 외부 버퍼에서 앤티앨리어싱을 지원하도록 Windows Phone SDK 8.0 에 포함된 Direct3D 앱 템플릿을 수정하는 방법을 보여 줍니다.

먼저 Direct3Dbase.h에서 화면 외부 버퍼 및 RenderTargetView 역할을 하도록 새 Texture2D에 대한 변수를 선언합니다. 이 변수는 질감을 렌더링 대상으로 사용하는 데 필요합니다. 또한 멤버 변수를 만들어 기본 백 버퍼를 저장합니다. 기본 템플릿에서 이 변수는 로컬이며 범위를 벗어나지만 이 경우에는 나중에 참조하기 위해 필요합니다.


	Microsoft::WRL::ComPtr<ID3D11Texture2D> m_backBuffer;
	Microsoft::WRL::ComPtr<ID3D11Texture2D> m_offscreenRenderTarget;
	Microsoft::WRL::ComPtr<ID3D11RenderTargetView> m_offscreenRenderTargetView;


Direct3Dbase.cpp의 CreateWindowSizeDependentResources 메서드 맨 아래에서 다음 코드를 추가하여 렌더링 대상 및 렌더링 대상 뷰를 만듭니다. desc.SampleDesc.Count를 4로 설정하면 4x 다중 샘플링으로 질감이 만들어집니다.


	CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, m_renderTargetSize.Width, m_renderTargetSize.Height, 1, 1);
		desc.BindFlags = D3D11_BIND_RENDER_TARGET;
		desc.SampleDesc.Count = 4; // 4x MSAA
		
		DX::ThrowIfFailed(
			m_d3dDevice->CreateTexture2D(
				&desc,
				nullptr,
				&m_offscreenRenderTarget
				)
			);

		DX::ThrowIfFailed(
			m_d3dDevice->CreateRenderTargetView(
				m_offscreenRenderTarget.Get(),
				nullptr,
				&m_offscreenRenderTargetView
				)
			);



다음으로 CreateWindowSizeDependentResources에서 깊이 스텐실을 만드는 코드를 렌더링 대상과 동일한 수준의 다중 샘플링으로 수정해야 합니다. 이 코드에서, 기본 템플릿에서 변경된 줄은 depthStencilDesc.SampleDesc.Count를 4로 설정하는 줄 추가와 depthStencilViewDesc 변수를 D3D11_DSV_DIMENSION_TEXTURE2DMS 상수로 초기화하는 줄입니다. 기본적으로 템플릿은 다중 샘플링을 사용하지 않는 D3D11_DSV_DIMENSION_TEXTURE2D를 사용합니다.


	// Create a depth stencil view.
	CD3D11_TEXTURE2D_DESC depthStencilDesc(
		DXGI_FORMAT_D24_UNORM_S8_UINT,
		static_cast<UINT>(m_renderTargetSize.Width),
		static_cast<UINT>(m_renderTargetSize.Height),
		1,
		1,
		D3D11_BIND_DEPTH_STENCIL
		);

	depthStencilDesc.SampleDesc.Count = 4; // 4x MSAA

	ComPtr<ID3D11Texture2D> depthStencil;
	DX::ThrowIfFailed(
		m_d3dDevice->CreateTexture2D(
			&depthStencilDesc,
			nullptr,
			&depthStencil
			)
		);

	CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2DMS);
	DX::ThrowIfFailed(
		m_d3dDevice->CreateDepthStencilView(
			depthStencil.Get(),
			&depthStencilViewDesc,
			&m_depthStencilView
			)
		);


또한 CreateWindowSizeDependentResources에서 백 버퍼를 만드는 코드를 수정하여 템플릿에서 사용되는 로컬 백 버퍼 변수 대신 m_backBuffer 멤버 변수를 사용해야 합니다.


	// Create a render target view of the swap chain back buffer.
	DX::ThrowIfFailed(
		m_swapChain->GetBuffer(
			0,
			__uuidof(ID3D11Texture2D),
			&m_backBuffer
			)
		);

	DX::ThrowIfFailed(
		m_d3dDevice->CreateRenderTargetView(
			m_backBuffer.Get(),
			nullptr,
			&m_renderTargetView
			)
		);


이제 CubeRenderer.cpp에서 Render 메서드를 수정하여 화면 외부 렌더링 대상을 사용하면 됩니다. 메서드 맨 위에서 다음 코드를 추가하여 렌더링 대상을 설정합니다.


	const float midnightBlue[] = { 0.098f, 0.098f, 0.439f, 1.000f };
	m_d3dContext->ClearRenderTargetView(
		m_offscreenRenderTargetView.Get(),
		midnightBlue
		);
	m_d3dContext->OMSetRenderTargets(
		1,
		m_offscreenRenderTargetView.GetAddressOf(),
		m_depthStencilView.Get()
		);


마지막으로 Render 메서드가 끝날 때 ResolveSubresources를 호출하여 렌더링 대상의 상수를 백 버퍼에 복사합니다.


	m_d3dContext->ResolveSubresource(
		m_backBuffer.Get(),
		0,
		m_offscreenRenderTarget.Get(),
		0,
		DXGI_FORMAT_B8G8R8A8_UNORM);


표시:
© 2015 Microsoft