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: |
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.
- Mapeando para semântica do Direct3D 9
- VPOS Direct3D 9 e Direct3D 10 SV_Position
- Planos de clipe do usuário em HLSL
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.