Planos de clipe do usuário no hardware de nível de recurso 9

Começando com Windows 8, a HLSL (Linguagem de Sombreador de Alto Nível) da Microsoft dá suporte a uma sintaxe que você pode usar com a API do Microsoft Direct3D 11 para especificar planos de clipe de usuário no nível do recurso 9_x e superiores. Você pode usar essa sintaxe clip-planes para gravar um sombreador e, em seguida, usar esse objeto sombreador com a API direct3D 11 para ser executado em todos os níveis de recursos do Direct3D.

Tela de fundo

Você pode acessar planos de clipe de usuário na API do Microsoft Direct3D 9 por meio dos métodos IDirect3DDevice9::SetClipPlane e IDirect3DDevice9::GetClipPlane . No Microsoft Direct3D 10 e posterior, você pode acessar planos de clipe de usuário por meio da semântica SV_ClipDistance . Mas antes Windows 8, SV_ClipDistance não estava disponível para o nível de recurso 9_x hardware nas APIs direct3D 10 ou Direct3D 11. Portanto, antes de Windows 8, a única maneira de acessar planos de clipe de usuário com nível de recurso 9_x hardware era por meio da API do Direct3D 9. Os aplicativos direct3D da Windows Store não podem usar a API do Direct3D 9. Aqui descrevemos a sintaxe que você pode usar para acessar planos de clipe de usuário por meio da API direct3D 11 no nível do recurso 9_x e superior.

Os aplicativos usam planos de clipe para definir um conjunto de planos invisíveis dentro do mundo 3D que cortam (jogar fora) todos os primitivos desenhados. O Windows não desenhará nenhum pixel que esteja no lado negativo de nenhum plano de clipe. Em seguida, os aplicativos podem usar planos de clipe para renderizar reflexões planares.

Sintaxe

Use essa sintaxe para declarar planos de clipe como atributos de função em uma declaração de função. Por exemplo, aqui usamos a sintaxe em um fragmento de sombreador de vértice:

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

Este exemplo para um fragmento de sombreador de vértice indica dois planos de clipe. Ele mostra que você precisa colocar o novo atributo clipplanes dentro de colchetes imediatamente antes do valor retornado do sombreador de vértice. Dentro de parênteses após o atributo clipplanes , você fornece uma lista de até 6 constantes float4 que definem os coeficientes do plano para cada plano de clipe ativo. O exemplo também mostra que você precisa fazer com que os coeficientes de cada plano residam em um buffer constante.

Observação

Não há sintaxe disponível para desabilitar um plano de clipe dinamicamente. Você deve recompilar um sombreador idêntico sem nenhum atributo clipplanes ou seu aplicativo pode definir os coeficientes em seu buffer constante como zero para que o plano não afete mais nenhuma geometria.

 

Essa sintaxe está disponível para qualquer destino de sombreador de vértice 4.0 ou posterior, que inclui vs_4_0_level_9_1 e vs_4_0_level_9_3.

Criando planos de clipe no espaço de transferência no nível de recurso 9 e superior

Aqui, mostramos como criar planos de clipe no espaço de transferência no nível do recurso 9_x e superiores.

Leitura em segundo plano

"Introdução à Programação de Jogos 3D com DirectX 10", de Frank D. Luna, explica a tela de fundo matemática gráfica (capítulos 1, 2 e 3) de que você precisa e os vários espaços e transformações de espaço que ocorrem no sombreador de vértice (seções 5.6 e 5.8).

Níveis de recurso 10Level9

No Direct3D 10 e posterior, você pode cortar em qualquer espaço que faça sentido, muitas vezes no espaço do mundo ou no espaço de exibição. Mas o Direct3D 9 usa espaço de transferência, que é espaço de projeção de divisão pré-perspectiva. Os vetores estão no espaço de clipe quando o sombreador de vértice os passa para estágios que seguem no pipeline de gráficos.

