Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os sombreadores de vértice e os sombreadores de pixel são consideravelmente simplificados em relação às versões anteriores do sombreador. Se você estiver implementando sombreadores no hardware, não poderá usar vs_3_0 ou ps_3_0 com nenhuma outra versão de sombreador e não poderá usar nenhum dos tipos de sombreador com o pipeline de função fixa. Essas alterações tornam possível simplificar os drivers e o tempo de execução. A única exceção é que sombreadores de vs_3_0 somente software podem ser usados com qualquer versão de 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ânticas de saída compatíveis com códigos FVF (formato de vértice flexível).
A semântica usada nas saídas do sombreador de vértice deve ser usada nas entradas do 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 registradores de entrada do sombreador de vértice e modelos de sombreador anteriores. Consulte Corresponder semântica em sombreadores vs 3.0 e ps 3.0.
Estados de renderização adicionais do modo wrap foram adicionados 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 aD3DRS_WRAP* correspondente é definida.
- Vertex Shader Model 3 apresenta
- Pixel Shader Model 3 apresenta
- Combinar semântica em sombreadores de vs_3_0 e ps_3_0
- modo de nevoeiro, profundidade e sombreamento muda
- de conversões de ponto flutuante e inteiro
- Especificando de precisão total ou parcial
- Software Vertex e Pixel Shaders
Vertex Shader Model 3 Características
Os tipos de registro de saída do sombreador de vértice foram recolhidos em doze registros (consulte Output Registers). 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 do vs_2_0 com indexação de registro mais poderosa, um conjunto de registros de saída simplificados, a capacidade de amostragem de uma textura em um sombreador de vértice e a capacidade de controlar a taxa na qual as entradas de sombreador são inicializadas.
Indexar qualquer registo
Todos os registros( Input Register e Output Registers) podem ser indexados usando Loop Counter Register (somente registros constantes podiam ser indexados em versões anteriores.)
Você deve declarar os 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 tamanho de posição ou ponto. De facto, se for utilizada indexação, a semântica position e psize têm de ser declaradas nos registos o0 e o1, respectivamente.
Só é permitido indexar um intervalo contínuo de registos; ou seja, não é possível indexar entre registos que não tenham sido declarados. Embora essa restrição possa ser inconveniente, ela permite que a otimização de hardware ocorra. A tentativa de indexação em registos não contíguos produzirá resultados indefinidos. A validação de sombreador não impõe essa restrição.
Simplifique os registros de saída
Todos os vários tipos de registradores de saída foram recolhidos em doze registradores 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 registos podem ser repartidos do seguinte modo:
- Pelo menos um registo deve ser declarado como um registo de posição com quatro componentes. Este é o único registro de sombreador de vértice necessário.
- Os primeiros dez registradores consumidos por um sombreador podem usar até quatro componentes (xyzw) no máximo.
- O último (ou décimo segundo) registo só pode conter um registo escalar (como o tamanho do ponto).
Para obter uma lista dos registos, consulte Registos - vs_3_0.
Amostra de textura em um sombreador de vértice
O sombreador Vertex 3_0 suporta pesquisa de textura no sombreador de vértice usando texldl - vs.
Características do Pixel Shader Model 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 de Face é um registro escalar de ponto flutuante. Apenas o sinal deste registo é válido. Se o sinal é negativo, o primitivo é 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:
Corresponder semântica em sombreadores de vs_3_0 e ps_3_0
Existem algumas restrições no 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, este sombreador de pixel reúne 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 registo tem uma semântica diferente. Observe que você também pode nomear v0.x e v0.yz com semânticas diferentes (múltiplas) devido ao uso da máscara de gravação.
Dado o sombreador de pixel, o sombreador de vs_3_0 a seguir não pode ser emparelhado com ele:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o6.yzw
...
Estes dois sombreadores entram em conflito com o uso da semântica D3DDECLUSAGE_TEXCOORD0 E D3DDECLUSAGE_TEXCOORD1.
Reescreva o sombreador de vértice desta forma 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 os registradores 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 para 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
...
Este 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 nevoeiro, profundidade e sombreamento
Quando D3DRS_SHADEMODE é definido para sombreamento plano durante o recorte e a rasterização de triângulo, os atributos com D3DDECLUSAGE_COLOR são interpolados como sombreados planos. Se quaisquer componentes de um registro forem declarados com uma semântica de cores, mas outros componentes do mesmo registro receberem semânticas diferentes, a interpolação de sombreamento plano (linear versus plano) será indefinida nos componentes desse registro sem uma semântica de cores.
Se a renderização de névoa for desejada, vs_3_0 e ps_3_0 sombreadores devem implementar névoa. Nenhum cálculo de névoa é feito fora dos sombreadores. Não há registro de névoa em vs_3_0, e D3DDECLUSAGE_FOG semânticas adicionais (para fator de mistura de névoa 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 névoa) foram adicionadas.
O D3DTSS_TEXCOORDINDEX de estado do estágio de textura é ignorado ao usar o pixel shader 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 acontece em diferentes intervalos e precisão (16 bits, 24 bits e 32 bits) em diferentes partes do pipeline. Um valor maior do 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 máximo do intervalo dinâmico.
A conversão de um valor de ponto flutuante para um inteiro acontece em vários lugares, tais como:
- Ao encontrar um mova - vs instrução.
- Durante o endereçamento de textura.
- Ao escrever em um destino de renderização de ponto não flutuante.
Especificando precisão total ou parcial
Tanto o ps_3_0 quanto o ps_2_x fornecem suporte para 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 suporta 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 Pixel Shader) é solicitada adicionando o modificador _pp ao código do sombreador (desde que a implementação subjacente ofereça suporte a ele). As implementações são sempre livres para ignorar o modificador e executar as operações afetadas com total precisão.
O modificador _pp pode ocorrer em dois contextos:
- Em uma declaração de coordenadas de textura para passar coordenadas de textura de precisão parcial para o sombreador de pixel. Isso pode ser usado quando as 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 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 deliberadamente optar por trocar precisão por desempenho. Existem vários tipos de dados de entrada de sombreador que são candidatos naturais para processamento de precisão parcial:
- Os iteradores de cores são bem representados por valores de precisão parcial.
- Os valores de textura da maioria dos formatos podem ser representados com precisão parcial 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 por representação de precisão parcial, conforme apropriado para o sombreador.
Em todos esses casos, o desenvolvedor pode optar por especificar 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.
Software Vertex e Pixel Shaders
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 de versão 2_0 e superiores têm alguma validação relaxada. Isso é útil para fins de depuração e prototipagem. 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 os limites máximos de vs_2_x; Da mesma forma, ps_2_sw é um relaxamento para os limites máximos 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 | Contagem de instruções | Ilimitado |
| vs_2_sw, vs_3_sw, ps_2_sw ps_3_sw | Registos de constantes de flutuação | 8192 |
| vs_2_sw, vs_3_sw, ps_2_sw ps_3_sw | Registos de constantes inteiras | 2048 |
| vs_2_sw, vs_3_sw, ps_2_sw ps_3_sw | Registos de constantes booleanas | 2048 |
| ps_2_sw | Profundidade de leitura dependente | Ilimitado |
| vs_2_sw | Instruções e etiquetas de controlo de fluxo | Ilimitado |
| vs_2_sw, vs_3_sw, ps_2_sw ps_3_sw | Início/passo/contagens de loop | O início da iteração e o tamanho da etapa de iteração para instruções de rep e loop são inteiros assinados 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 registos de saída em vs_3_sw. |
| ps_3_sw | Número de interpoladores | 14(16-2) registos de entrada para ps_3_sw. |
Tópicos relacionados