Modelo de sombreador 3 (referência HLSL)
Sombreadores de vértice e sombreadores de pixel são simplificados consideravelmente de versões anteriores do sombreador. Se você estiver implementando sombreadores em hardware, talvez não use vs_3_0 ou ps_3_0 com outras versões de sombreador e talvez não use nenhum tipo de sombreador com o pipeline de função fixa. Essas alterações possibilitam simplificar os drivers e o runtime. A única exceção é que sombreadores vs_3_0 somente software podem ser usados com qualquer versão do sombreador de pixel. Além disso, se você estiver usando um sombreador de vs_3_0 somente software com uma versão anterior do sombreador de pixel, o sombreador de vértice só poderá usar semântica de saída compatível com códigos FVF (formato de vértice flexível).
A semântica usada em saídas de sombreador de vértice deve ser usada em entradas de sombreador de pixel. A semântica é usada para mapear as saídas do sombreador de vértice para as entradas do sombreador de pixel, semelhante à maneira como a declaração de vértice é mapeada para os registros de entrada do sombreador de vértice e modelos de sombreador anteriores. Consulte Semântica de Correspondência em vs 3.0 e sombreadores ps 3.0.
Estados de renderização de modo de encapsulamento adicionais foram adicionados para cobrir a possibilidade de coordenadas de textura adicionais neste novo esquema. Os atributos com D3DDECLUSAGE_TEXCOORD e o índice de uso de 0 a 15 são interpolados no modo de encapsulamento quando o D3DRS_WRAP* correspondente é definido.
- Recursos do Modelo de Sombreador de Vértice 3
- Recursos do Modelo de Sombreador de Pixel 3
- Semântica de correspondência em sombreadores de vs_3_0 e ps_3_0
- Alterações no modo de neblina, profundidade e sombreamento
- Conversões de ponto flutuante e inteiro
- Especificando precisão total ou parcial
- Sombreadores de vértice e pixel de software
Recursos do Modelo de Sombreador de Vértice 3
Os tipos de registro de saída do sombreador de vértice foram recolhidos em doze registros (consulte Registros de Saída). Cada registro usado precisa ser declarado usando a instrução dcl e uma semântica (por exemplo, dcl_color0 o0.xyzw).
O modelo de sombreador de vértice 3_0 (vs_3_0) expande os recursos de vs_2_0 com indexação de registro mais poderosa, um conjunto de registros de saída simplificados, a capacidade de amostrar uma textura em um sombreador de vértice e a capacidade de controlar a taxa na qual as entradas do sombreador são inicializadas.
Indexar qualquer registro
Todos os registros ( Registro de Entrada e Registros de Saída) podem ser indexados usando o Registro de Contador de Loop (somente registros constantes podem ser indexados em versões anteriores).)
Você deve declarar registros de entrada e saída antes de indexá-los. No entanto, você não pode indexar nenhum registro de saída que tenha sido declarado com uma semântica de posição ou tamanho de ponto. Na verdade, se a indexação for usada, a semântica de psize e a posição deverão ser declaradas nos registros o0 e o1, respectivamente.
Você só tem permissão para indexar um intervalo contínuo de registros; ou seja, você não pode indexar entre registros que não foram declarados. Embora essa restrição possa ser inconveniente, ela permite que a otimização de hardware ocorra. A tentativa de indexar entre registros não contíguos produzirá resultados indefinidos. A validação do sombreador não impõe essa restrição.
Simplificar registros de saída
Todos os vários tipos de registros de saída foram recolhidos em doze registros de saída: 1 para posição, 2 para cor, 8 para textura e 1 para neblina ou tamanho do ponto. Esses registros interpolarão todos os dados que contiverem para o sombreador de pixel. As declarações de registro de saída são necessárias e a semântica é atribuída a cada registro.
Os registros podem ser divididos da seguinte maneira:
- Pelo menos um registro deve ser declarado como um registro de posição de quatro componentes. Esse é o único registro de sombreador de vértice necessário.
- Os dez primeiros registros consumidos por um sombreador podem usar até quatro componentes (xyzw) máximo.
- O último (ou décimo segundo) registro pode conter apenas um escalar (como o tamanho do ponto).
Para obter uma listagem dos registros, consulte Registros – vs_3_0.
Amostra de textura em um sombreador de vértice
O sombreador de vértice 3_0 dá suporte à pesquisa de textura no sombreador de vértice usando texldl - vs.
Recursos do Modelo de Sombreador de Pixel 3
Os registros de cor e textura do sombreador de pixel foram recolhidos em dez registros de entrada (consulte Tipos de registro de entrada). O Registro facial é um registro escalar de ponto flutuante. Somente o sinal desse registro é válido. Se o sinal for negativo, o primitivo será uma face traseira. Isso pode ser usado dentro de um sombreador de pixel para obter iluminação de dois lados, por exemplo. O Registro de Posição faz referência aos pixels atuais (x,y).
Os registros constantes do sombreador podem ser definidos usando:
Semântica de correspondência em sombreadores de vs_3_0 e ps_3_0
Há algumas restrições ao uso semântico com vs_3_0 e ps_3_0. Em geral, você precisa ter cuidado ao usar uma semântica para uma entrada de sombreador que corresponda a uma semântica usada em uma saída de sombreador.
Por exemplo, esse sombreador de pixel empacota vários nomes em um único registro:
ps_3_0
dcl_texcoord0 v0.x
dcl_texcoord1 v0.yz // Valid to pack multiple names into one register
dcl_texcoord2_centroid v1.w
...
Cada registro tem uma semântica diferente. Observe que você também pode nomear v0.x e v0.yz com semântica (múltipla) diferente devido ao uso da máscara de gravação.
Dado o sombreador de pixel, o seguinte sombreador de vs_3_0 não pode ser emparelhado com ele:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o6.yzw
...
Esses dois sombreadores entram em conflito com o uso da semântica D3DDECLUSAGE_TEXCOORD0 e D3DDECLUSAGE_TEXCOORD1 .
Reescreva o sombreador de vértice assim para evitar a colisão semântica:
vs_3_0
...
dcl_texcoord2 o3
dcl_texcoord3 o9
...
Da mesma forma, um nome semântico declarado em diferentes registros de entrada no sombreador de pixel (v0 e v1 no sombreador de pixel) não pode ser usado em um único registro de saída neste sombreador de vértice. Por exemplo, esse sombreador de vértice não pode ser emparelhado com o sombreador de pixel porque D3DDECLUSAGE_TEXCOORD1 é usado para registros de entrada de sombreador de pixel (v0, v1) e o registro de saída do sombreador de vértice o3.
vs_3_0
...
dcl_texcoord0 o3.x
dcl_texcoord1 o3.yz
dcl_texcoord2 o3.w // BAD! Would be valid if this were not o3
dcl_texcoord3 o9 ...
Por outro lado, esse sombreador de vértice não pode ser emparelhado com o sombreador de pixel porque a máscara de saída de um parâmetro com uma determinada semântica não fornece os dados solicitados pelo sombreador de pixel:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord2 o7.yz // BAD! Would be valid if w were included
dcl_texcoord3 o9
...
Esse sombreador de vértice não fornece uma saída com um dos nomes semânticos solicitados pelo sombreador de pixel, portanto, o emparelhamento do sombreador é inválido:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord3 o9
// The pixel shader wants texcoord2, with a w component,
// but it isn't output by this vertex shader at all!
...
Alterações no modo de neblina, profundidade e sombreamento
Quando D3DRS_SHADEMODE é definido para sombreamento plano durante a rasterização de recorte e triângulo, os atributos com D3DDECLUSAGE_COLOR são interpolados como sombreados planos. Se algum componente de um registro for declarado com uma semântica de cor, mas outros componentes do mesmo registro receberem semântica diferente, a interpolação de sombreamento simples (linear versus plana) será indefinida nos componentes nesse registro sem uma semântica de cor.
Se a renderização de neblina for desejada, os sombreadores vs_3_0 e ps_3_0 deverão implementar a neblina. Nenhum cálculo de neblina é feito fora dos sombreadores. Não há registro de neblina em vs_3_0, e D3DDECLUSAGE_FOG semântica adicionais (para o fator de mistura de neblina calculado por vértice) e D3DDECLUSAGE_DEPTH (para passar um valor de profundidade para o sombreador de pixel para calcular o fator de mistura de neblina) foram adicionados.
O estado do estágio de textura D3DTSS_TEXCOORDINDEX é ignorado ao usar o sombreador de pixel 3.0.
Os seguintes valores foram adicionados para acomodar essas alterações:
// Fog and Depth usages
D3DDECLUSAGE_FOG
D3DDECLUSAGE_DEPTH
// Additional wrap states for vs_3_0 attributes with D3DDECLUSAGE_TEXCOORD
D3DRS_WRAP8
D3DRS_WRAP9
D3DRS_WRAP10
D3DRS_WRAP11
D3DRS_WRAP12
D3DRS_WRAP13
D3DRS_WRAP14
D3DRS_WRAP15
Conversões de ponto flutuante e inteiro
A matemática de ponto flutuante ocorre em diferentes precisões e intervalos (16 bits, 24 bits e 32 bits) em diferentes partes do pipeline. Um valor maior que o intervalo dinâmico do pipeline que entra nesse pipeline (por exemplo, um mapa de textura float de 32 bits é amostrado em um pipeline float de 24 bits em ps_2_0) cria um resultado indefinido. Para um comportamento previsível, você deve fixar esse valor ao intervalo dinâmico máximo.
A conversão de um valor de ponto flutuante em um inteiro ocorre em vários locais, como:
- Ao encontrar um móvel - vs instrução.
- Durante o endereçamento de textura.
- Ao gravar em um destino de renderização de ponto não flutuante.
Especificando precisão total ou parcial
Tanto ps_3_0 quanto ps_2_x dão suporte a dois níveis de precisão:
ps_3_0 | ps_2_0 | Precisão | Valor |
---|---|---|---|
x | Completo | fp32 ou superior | |
x | Precisão parcial | fp16=s10e5 | |
x | x | Completo | fp24=s16e7 ou superior |
x | x | Precisão parcial | fp16=s10e5 |
ps_3_0 dá suporte a mais precisão do que ps_2_0. Por padrão, todas as operações ocorrem no nível de precisão total.
A precisão parcial (consulte Modificadores de registro de sombreador de pixel) é solicitada adicionando o modificador _pp ao código do sombreador (desde que a implementação subjacente dê suporte a ele). As implementações são sempre livres para ignorar o modificador e executar as operações afetadas com precisão total.
O modificador _pp pode ocorrer em dois contextos:
- Em uma declaração de coordenada de textura para passar coordenadas de textura de precisão parcial para o sombreador de pixel. Isso pode ser usado quando a textura coordena os dados de cor de retransmissão para o sombreador de pixel, o que pode ser mais rápido com precisão parcial do que com precisão total em algumas implementações.
- Em qualquer instrução para solicitar o uso de precisão parcial, incluindo instruções de carga de textura. Isso indica que a implementação tem permissão para executar a instrução com precisão parcial e armazenar um resultado de precisão parcial. Na ausência de um modificador explícito, a instrução deve ser executada com precisão total (independentemente da precisão dos operandos de entrada).
Um aplicativo pode optar deliberadamente por trocar a precisão pelo desempenho. Há vários tipos de dados de entrada de sombreador que são candidatos naturais para processamento de precisão parcial:
- Iteradores de cor são bem representados por valores de precisão parcial.
- Valores de textura da maioria dos formatos podem ser representados com precisão por valores de precisão parcial (valores amostrados de texturas de formato de ponto flutuante de 32 bits são uma exceção óbvia).
- As constantes podem ser representadas pela representação de precisão parcial, conforme apropriado para o sombreador.
Em todos esses casos, o desenvolvedor pode optar por especificar a precisão parcial para processar os dados, sabendo que nenhuma precisão de dados de entrada é perdida. Em alguns casos, um sombreador pode exigir que as etapas internas de um cálculo sejam executadas com precisão total, mesmo quando os valores de entrada e saída final não tiverem mais do que precisão parcial.
Sombreadores de vértice e pixel de software
As implementações de software (tempo de execução e referência para sombreadores de vértice e referência para sombreadores de pixel) de sombreadores da versão 2_0 e superiores têm alguma validação reduzida. Isso é útil para fins de depuração e criação de protótipos. O aplicativo indica ao runtime/assembler que precisa de parte da validação reduzida usando o sinalizador _sw no assembler (por exemplo, vs_2_sw). Um sombreador de software não funcionará com hardware.
vs_2_sw é um relaxamento para as tampas máximas de vs_2_x; da mesma forma, ps_2_sw é um relaxamento para as tampas máximas de ps_2_x. Especificamente, as seguintes validações são relaxadas:
Modelo de sombreador | Recurso | Limite |
---|---|---|
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Contagens de instruções | Ilimitado |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros de constante float | 8192 |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros constantes inteiros | 2.048 |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros constantes boolianos | 2.048 |
ps_2_sw | Profundidade de leitura dependente | Ilimitado |
vs_2_sw | instruções e rótulos de controle de fluxo | Ilimitado |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Início/etapa/contagens de loop | O tamanho da etapa de inicialização e iteração para instruções de rep e loop são inteiros com sinal de 32 bits. A contagem pode ser de até MAX_INT/64. |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Limites de porta | Os limites de porta para todos os arquivos de registro são reduzidos. |
vs_3_sw | Número de interpoladores | 16 registros de saída em vs_3_sw. |
ps_3_sw | Número de interpoladores | 14(16-2) registros de entrada para ps_3_sw. |
Tópicos relacionados