Exportar (0) Imprimir
Expandir Tudo
Informações
O tópico solicitado está sendo mostrado abaixo. No entanto, este tópico não está incluído nesta biblioteca.

Implementando buffers de sombra para o recurso Direct3D nível 9 (DirectX e C++)

Applies to Windows and Windows Phone

Para desenvolver um aplicativo do Tempo de Execução do Windows em DirectX com C++ que renderize efeitos de sombra e que use um recurso Direct3D nível 9_1, 9_2 ou 9_3, você deve usar um subconjunto específico de recursos de buffer de sombra Direct3D 10_0+ para implementar corretamente os efeitos de sombra. Nós vamos explicar como implementar os buffers de sombra do recurso Direct3D nível 9.

O que é um buffer de sombra?

Sombras são um elemento importante na criação de uma cena 3D realista e para retratar uma ilusão convincente de profundidade. A técnica de buffer de sombra é uma abordagem comum para renderizar sombras usando hardware gráfico; entretanto, ela também é relativamente dispendiosa em termos de computação. Os buffers de sombra são implementados usando um buffer de profundidade para armazenar as informações de profundidade de cena a partir da perspectiva da fonte de luz e, em seguida, comparando cada ponto renderizado na cena com o buffer de profundidade para determinar, se o ponto está na sombra.

Implementando sombras no recurso Direct3D nível 9_1, 9_2 ou 9_3

Quando o aplicativo iniciar, chame ID3D11Device::CheckFeatureSupport usando o valor de enumeração do recurso Direct3D D3D11_FEATURE_D3D9_SHADOW_SUPPORTpara determinar se o driver de gráficos instalados suporta os buffers de sombra. Se os dados (a estrutura correspondente D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT) recebidos pelo parâmetro pFeatureSupportData de CheckFeatureSupport tiverem o campo SupportsDepthAsTextureWithLessEqualComparisonFilter definido como falso, os buffers de sombra não funcionarão no aplicativo do Tempo de Execução do Windows em DirectX ao serem executados no computador do usuário. Para corrigir isso, os usuários têm que atualizar o driver.



D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT d3d9ShadowSupportResults;
ZeroMemory(&d3d9ShadowSupportResults, sizeof(D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT)); 

m_device->CheckFeatureSupport(
		D3D11_FEATURE_D3D9_SHADOW_SUPPORT, 
		&d3d9ShadowSupportResults,
		sizeof(D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT)
		);
	

Essa técnica funciona com os buffers de profundidade de 16 ou 24 bits, portanto, ambos são abordados na seção Comentários. Saiba que algumas implementações de driver podem suportar apenas buffers de profundidade de 16 bits.

