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 de 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; são permitidas semânticas arbitrárias que não têm nenhum significado especial. Os parâmetros (no Direct3D 10 e posterior) que contêm essa semântica especial são chamados de Semântica de Valor do Sistema.

Semântica suportada no Direct3D 9 e Direct3D 10 e posterior

Os seguintes tipos de semântica são suportados no Direct3D 9 e Direct3D 10 e posterior.

Semântica do sombreador de vértice

Essas semânticas têm significado quando associadas a um parâmetro vertex-shader. Essas semânticas são suportadas no Direct3D 9 e no Direct3D 10 e posterior.

Entrada Descrição Type
BINORMAL[n] Bissexual float4
BLENDINDICES[n] Índices de mistura uint
PESO MISTURADO[n] Pesos de mistura float
COR[n] Cor difusa e especular float4
NORMAL[n] Vetor normal float4
POSIÇÃO[n] Posição do vértice no espaço do objeto. float4
POSIÇÃO Posição do vértice transformada. float4
PSIZE[n] Tamanho do ponto float
TENTE[n] Tangente float4
TEXCOORD[n] Coordenadas de textura float4
Saída Descrição Type
COR[n] Cor difusa ou especular float4
NEVOEIRO Neblina do vértice float
POSIÇÃO[n] Posição de um vértice no espaço homogêneo. Calcule a posiçã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 float
TESSFACTOR[n] Fator de tesselação float

n é um inteiro opcional entre 0 e o número de recursos suportados. 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 pixel-shader. Essas semânticas são suportadas no Direct3D 9 e no Direct3D 10 e posterior.

Entrada Descrição Type
COR[n] Cor difusa ou especular. float4
TEXCOORD[n] Coordenadas de textura float4
VFACE Escalar de ponto flutuante que indica uma primitiva voltada para trás. Um valor negativo fica voltado para trás, enquanto um valor positivo fica voltado para 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 em vez disso.


float
VPOS A localização 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 Direct3D 9 VPOS e Direct3D 10 SV_Position) float2
Saída Descrição Type
COR[n] Cor de saída float4
PROFUNDIDADE[n] Profundidade de saída float

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

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

Semântica suportada 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 de valor do sistema

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. Os sombreadores de pixel só podem gravar em parâmetros com a semântica de valor do sistema SV_Depth e SV_Target.

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 inserido 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 de sombreador de casco, estágio de sombreador de domínio e, depois disso, qualquer estágio habilitado primeiro: estágio de sombreador de geometria ou estágio de sombreador de pixel.

Se a tesselação estiver habilitada, o estágio de sombreador de casco e o estágio de sombreador de domínio estarão presentes. Para um determinado patch, o mesmo PrimitiveID se aplica à chamada de sombreador de casco do patch e a todas as chamadas de sombreador de domínio tesseladas. 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 o sombreador de geometria SV_PrimitiveID entradas e porque ele pode produzir zero ou um ou mais primitivos por invocação, o sombreador deve programar sua própria escolha de valor de SV_PrimitiveID para cada primitiva de saída se um sombreador de pixel subsequente SV_PrimtiveID entradas.

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árias primitivas.

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 de rasterização.