Ao escrever um aplicativo da Windows Store, você deve usar níveis de recurso 10Level9 (nível de recurso 9_x) para que o aplicativo possa ser executado no nível do recurso 9_x e hardware mais alto. Como seu aplicativo dá suporte ao nível do recurso 9_x e superior, você também deve usar a capacidade comum de aplicar planos de clipe no espaço de transferência.

Quando você compila um sombreador de vértice com vs_4_0_level_9_1 ou posterior, esse sombreador de vértice pode usar o atributo clipplanes . Um objeto Direct3D 10 ou posterior tem um produto de ponto do vértice emitido que contém cada uma das constantes globais float4 especificadas no atributo . O objeto Direct3D 9 tem metadados suficientes para fazer com que o runtime 10Level9 emita as chamadas apropriadas para IDirect3DDevice9::SetClipPlane.

Matemática do plano de clipe

Um plano de clipe é definido por um vetor com 4 componentes. Os três primeiros componentes definem um vetor x, y, z que emana da origem no espaço que queremos cortar. Esse vetor implica um plano, perpendicular ao vetor e em execução pela origem. O Windows mantém todos os pixels no lado vetor do plano e corta todos os pixels atrás do plano. O componente forth w empurra o plano para trás e faz com que o Windows corte menos (um w negativo faz com que o Windows corte mais) ao longo da linha do vetor. Se os componentes x, y e z comporem um vetor de unidade (normalizado), w efetuar push do plano w unidades de volta.

A matemática que a GPU (unidade de processamento gráfico) executa para determinar o recorte é um produto de ponto simples entre o vetor de vértice (x, y, z, 1) e o vetor do plano de recorte. Esta operação matemática cria um comprimento de projeção no vetor do plano de clipe. Um produto de ponto negativo mostra o vértice no lado recortado do plano.

Recorte no espaço de exibição

Aqui está nosso vértice no espaço de exibição:

vértice no espaço de exibição

Aqui está nosso plano de clipes no espaço de exibição:

plano de clipe no espaço de exibição

Aqui está o produto de ponto do vértice e do plano de clipe no espaço de exibição:

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

Esta operação matemática funciona para um objeto Direct3D 10 ou posterior, mas não funcionará para um objeto Direct3D 9. Para o Direct3D 9, primeiro devemos passar por nossa transformação de projeção em espaço de transferência.

Matriz de projeção

Uma matriz de projeção transforma um vértice do espaço de exibição (onde a origem é o olho do visualizador, +x está à direita, +y está para cima e +z é direto para frente) em espaço de clipe. A matriz de projeção lê o vértice para recorte de hardware e o estágio de rasterização. Aqui está uma matriz de perspectiva padrão (outras projeções exigem matemática diferente):

*r* taxa de largura/altura da janela *α* ângulo de exibição *f* distância do visualizador até o plano distante *n* distância do visualizador até o plano próximo
! [matriz de projeção] (imagens/projection-matrix.png)

A próxima matriz é uma versão simplificada da matriz anterior. Mostramos a matriz simplificada para que possamos usá-la posteriormente na operação de multiplicação de matriz.

matriz de projeção simplificada

Agora transformamos nosso vértice de espaço de exibição em espaço de transferência com uma multiplicação de matriz:

multiplicação de matriz

Em nossa operação de multiplicação de matriz, nossos componentes x e y são apenas ligeiramente ajustados, mas nossos componentes z e w são bastante mutilados. Nosso avião não nos dará mais o que queremos.

Clip-space clip-plane

Aqui queremos criar um plano de clipe de espaço de clipe cujo produto de ponto com nosso vértice de espaço de clipe nos dá o mesmo valor que v · C na seção Recorte no espaço de exibição .

plano de clipe

v · C = v P · CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + zCPw

Agora podemos dividir a operação matemática anterior por componente de vértice em quatro equações separadas:

componente x vértice do produto clip-plane

y componente de vértice do produto clip-plane

componente w vértice do produto clip-plane

componente de vértice z do produto clip-plane

Nosso plano de clipe de espaço de exibição e nossa matriz de projeção derivam e nos dão nosso plano de clipes de espaço de clipe.

clip space clip plane

Guia de programação para HLSL

Sintaxe de declaração da função