Regras de conversão de dados
As seções a seguir descrevem como o Direct3D lida com conversões entre tipos de dados.
- de Terminologia de Tipo de Dados
- de conversão de ponto flutuante
- de conversão de inteiro
- conversão de inteiro de ponto fixo
- tópicos relacionados
Terminologia de tipo de dados
O conjunto de termos a seguir é usado posteriormente para caracterizar várias conversões de formato.
Prazo | Definição |
---|---|
SNORM | Inteiro normalizado com sinal, o que significa que, para um número complementar de n bit 2, o valor máximo significa 1,0f (por exemplo, o valor de 5 bits 01111 mapeia para 1,0f), e o valor mínimo significa -1,0f (por exemplo, o valor de 5 bits 10000 mapeia para -1,0f). Além disso, o segundo número mínimo mapeia para -1,0f (por exemplo, o valor de 5 bits 10001 mapeia para -1,0f). Portanto, há duas representações de inteiro para -1,0f. Há uma única representação para 0,0f e uma única representação para 1,0f. Isso resulta em um conjunto de representações de inteiros para valores de ponto flutuante espaçados uniformemente no intervalo (-1,0f... 0,0f) e também um conjunto complementar de representações para números no intervalo (0,0f... 1,0f) |
UNORM | Inteiro normalizado sem sinal, o que significa que, para um número de n bits, todos os 0 significa 0,0f e todos os 1 significa 1,0f. Uma sequência de valores de ponto flutuante espaçados uniformemente de 0,0f a 1,0f são representados. Por exemplo, um UNORM de 2 bits representa 0,0f, 1/3, 2/3 e 1,0f. |
SINT | Inteiro com sinal. Inteiro de complemento 2. Por exemplo, um SINT de 3 bits representa os valores integrais -4, -3, -2, -1, 0, 1, 2, 3. |
UINT | Inteiro sem sinal. Por exemplo, um UINT de 3 bits representa os valores integrais 0, 1, 2, 3, 4, 5, 6, 7. |
FLUTUAR | Um valor de ponto flutuante em qualquer uma das representações definidas pelo Direct3D. |
SRGB | Semelhante a UNORM, em que para um número de n bits, todos os 0 significa 0,0f e todos os 1 significa 1,0f. No entanto, ao contrário de UNORM, com SRGB, a sequência de codificações de inteiros sem sinal entre todos os 0 e todos os 1 representa uma progressão não linear na interpretação de ponto flutuante dos números, entre 0,0f a 1,0f. Aproximadamente, se essa progressão não linear, SRGB, for exibida como uma sequência de cores, ela aparecerá como uma rampa linear de níveis de luminosidade para um observador "médio", em condições de exibição "média", em uma exibição "média". Para obter detalhes completos, consulte o padrão de cores SRGB, IEC 61996-2-1, na IEC (Comissão Eletrotécnica Internacional). |
Conversão de ponto flutuante
Sempre que ocorrer uma conversão de ponto flutuante entre representações diferentes, incluindo de ou para representações de ponto não flutuante, as regras a seguir se aplicam.
Inverter de uma representação de intervalo mais alto para uma representação de intervalo inferior
- Arredondar para zero é usado durante a conversão em outro formato float. Se o destino for um formato de ponto inteiro ou fixo, será usado de volta para o par mais próximo, a menos que a conversão esteja explicitamente documentada como usando outro comportamento de arredondamento, como arredondar para mais próximo de FLOAT para SNORM, FLOAT para UNORM ou FLOAT para SRGB. Outras exceções são as instruções de sombreador ftoi e ftou, que usam de volta a zero. Por fim, as conversões float-to-fixed usadas pelo sampler de textura e pelo rasterizador têm uma tolerância especificada medida em Unit-Last-Place de um ideal infinitamente preciso.
- Para valores de origem maiores que o intervalo dinâmico de um formato de destino de intervalo inferior (por exemplo, um valor flutuante grande de 32 bits é gravado em um RenderTarget flutuante de 16 bits), o valor máximo representável (apropriadamente assinado), NÃO incluindo infinito assinado (devido à rodada a zero descrita acima).
- NaN em um formato de intervalo mais alto será convertido em representação naN no formato de intervalo inferior se a representação naN existir no formato de intervalo inferior. Se o formato inferior não tiver uma representação naN, o resultado será 0.
- O INF em um formato de intervalo mais alto será convertido em INF no formato de intervalo inferior, se disponível. Se o formato inferior não tiver uma representação INF, ele será convertido no valor máximo representável. O sinal será preservado se disponível no formato de destino.
- O denorm em um formato de intervalo mais alto será convertido na representação de Denorm no formato de intervalo inferior se disponível no formato de intervalo inferior e a conversão for possível, caso contrário, o resultado será 0. O bit de sinal será preservado se disponível no formato de destino.
Convertendo de uma representação de intervalo inferior em uma representação de intervalo mais alto
- NaN em um formato de intervalo inferior será convertido na representação naN no formato de intervalo superior, se disponível no formato de intervalo superior. Se o formato de intervalo superior não tiver uma representação naN, ele será convertido em 0.
- O INF em um formato de intervalo inferior será convertido na representação INF no formato de intervalo superior, se disponível no formato de intervalo superior. Se o formato superior não tiver uma representação INF, ele será convertido no valor máximo representável (MAX_FLOAT nesse formato). O sinal será preservado se disponível no formato de destino.
- O denorm em um formato de intervalo inferior será convertido em uma representação normalizada no formato de intervalo superior, se possível, ou em uma representação de Denorm no formato de intervalo superior se a representação de Denorm existir. Falhando neles, se o formato de intervalo superior não tiver uma representação de Denorm, ele será convertido em 0. O sinal será preservado se disponível no formato de destino. Observe que os números flutuantes de 32 bits contam como um formato sem uma representação de Denorm (porque denorms em operações em floats de 32 bits são liberados para assinar preservado 0).
Conversão de inteiros
A tabela a seguir descreve conversões de várias representações descritas acima para outras representações. Somente as conversões que realmente ocorrem no Direct3D são mostradas.
Tipo de dados de origem | Tipo de dados de destino | Regra de conversão |
---|---|---|
SNORM | FLUTUAR | Considerando um valor inteiro de n bits que representa o intervalo assinado [-1,0f a 1,0f], a conversão em ponto flutuante é a seguinte.
|
FLUTUAR | SNORM | Dado um número de ponto flutuante, a conversão em um valor inteiro de n bits que representa o intervalo assinado [-1,0f a 1,0f] é a seguinte.
|
UNORM | FLUTUAR | O valor de n bit inicial é convertido em float (0.0f, 1.0f, 2.0f etc.) e dividido por (2ⁿ-1). |
FLUTUAR | UNORM | Deixe c representar o valor inicial.
|
SRGB | FLUTUAR | Veja a seguir a conversão SRGB ideal para FLOAT.
|
FLUTUAR | SRGB | Veja a seguir o FLOAT ideal –> conversão SRGB. Supondo que o componente de cor SRGB de destino tenha n bits:
|
SINT | SINT com mais bits | Para converter do SINT em um SINT com mais bits, o MSB (bit mais significativo) do número inicial é "estendido por sinal" para os bits adicionais disponíveis no formato de destino. |
UINT | SINT com mais bits | Para converter de UINT em um SINT com mais bits, o número é copiado para os LSBs (bits menos significativos) do formato de destino e os MSBs adicionais são adicionados com 0. |
SINT | UINT com mais bits | Para converter de SINT para UINT com mais bits: se negativo, o valor é fixado em 0. Caso contrário, o número será copiado para os LSBs do formato de destino e os MSB adicionais serão adicionados com 0. |
UINT | UINT com mais bits | Para converter de UINT para UINT com mais bits, o número é copiado para os LSBs do formato de destino e msb adicionais são adicionados com 0. |
SINT ou UINT | SINT ou UINT com menos ou bits iguais | Para converter de um SINT ou UINT em SINT ou UINT com menos bits ou iguais (e/ou alteração na sinalização), o valor inicial é simplesmente fixado ao intervalo do formato de destino. |
Conversão de inteiro de ponto fixo
Os inteiros de ponto fixo são simplesmente inteiros de algum tamanho de bit que têm um ponto decimal implícito em um local fixo.
O tipo de dados "inteiro" onipresente é um caso especial de um inteiro de ponto fixo com o decimal no final do número.
As representações de número de ponto fixo são caracterizadas como: i.f, onde i é o número de bits inteiros e f é o número de bits fracionários. por exemplo, 16,8 significa inteiro de 16 bits seguido por 8 bits de fração. A parte inteiro é armazenada no complemento de 2, pelo menos conforme definido aqui (embora possa ser definida igualmente para inteiros não assinados também). A parte fracionária é armazenada em formato não assinado. A parte fracionária sempre representa a fração positiva entre os dois valores integrais mais próximos, começando pelo mais negativo.
As operações de adição e subtração em números de ponto fixo são executadas simplesmente usando aritmética de inteiro padrão, sem qualquer consideração sobre onde está a decimal implícita. Adicionar 1 a um número de ponto fixo de 16,8 significa apenas adicionar 256, já que o decimais é 8 lugares do final menos significativo do número. Outras operações, como multiplicação, podem ser executadas, bem como simplesmente usar aritmética de inteiro, desde que o efeito na decimal fixa seja contabilizado. Por exemplo, multiplicar dois inteiros de 16,8 usando uma multiplicação de inteiros produz um resultado de 32,16.
As representações de inteiros de ponto fixo são usadas de duas maneiras no Direct3D.
- As posições de vértice pós-recorte no rasterizador são encaixadas em um ponto fixo, para distribuir uniformemente a precisão na área RenderTarget. Muitas operações de rasterizador, incluindo o abate facial como um exemplo, ocorrem em posições ajustadas por ponto fixo, enquanto outras operações, como a instalação do interpolador de atributo, usam posições que foram convertidas de volta em ponto flutuante das posições ajustadas do ponto fixo.
- As coordenadas de textura para operações de amostragem são encaixadas em ponto fixo (após serem dimensionadas por tamanho de textura) para distribuir uniformemente a precisão entre o espaço de textura, na escolha de locais/pesos de toque de filtro. Os valores de peso são convertidos de volta em ponto flutuante antes que a aritmética de filtragem real seja executada.
Tipo de dados de origem | Tipo de dados de destino | Regra de conversão |
---|---|---|
FLUTUAR | Número inteiro de ponto fixo | Veja a seguir o procedimento geral para converter um número de ponto flutuante n em um inteiro de ponto fixo, ou seja, o número de bits inteiros (assinados) e f é o número de bits fracionários.
|
Número inteiro de ponto fixo | FLUTUAR | Suponha que a representação de ponto fixo específica que está sendo convertida em float não contenha mais do que um total de 24 bits de informações, no máximo 23 bits dos quais está no componente fracionário. Suponha que um determinado número de ponto fixo, fxp, esteja no formato i.f (i bits inteiros, f bits fração). A conversão para flutuar é semelhante ao pseudocódigo a seguir. float result = (float)(fxp >> f) + // extrair inteiro
|
Tópicos relacionados
-
recursos do (Direct3D 10)