Semântica de valor do sistema Descrição Type
SV_ClipDistance[n] Clipe dados de distância. SV_ClipDistance valores são assumidos como uma distância sinalizada float32 para um avião. A configuração primitiva só invoca a rasterização em pixels para os quais a(s) distância(s) do plano interpolado são >= 0. Vários planos de clipe podem ser implementados simultaneamente, declarando vários componentes de um ou mais elementos de vértice como o SV_ClipDistance. Os valores combinados de clipe e distância de abate são, no máximo, componentes D3D#_CLIP_OR_CULL_DISTANCE_COUNT em no máximo registradores D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. Disponível para todos os sombreadores para leitura ou gravação, exceto o sombreador de vértice que pode escrever o valor, mas não tomá-lo como entrada.
O atributo clipplanes funciona como SV_ClipDistance mas funciona em todos os níveis de recursos de hardware 9_x e superiores. Para obter mais informações, consulte Planos de clipe de usuário em hardware de nível de recurso 9.
float
SV_CullDistance[n] Cull dados de distância. Quando o(s) componente(s) do(s) elemento(s) vértice recebe(m) esse rótulo, cada um desses valores é assumido como uma distância sinalizada float32 a um plano. As primitivas serão completamente descartadas se a(s) distância(s) plana(s) para todos os vértices na primitiva forem < 0. Vários planos de descarte podem ser usados simultaneamente, declarando vários componentes de um ou mais elementos de vértice como o SV_CullDistance. Os valores combinados de clipe e distância de abate são, no máximo, componentes D3D#_CLIP_OR_CULL_DISTANCE_COUNT em no máximo registradores D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. Disponível para todos os sombreadores para leitura ou gravação, exceto o sombreador de vértice que pode escrever 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 ambas de um sombreador de pixel.
Para SV_Coverage em um sombreador de pixel, OUTPUT é suportado 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 profundidade de saída, desde que seja maior ou igual ao valor determinado pelo rasterizador. Permite ajustar a profundidade sem desativar o Z inicial. float
SV_DepthLessEqual Em um sombreador de pixel, permite profundidade de saída, desde que seja menor ou igual ao valor determinado pelo rasterizador. Permite ajustar a profundidade sem desativar 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 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) flutuação2|3
SV_GroupID Define o deslocamento de grupo em uma chamada de Dispatch, por dimensão da chamada de dispatch. Disponível como entrada para o sombreador de computação. (somente leitura) uint3
SV_GroupIndex Fornece um índice nivelado 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 na mesma primitiva de geometria. uint
SV_InnerCoverage Representa informações de rasterização conservadora subestimadas (ou seja, se um pixel está garantido para ser totalmente coberto). Pode ser lido ou gravado pelo sombreador de pixel.
SV_InsideTessFactor Define a quantidade de tesselação dentro de uma superfície de patch. Disponível no sombreador de casco para escrita e disponível no sombreador de domínio para leitura. flutuar|flutuar[2]
SV_InstanceID Identificador por instância gerado automaticamente pelo tempo de execução (consulte Usando valores gerados pelo sistema (Direct3D 10)). Disponível para todos os shaders.
SV_IsFrontFace Especifica se um triângulo está voltado para a frente. Para linhas e pontos, IsFrontFace tem o valor true. A exceção são as linhas desenhadas a partir de triângulos (modo wireframe), que define IsFrontFace da mesma forma 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 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, onde o último faz com que os valores xyzw ajustados do centroide sejam fornecidos quando a suavização de borda de várias amostras. Quando usado em um sombreador, SV_Position descreve a localização 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 primitiva gerado automaticamente pelo tempo de execução (consulte Usando valores gerados pelo sistema (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 da matriz de destino de renderização para a qual a primitiva será atraída pelo sombreador de pixel. SV_RenderTargetArrayIndex é válido somente se o destino de renderização for um recurso de matriz. Essa semântica se aplica apenas aos primitivos; Se uma primitiva 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 escrito a partir do sombreador de geometria e lido pelo sombreador de pixel.
Se D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer for true, então SV_RenderTargetArrayIndex é aplicado a qualquer sombreador que alimente o rasterizador.
uint
SV_SampleIndex Dados do índice de frequência da amostra. Disponível para leitura ou gravação somente pelo sombreador de pixel. uint
SV_StencilRef Representa o valor de referência de estêncil de sombreador de pixel atual. Pode ser escrito apenas pelo sombreador de pixel. uint
SV_Target[n], onde 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 vinculados gravar. O valor está disponível para todos os sombreadores. flutuação[2|3|4]
SV_TessFactor Define a quantidade de tessellation em cada borda de um patch. Disponível para escrita no sombreador de casco e leitura no sombreador de domínio. flutuação[2|3|4]
SV_VertexID Identificador por vértice gerado automaticamente pelo tempo de execução (consulte Usando valores gerados pelo sistema (Direct3D 10)). Disponível apenas como 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 a primitiva que está sendo gravada no momento. Pode ser lido pelo sombreador de pixel. A primitiva será transformada e cortada no visor especificado pelo índice antes de ser passada para o rasterizador. Essa semântica se aplica apenas aos primitivos; Se uma primitiva tiver mais de um vértice, o valor do vértice à esquerda será usado.
Se D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer for true, então SV_ViewportArrayIndex é 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 dispositivos de Nível de Taxa de Sombreamento Variável 2 ou superior. Pode ser lido a partir 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 a amostragem múltipla (MultisampleEnable é TRUE em D3D10_RASTERIZER_DESC) e a gravação de um valor de profundidade (usando um sombreador de pixel), o valor único escrito também é usado no teste de profundidade, de modo que a capacidade de renderizar bordas primitivas em resolução mais alta é perdida durante a multiamostragem.
  • 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. A falha ao gravar SV_Depth quando declarada resulta em 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 SV_Depth ainda é válida ao executar a Mistura 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:

Mapeando para semântica do Direct3D 9

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

Semântica do Direct3D 10 Semântica equivalente ao 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 a semântica válida do Direct3D 9. Para compatibilidade com versões anteriores, o FXC trata POSITION0 (e seus nomes de variantes) como SV_Position. FXC trata a COR como SV_TARGET. DXC e compiladores mais recentes consideram POSITION[n] e COLOR como semântica definida pelo usuário.

VPOS Direct3D 9 e Direct3D 10 SV_Position

O SV_Position semântico D3D10 fornece funcionalidade semelhante à semântica VPOS do modelo de sombreador 3 do Direct3D 9. Por exemplo, no Direct3D 9, a sintaxe a seguir é 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 de tela, já que a semântica POSITION foi destinada 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 de tela (deslocadas por 0,5). Portanto, o sombreador Direct3D 9 seria aproximadamente equivalente (sem considerar o deslocamento 0,5) ao 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 em 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 com que seu sombreador funcione no 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 em hardware de nível de recurso 9.