Observação  Para saber mais, leia Técnicas comuns para aprimorar os mapas de profundidade de sombra .

  1. Crie um recurso de superfície Texture2D (usando ID3D11Device::CreateTexture2D) com o campo Format do D3D11_TEXTURE2D_DESC definido como DXGI_FORMAT_R24G8_TYPELESS se os buffers de profundidade de 24 bits forem suportados ou DXGI_FORMAT_R16_TYPELESS se não forem. Especifique os valores do sinalizador BIND_SHADER_RESOURCE e sinalizador BIND_DEPTH_STENCIL no campo BindFlags também. Fazer isso, permite que a superfície seja usada como um buffer de profundidade ou como uma textura em passos de renderização separados.

    Observação  Não conte com CheckFormatSupport para descobrir se o driver de gráficos dão suporte a esses formatos específicos. Se você usar as APIs CheckFeatureSupport e CheckFormatSupport do Direct3D 11 para consultar o suporte DXGI_FORMAT para o nível 9_* do recurso, o tempo de execução do DirectX não reportará o suporte para nenhum recurso de buffer de sombra.

  2. Usando um formato de profundidade como DXGI_FORMAT_D24_UNORM_S8_UINT para profundidade de buffer de sombra de 24 bits ou DXGI_FORMAT_D16_UNORM para profundidade de buffer de sombra de 16 bits, crie um ID3D11DepthStencilView (using ID3D11Device::CreateDepthStencilView) no recurso Texture2D alocado na etapa 1.

  3. Carregue o buffer de sombra com informações sobre a sombra. Primeiro, configure uma câmera temporária na posição da fonte de luz e voltada na direção da fonte de luz. Em seguida, renderize todos os objetos na cena que podem transmitir sombras em si mesma ou em outros objetos. Para este passo, não defina um sombreador de pixel e apenas associe o ID3D11DepthStencilView para saída.

  4. Para renderizar objetos na cena com sombras, crie objetos em estado de amostra que possuam a filtragem de comparação definida. O modo de comparação deve ser definido como LessEqual para os dispositivos do recurso de nível 9_*. O tratamento BorderColor também é permitido nesta amostra de profundidade, mesmo que o BorderColor não receba suporte normalmente no recurso Direct3D níveis 9_1 e 9_2 pela maioria dos drivers gráficos. Usando a cor da borda, é possível controlar se as regiões fora do mapa da sombra parecem ficam sempre ou nunca na sombra definindo o valor de BorderColor como 0.0 ou 1.0, respectivamente.

    A qualidade do filtro de sombra é controlado pelas opções de filtro Mag e Min na amostra de comparação. A amostragem de pontos produz sombras que possuem bordas com alias. As configurações de amostra de filtro linear resultam em bordas de sombra de qualidade superior, mas podem afetar o desempenho em alguns dispositivos com energia otimizada.

    Observação   Alguns pontos que devem ser lembrados. Primeiro, usar uma configuração separada para as opções de filtro Mag e Min produz resultado indefinido. Além disso, uma filtragem anisotrópica não é suportada. Por fim, o recurso Direct3D nível 9_* não dá suporte a buffers de profundidade mapeados por MIP.

  5. Crie um ID3D11ShaderResourceView (usando ID3D11Device::CreateShaderResourceView) para o recurso Texture2D alocado na etapa 1 e o associe à amostra de comparação descrita anteriormente. Como na etapa 1, você deve definir o formato do pixel para este modo de exibição como DXGI_FORMAT_R24_UNORM_G8_TYPELESS para profundidade de 24 bits ou DXGI_FORMAT_R16_UNORM para profundidade de 16 bits.

  6. Crie e defina um sombreador de pixel ps_4_0_level_9_* para o passo do aplicativo de sombra. Ele deve calcular a posição de cada pixel em relação à posição da fonte de luz e, em seguida, comparar o valor z do pixel com o valor no buffer de sombra para determinar se aquele pixel está na sombra. Faça isso escrevendo o código do sombreador para o seguinte (com o hardware fazendo a etapa de comparação):

    • Primeiro, as coordenadas de textura e o valor z são obtidos projetando a posição atual no mesmo mundo, modo de exibição e espaço de projeção usado para renderizar a sombra e depois remapeando as coordenadas x-y a partir do espaço [-1..1] até o espaço [0..1] para amostrar o mapa de sombra.
    • Depois, as coordenadas de textura e o valor z são obtidos projetando a posição atual no mesmo mundo, modo de exibição e espaço de projeção usados para renderizar a sombra e depois remapeando as coordenadas x-y a partir do espaço [-1..1] até o espaço [0..1] para amostrar o mapa de sombra.
    • E depois, para descobrir o valor da sombra para o pixel atual, use os métodos SampleCmp e SampleCmpLevelZero Texture2D para amostrar a partir do ID3D11ShaderResourceView criado na etapa 5, exatamente como você faria com o recurso Direct3D nível 10_0 e superior. O resultado é a fração das amostras não em uma sombra para filtragem linear, especificada como valores no intervalo [0..1]. Para a amostragem de pontos, um valor de 0.0 ou 1.0 é retornado.

    Observação  No recurso Direct3D níveis 9_1, 9_2, e 9_3, as tentativas de compilar um sombreador com esses intrínsecos do SampleCmp* usando um compilador HLSL mais antigo (como a versão Windows 7 do método ID3D11Device::CreatePixelShader ) falharão. Os intrínsecos do SampleCmp* recebem suporte somente no compilador fxc e DLL associada fornecida com o Windows 8. Esses intrínsecos do HLSL também estão presentes nos modelos do sombreador para os níveis do recurso Direct3D superiores a 9.

  7. Renderize os objetos na cena que terão sombras neles.

Lembre-se de limpar o estado da API depois de renderizar com as sombras. Em um dispositivo que tem um recurso configurado de nível 9_1, o estado da API discrepante faz com que a chamada de ID3D11DeviceContext::Draw seja ignorada. Por exemplo, se o seu renderizador associa uma textura (profundidade ou outro) enquanto a amostra correspondente permanece configurada para a amostragem de comparação, o ID3D11DeviceContext::Draw é ignorado. Se isso acontecer, você definiu o estado da API incorretamente.

Implementando sombras no recurso Direct3D nível 10_0 ou superior

As etapas anteriores para o mapeamento de sombra em dispositivos de recurso de nível 9 também funcionam em dispositivos de recurso de nível 10 ou superior e sem a necessidade de mudança de código. Entretanto, os níveis de recurso superiores dão suporte uma gama maior de opções, incluindo modos de comparação avançada e formatos adicionais de superfície de profundidade.

Tópicos relacionados

Técnicas comuns para aprimorar os mapas de profundidade de sombra
Níveis do Recurso Direct3D 11
Desenvolvendo para diferentes níveis de recursos do Direct3D

 

 

Mostrar:
© 2014 Microsoft