Compartilhar via


Semântica

Uma semântica é uma cadeia de caracteres anexada a uma entrada ou saída de sombreador que transmite informações sobre o uso pretendido de um parâmetro. A semântica é necessária em todas as variáveis passadas entre os estágios do sombreador. A sintaxe para adicionar uma semântica a uma variável de sombreador é mostrada aqui (sintaxe variável (DirectX HLSL)).

Em geral, os dados passados entre estágios de pipeline são completamente genéricos e não são interpretados exclusivamente pelo sistema; semântica arbitrária é permitida que não têm nenhum significado especial. Parâmetros (no Direct3D 10 e posterior) que contêm essas semânticas especiais são conhecidos como System-Value Semântica.

Semântica com suporte no Direct3D 9 e Direct3D 10 e posterior

Os seguintes tipos de semântica têm suporte no Direct3D 9 e no Direct3D 10 e posterior.

  • Semântica do Sombreador de Vértice
  • semântica do sombreador de pixel

Semântica do Sombreador de Vértice

Essas semânticas têm significado quando anexadas a um parâmetro de sombreador de vértice. Essas semânticas têm suporte no Direct3D 9 e no Direct3D 10 e posterior.

Entrada Descrição Tipo
BINORMAL[n] Binormal float4
BLENDINDICES[n] Índices de mesclagem uint
BLENDWEIGHT[n] Pesos de mistura flutuar
COLOR[n] Cor difusa e especular float4
NORMAL[n] Vetor normal float4
POSITION[n] Posição de vértice no espaço do objeto. float4
POSITIONT Posição do vértice transformado. float4
PSIZE[n] Tamanho do ponto flutuar
TANGENT[n] Tangente float4
TEXCOORD[n] Coordenadas de textura float4
Saída Descrição Tipo
COLOR[n] Cor difusa ou especular float4
NEVOEIRO Neblina de vértice flutuar
POSITION[n] Posição de um vértice em espaço homogêneo. Posição de computação no espaço da tela dividindo (x,y,z) por w. Cada sombreador de vértice deve escrever um parâmetro com essa semântica. OBSERVAÇÃO: essa semântica está disponível no Direct3D 9. Para Direct3D 10 e posterior, use SV_Position em vez disso. float4
PSIZE Tamanho do ponto flutuar
TESSFACTOR[n] Fator tessellation flutuar

n é um inteiro opcional entre 0 e o número de recursos com suporte. Por exemplo, POSITION0, TEXCOORD1 etc.

Semântica do Sombreador de Pixel

Essas semânticas têm significado quando anexadas a um parâmetro de entrada de sombreador de pixel. Essas semânticas têm suporte no Direct3D 9 e no Direct3D 10 e posterior.

Entrada Descrição Tipo
COLOR[n] Cor difusa ou especular. float4
TEXCOORD[n] Coordenadas de textura float4
VFACE Escalar de ponto flutuante que indica um primitivo voltado para trás. Um valor negativo fica para trás, enquanto um valor positivo enfrenta a câmera.

Observação:
Essa semântica está disponível no Modelo de Sombreador Direct3D 9 3.0. Para Direct3D 10 e posterior, use SV_IsFrontFace em vez disso.


flutuar
VPOS O local do pixel (x,y) no espaço da tela. Para converter um sombreador Direct3D 9 (que usa essa semântica) em um sombreador Direct3D 10 e posterior, consulte VPOS do Direct3D 9 e Direct3D 10 SV_Position) float2
Saída Descrição Tipo
COLOR[n] Cor da saída float4
DEPTH[n] Profundidade de saída flutuar

n é um inteiro opcional entre 0 e o número de recursos com suporte. Por exemplo, PSIZE0, COLOR1 etc.

A semântica COLOR só é válida no modo de compatibilidade do sombreador (ou seja, quando o sombreador é criado usando D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY).

Semântica com suporte apenas para Direct3D 10 e Mais Recente.

Os seguintes tipos de semântica foram introduzidos recentemente para o Direct3D 10 e não estão disponíveis para o Direct3D 9.

Semântica System-Value

A semântica de valor do sistema é nova no Direct3D 10. Todos os valores do sistema começam com um prefixo SV_, um exemplo comum é SV_POSITION, que é interpretado pelo estágio do rasterizador. Os valores do sistema são válidos em outras partes do pipeline. Por exemplo, SV_Position pode ser especificado como uma entrada para um sombreador de vértice, bem como uma saída. Sombreadores de pixel só podem gravar em parâmetros com a semântica SV_Depth e SV_Target valor do sistema.

