Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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, poderá não usar 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 de 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 a Semântica de Correspondência em vs 3.0 e sombreadores ps 3.0.
Foram adicionados estados de renderização de modo de encapsulamento adicionais para cobrir a possibilidade de coordenadas de textura adicionais neste novo esquema. Atributos com D3DDECLUSAGE_TEXCOORD e índice de uso de 0 a 15 são interpolados no modo de encapsulamento quando oD3DRS_WRAP* correspondente é definido.
- recursos do Sombreador de Vértice Modelo 3
- Recursos do Pixel Shader Model 3
- a 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 de precisão total ou parcial
- sombreadores de vértice e pixel de software
Recursos do Sombreador de Vértice Modelo 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 eficiente, 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 de 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 posição e a semântica de psize 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 de 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) no máximo.
- O último registro (ou décimo segundo) pode conter apenas um escalar (como o tamanho do ponto).
Para obter uma listagem dos registros, consulte Registros – vs_3_0.
Exemplo 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 de constante de sombreador podem ser definidos usando:
- SetPixelShaderConstantB
- SetPixelShaderConstantI
- SetPixelShaderConstantF
Corresponder semântica 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 pixels empacota vários nomes em um 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 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 do 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 de 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 simples durante o recorte e a rasterização do 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 simples) 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 foram adicionadas D3DDECLUSAGE_FOG de semântica adicional (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).
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 estas 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 intervalos e precisão (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 flutuante de 32 bits é amostrado em um pipeline flutuante de 24 bits em ps_2_0) cria um resultado indefinido. Para um comportamento previsível, você deve fixar esse valor no máximo do intervalo dinâmico.
A conversão de um valor de ponto flutuante para um inteiro ocorre em vários lugares, como:
- Ao encontrar um mova - 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 | Cheio | fp32 ou superior | |
| x | Precisão parcial | fp16=s10e5 | |
| x | x | Cheio | 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 do 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 de _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 coordenadas de textura retransmitem dados de cor para o sombreador de pixel, 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 da 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.
- Os valores de textura da maioria dos formatos podem ser representados com precisão precisa 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 têm 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) dos sombreadores da versão 2_0 e acima têm alguma validação descontraída. Isso é útil para fins de depuração e criação de protótipos. O aplicativo indica ao runtime/assembler que ele precisa de parte da validação relaxada 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 constantes flutuantes | 8192 |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros constantes inteiros | 2048 |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros constantes boolianos | 2048 |
| 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 relaxados. |
| 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