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 os estágios do 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 Semântica de Valor do Sistema.

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

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 Type
BINORMAL[n] Binormal float4
BLENDINDICES[n] Índices de combinação uint
BLENDWEIGHT[n] Pesos de mistura FLOAT
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 de vértice transformada. float4
PSIZE[n] Tamanho do ponto FLOAT
TANGENT[n] Tangente float4
TEXCOORD[n] Coordenadas de textura float4
Saída Descrição Type
COLOR[n] Cor difusa ou especular float4
NEVOEIRO Neblina de vértice FLOAT
POSITION[n] Posição de um vértice em espaço homogêneo. Posição de computação no espaço de tela dividindo (x,y,z) por w. Cada sombreador de vértice deve gravar um parâmetro com essa semântica. float4
PSIZE Tamanho do ponto FLOAT
TESSFACTOR[n] Fator tessellation FLOAT

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 Type
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 é encarado para trás, enquanto um valor positivo enfrenta a câmera.
[! Observação]
Essa semântica está disponível no Direct3D 9 Shader Model 3.0. Para Direct3D 10 e posterior, use SV_IsFrontFace .

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

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 somente 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 os estágios subsequentes.

SV_PrimitiveID é uma exceção a essa regra de ser inserida apenas 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 disso, qualquer estágio é o primeiro 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 pixels, se habilitado.

Se as entradas do sombreador de geometria SV_PrimitiveID e porque podem 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 uma entrada de sombreador de pixel subsequente 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 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 Type
SV_ClipDistance[n] Dados de distância de clipe. 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 clip e cull 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 clipplanes funciona como SV_ClipDistance, mas funciona em todo o nível de recurso de hardware 9_x e superior. Para obter mais informações, consulte Planos de clipe do usuário no hardware de nível 9 do recurso.
FLOAT
SV_CullDistance[n] Dados de distância de abate. Quando os componentes de elementos de vértice recebem esse rótulo, esses valores são considerados uma distância assinada por float32 para um plano. 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 clip e cull 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.
FLOAT
SV_Coverage Uma máscara que pode ser especificada na entrada, na saída ou em ambos os sombreadores de pixel.
Para SV_Coverage em um sombreador de pixel, há suporte para OUTPUT 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. FLOAT
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 o Z inicial. FLOAT
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 o Z inicial. FLOAT
SV_DispatchThreadID Define o deslocamento de thread global dentro da chamada Dispatch, por dimensão do grupo. Disponível como entrada para o 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 do 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 achatado 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 geometria. uint
SV_InnerCoverage Representa informações de rasterização conservadora subestimadas (ou seja, se um pixel é garantido para ser totalmente coberto). Pode ser lido ou gravado 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 gravado 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 operado 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 com ajuste centralizado sejam fornecidos quando a antíalia de várias estâmplas. Quando usado em um sombreador, SV_Position descreve o local do pixel. Disponível em todos os sombreadores para obter o centro de pixels 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 gravado 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 se aplica somente aos primitivos; se um primitivo tiver mais de um vértice, o valor do vértice à esquerda 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 gravado no 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 gravado 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 a serem gravados. O valor está disponível para todos os sombreadores. float[2|3|4]
SV_TessFactor Define o valor 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 se aplica somente aos primitivos; se um primitivo tiver mais de um vértice, o valor do vértice à esquerda 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 de valores de taxa de sombreamento, o número de pixels gravados por uma invocação de sombreador de pixel para a Camada 2 da Taxa de Sombreamento Variável ou dispositivos mais altos. Pode ser lido do sombreador de pixel. Pode ser gravado a partir de um sombreador de vértice ou geometria. uint

Limitações ao escrever SV_Depth:

  • Quando multisampling (MultisampleEnable é TRUE em D3D10_RASTERIZER_DESC) e grava um valor de profundidade (usando um sombreador de pixel), o valor único gravado também é usado no teste de profundidade; portanto, 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 comportamento indefinido (que pode ou não incluir 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 a Combinação 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 direct3D 9

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

Semântica direct3D 10 Semântica equivalente do Direct3D 9
SV_Depth DEPTH
SV_Position POSITION
SV_Target COR

[!] Observação para desenvolvedores do Direct3D 9: para destinos do Direct3D 9, a semântica do sombreador deve ser mapeada para semântica válida do Direct3D 9. Para compatibilidade com versões anteriores POSITION0 (e seus nomes variantes) é tratado como SV_Position, COLOR é tratado como SV_TARGET.

Direct3D 9 VPOS e Direct3D 10 SV_Position

A SV_Position semântica D3D10 fornece funcionalidade semelhante à semântica do sombreador Direct3D 9 modelo 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 sombreador modelo 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, a semântica SV_Position (quando usada no contexto de um sombreador de pixel) especifica coordenadas de espaço na 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 de usuário no HLSL

Começando com 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 seu sombreador funcionar no nível do recurso 9_x, bem como no nível de recurso 10 e superior. Para obter mais informações, consulte Planos de clipe do usuário no hardware de nível 9 do recurso.