Outros valores do sistema (SV_VertexID, SV_InstanceID, SV_IsFrontFace) só podem ser inseridos no primeiro sombreador ativo no pipeline que pode interpretar o valor específico; depois disso, a função de sombreador deve passar os valores para estágios subsequentes.

SV_PrimitiveID é uma exceção a essa regra de ser apenas a entrada no primeiro sombreador ativo no pipeline que pode interpretar o valor específico; o hardware pode fornecer o mesmo valor de ID que a entrada para o estágio do sombreador de casco, o estágio do sombreador de domínio e, depois desse estágio, qualquer estágio habilitado: estágio de sombreador de geometria ou estágio de sombreador de pixels.

Se o mosaico estiver habilitado, o estágio do sombreador de casco e o estágio do sombreador de domínio estarão presentes. Para um determinado patch, o mesmo PrimitiveID aplica-se à invocação de sombreador de casco do patch e a todas as invocações de sombreador de domínio com mosaico. O mesmo PrimitiveID também se propaga para o próximo estágio ativo; estágio de sombreador de geometria ou estágio de sombreador de pixel, se habilitado.

Se as entradas do sombreador de geometria SV_PrimitiveID e, como ele pode gerar zero ou um ou mais primitivos por invocação, o sombreador deverá programar sua própria escolha de SV_PrimitiveID valor para cada primitivo de saída se um sombreador de pixel subsequente entrar SV_PrimtiveID.

Como outro exemplo, SV_PrimitiveID não pode ser interpretado pelo estágio de sombreador de vértice porque um vértice pode ser um membro de vários primitivos.

Essas semânticas foram adicionadas ao Direct3D 10; eles não estão disponíveis no Direct3D 9.

Semântica de valor do sistema para o estágio do rasterizador.

Semântica System-Value Descrição Tipo
SV_ClipDistance[n] Recortar dados de distância. SV_ClipDistance valores são considerados uma distância assinada por float32 para um plano. A configuração primitiva invoca apenas a rasterização em pixels para os quais as distâncias de plano interpoladas são >= 0. Vários planos de clipe podem ser implementados simultaneamente, declarando vários componentes de um ou mais elementos de vértice à medida que o SV_ClipDistance. Os valores combinados de distância de recortar e cortar são, no máximo, componentes D3D#_CLIP_OR_CULL_DISTANCE_COUNT no máximo D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT registros. Disponível para todos os sombreadores a serem lidos ou gravados, exceto o sombreador de vértice que pode gravar o valor, mas não tomá-lo como entrada.
O atributo de recortes de funciona como SV_ClipDistance mas funciona em todos os 9_x de nível de recurso de hardware e superior. Para obter mais informações, consulte Planos de clipe de usuário emde hardware de nível 9 do recurso.
flutuar
SV_CullDistance[n] Dados de distância de abate. Quando componentes de elementos de vértice recebem esse rótulo, esses valores são considerados uma distância assinada por float32 para um plano. Os primitivos serão completamente descartados se as distâncias do plano para todos os vértices no primitivo forem < 0. Vários planos de abate podem ser usados simultaneamente, declarando vários componentes de um ou mais elementos de vértice como o SV_CullDistance. Os valores combinados de distância de recortar e cortar são, no máximo, componentes D3D#_CLIP_OR_CULL_DISTANCE_COUNT no máximo D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT registros. Disponível para todos os sombreadores a serem lidos ou gravados, exceto o sombreador de vértice que pode gravar o valor, mas não tomá-lo como entrada.
flutuar
SV_Coverage Uma máscara que pode ser especificada na entrada, saída ou ambos de um sombreador de pixel.
Para SV_Coverage em um sombreador de pixel, o OUTPUT tem suporte em ps_4_1 ou superior.
Para SV_Coverage em um sombreador de pixel, INPUT requer ps_5_0 ou superior.
uint
SV_Depth Dados de buffer de profundidade. Pode ser escrito por sombreador de pixel. flutuar
SV_DepthGreaterEqual Em um sombreador de pixel, permite a profundidade de saída, desde que seja maior ou igual ao valor determinado pelo rasterizador. Habilita o ajuste de profundidade sem desabilitar z inicial. flutuar
SV_DepthLessEqual Em um sombreador de pixel, permite a profundidade de saída, desde que seja menor ou igual ao valor determinado pelo rasterizador. Habilita o ajuste de profundidade sem desabilitar z inicial. flutuar
SV_DispatchThreadID Define o deslocamento de thread global dentro da chamada dispatch, por dimensão do grupo. Disponível como entrada para sombreador de computação. (somente leitura) uint3
SV_DomainLocation Define o local no casco do ponto de domínio atual que está sendo avaliado. Disponível como entrada para o sombreador de domínio. (somente leitura) float2|3
SV_GroupID Define o deslocamento de grupo em uma chamada de Expedição, por dimensão da chamada de expedição. Disponível como entrada para o sombreador de computação. (somente leitura) uint3
SV_GroupIndex Fornece um índice mesclado para um determinado thread dentro de um determinado grupo. Disponível como entrada para o sombreador de computação. (somente leitura) uint
SV_GroupThreadID Define o deslocamento de thread dentro do grupo, por dimensão do grupo. Disponível como entrada para o sombreador de computação. (somente leitura) uint3
SV_GSInstanceID Define a instância do sombreador de geometria. Disponível como entrada para o sombreador de geometria. A instância é necessária, pois um sombreador de geometria pode ser invocado até 32 vezes no mesmo primitivo geometry. uint
SV_InnerCoverage Representa informações de rasterização conservadoras subestimadas (ou seja, se um pixel é garantido,to-betotalmente coberto). Pode ser lido ou escrito pelo sombreador de pixel.
SV_InsideTessFactor Define a quantidade de mosaico dentro de uma superfície de patch. Disponível no sombreador de casco para gravação e disponível no sombreador de domínio para leitura. float|float[2]
SV_InstanceID Identificador por instância gerado automaticamente pelo runtime (consulte Usando valores de System-Generated (Direct3D 10)). Disponível para todos os sombreadores.
SV_IsFrontFace Especifica se um triângulo está voltado para a frente. Para linhas e pontos, IsFrontFace tem o valor verdadeiro. A exceção são linhas extraídas de triângulos (modo wireframe), que define IsFrontFace da mesma maneira que rasterizar o triângulo no modo sólido. Pode ser escrito pelo sombreador de geometria e lido pelo sombreador de pixel. Bool
SV_OutputControlPointID Define o índice da ID do ponto de controle que está sendo operada por uma invocação do ponto de entrada principal do sombreador do casco. Pode ser lido apenas pelo sombreador do casco. uint
SV_Position Quando SV_Position é declarado para entrada em um sombreador, ele pode ter um dos dois modos de interpolação especificados: linearNoPerspective ou linearNoPerspectiveCentroid, em que este último faz com que valores xyzw de centroid-snapped sejam fornecidos durante a suavização de várias camadas. Quando usado em um sombreador, SV_Position descreve o local do pixel. Disponível em todos os sombreadores para obter o pixel center com um deslocamento de 0,5. float4
SV_PrimitiveID Identificador por primitivo gerado automaticamente pelo runtime (consulte Usando valores de System-Generated (Direct3D 10)). Pode ser escrito pelos sombreadores de geometria ou pixel e lido pelos sombreadores de geometria, pixel, casco ou domínio. uint
SV_RenderTargetArrayIndex Índice de matriz de destino de renderização. Aplicado à saída do sombreador de geometria e indica a fatia de matriz de destino de renderização à qual o primitivo será desenhado pelo sombreador de pixel. SV_RenderTargetArrayIndex será válido somente se o destino de renderização for um recurso de matriz. Essa semântica aplica-se somente aos primitivos; se um primitivo tiver mais de um vértice, o valor do vértice principal será usado. Esse valor também indica qual fatia de matriz de uma exibição de profundidade/estêncil é usada para fins de leitura/gravação.
Pode ser escrito do sombreador de geometria e lido pelo sombreador de pixel.
Se D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer for true, SV_RenderTargetArrayIndex será aplicado a qualquer sombreador que alimente o rasterizador.
uint
SV_SampleIndex Dados de índice de frequência de exemplo. Disponível para leitura ou gravação somente pelo sombreador de pixel. uint
SV_StencilRef Representa o valor de referência do estêncil do sombreador de pixel atual. Pode ser escrito apenas pelo sombreador de pixel. uint
SV_Target[n], em que 0 <= n <= 7 O valor de saída que será armazenado em um destino de renderização. O índice indica em qual dos 8 destinos de renderização possivelmente associados gravar. O valor está disponível para todos os sombreadores. float[2|3|4]
SV_TessFactor Define a quantidade de mosaico em cada borda de um patch. Disponível para gravação no sombreador de casco e leitura no sombreador de domínio. float[2|3|4]
SV_VertexID Identificador por vértice gerado automaticamente pelo runtime (consulte Usando valores de System-Generated (Direct3D 10)). Disponível apenas como a entrada para o sombreador de vértice. uint
SV_ViewportArrayIndex Índice de matriz viewport. Aplicado à saída do sombreador de geometria e indica qual visor usar para o primitivo que está sendo gravado no momento. Pode ser lido pelo sombreador de pixel. O primitivo será transformado e recortado no visor especificado pelo índice antes de ser passado para o rasterizador. Essa semântica aplica-se somente aos primitivos; se um primitivo tiver mais de um vértice, o valor do vértice principal será usado.
Se D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer for true, SV_ViewportArrayIndex será aplicado a qualquer sombreador que alimente o rasterizador.
uint
SV_ShadingRate Define, por meio da taxa de sombreamento valores, o número de pixels gravados por uma invocação de sombreador de pixel para tipo de taxa de sombreamento variável 2 ou dispositivos mais altos. Pode ser lido do sombreador de pixel. Pode ser escrito a partir de um sombreador de vértice ou geometria. uint

Limitações ao escrever SV_Depth:

  • Quando multisampling (MultisampleEnable é VERDADEIRO em D3D10_RASTERIZER_DESC) e gravando um valor de profundidade (usando um sombreador de pixel), o valor único gravado também é usado no teste de profundidade ; de modo que a capacidade de renderizar bordas primitivas em resolução mais alta é perdida quando multisampling.
  • Ao usar o controle de fluxo dinâmico, é impossível determinar em tempo de compilação se um sombreador que grava SV_Depth em alguns caminhos terá a garantia de gravar SV_Depth em cada execução. Falha ao gravar SV_Depth quando declarado resulta em um comportamento indefinido (que pode ou não incluir o descarte do pixel).
  • Qualquer valor float32, incluindo +/-INF e NaN, pode ser gravado em SV_Depth.
  • A gravação de SV_Depth ainda é válida ao executar o Blending de Cores de Origem Dupla.

Migração do Direct3D 9 para o Direct3D 10 e posterior

Os seguintes problemas devem ser considerados ao migrar o código do Direct3D 9 para o Direct3D 10 e posterior:

Mapeamento para Semântica do Direct3D 9

Algumas das semânticas direct3D 10 e posteriores são mapeadas diretamente para a semântica direct3D 9.

Semântica direct3D 10 Semântica equivalente do Direct3D 9
SV_Depth PROFUNDIDADE
SV_Position POSIÇÃO
SV_Target COR

[!] Observação para desenvolvedores do Direct3D 9: para destinos do Direct3D 9, a semântica do sombreador deve ser mapeada para a semântica válida do Direct3D 9. Para compatibilidade com versões anteriores, a FXC trata POSITION0 (e seus nomes variantes) como SV_Position. O FXC trata COLOR como SV_TARGET. DXC e compiladores mais recentes consideram POSITION[n] e COLOR como semântica definida pelo usuário.

VPOS do Direct3D 9 e Direct3D 10 SV_Position

A SV_Position semântica D3D10 fornece funcionalidade semelhante à semântica do modelo de sombreador Direct3D 9 3 VPOS. Por exemplo, no Direct3D 9, a seguinte sintaxe é usada para um sombreador de pixel usando coordenadas de espaço de tela:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

O VPOS foi adicionado para suporte ao modelo de sombreador 3, para especificar coordenadas de espaço na tela, uma vez que a semântica POSITION destinava-se a coordenadas de espaço de objeto.

No Direct3D 10 e posterior, o SV_Position semântico (quando usado no contexto de um sombreador de pixel) especifica coordenadas de espaço de tela (deslocamento em 0,5). Portanto, o sombreador Direct3D 9 seria aproximadamente equivalente (sem considerar o deslocamento de 0,5) para o seguinte:

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Ao migrar do Direct3D 9 para o Direct3D 10 e posterior, você precisará estar ciente disso ao traduzir seus sombreadores.

Planos de clipe do usuário no HLSL

A partir do Windows 8, você pode usar o atributo de função clipplanes em uma declaração de função HLSL em vez de SV_ClipDistance para fazer o sombreador funcionar em nível de recurso 9_x bem como no nível de recurso 10 e superior. Para obter mais informações, consulte Planos de clipe de usuário emde hardware de nível 9 do recurso.