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.
As seções a seguir descrevem como o Direct3D lida com conversões entre tipos de dados.
- Terminologia do tipo de dados
- de conversão de ponto flutuante
- de conversão de inteiros
- de conversão de inteiros de ponto fixo
- Tópicos relacionados
Terminologia do tipo de dados
O seguinte conjunto de termos é subsequentemente usado para caracterizar várias conversões de formato.
| Vigência | Definição |
|---|---|
| SNORM | Inteiro normalizado assinado, o que significa que, para o número de complemento de um 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). Há, portanto, duas representações inteiras 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 inteiras para valores de ponto flutuante uniformemente espaçados no intervalo (-1.0f... 0,0f), e também um conjunto complementar de representações para números no intervalo (0,0f... 1,0 f) |
| UNORM | Inteiro normalizado não assinado, o que significa que, para um número n-bit, todos os 0 significam 0,0f e todos os 1 significam 1,0f. Uma sequência de valores de ponto flutuante uniformemente espaçados 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 assinado. Inteiro do complemento de 2. por exemplo, um SINT de 3 bits representa os valores integrais -4, -3, -2, -1, 0, 1, 2, 3. |
| UINT | Inteiro não assinado. Por exemplo, uma 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 ao UNORM, em que para um número n-bit, todos os 0's significam 0.0f e todos os 1's significam 1.0f. No entanto, ao contrário do UNORM, com o SRGB a sequência de codificações inteiras não assinadas entre todos os 0's a todos os 1's representam uma progressão não linear na interpretação de ponto flutuante dos números, entre 0,0f a 1,0f. Grosso modo, se essa progressão não linear, SRGB, for exibida como uma sequência de cores, ela apareceria como uma rampa linear de níveis de luminosidade para um observador "médio", em condições de visualização "médias", em uma exibição "média". Para obter detalhes completos, consulte a norma 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 diferentes representações, incluindo de ou para representações de ponto não flutuante, aplicam-se as seguintes regras.
Conververtendo de uma representação de intervalo mais alto para uma representação de intervalo inferior
- Arredondar para zero é usado durante a conversão para outro formato float. Se o destino for um formato de inteiro ou ponto fixo, arredondado para mais próximo par é usado, a menos que a conversão seja explicitamente documentada como usando outro comportamento de arredondamento, como arredondamento para mais próximo para 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 round-to-zero. Finalmente, as conversões float-to-fixed usadas pelo amostrador de textura e rasterizador têm uma tolerância especificada medida em Unit-Last-Place a partir de um ideal infinitamente preciso.
- Para valores de origem maiores do que o intervalo dinâmico de um formato de destino de intervalo inferior (por exemplo, um grande valor float de 32 bits é gravado em um float RenderTarget de 16 bits), o valor máximo representável (devidamente assinado) resulta, NÃO incluindo infinito assinado (devido à rodada para zero descrita acima).
- NaN em um formato de intervalo mais alto será convertido para 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.
- 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, será convertido para o valor máximo representável. O sinal será preservado se disponível no formato de destino.
- Denorm em um formato de intervalo mais alto será convertido para a representação 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 para uma representação de intervalo mais alto
- NaN em um formato de intervalo inferior será convertido para a representação NaN no formato de intervalo mais alto, se disponível no formato de intervalo mais alto. Se o formato de intervalo superior não tiver uma representação NaN, ele será convertido em 0.
- INF em um formato de intervalo inferior será convertido para a representação INF no formato de intervalo mais alto, se disponível no formato de intervalo mais alto. Se o formato superior não tiver uma representação INF, será convertido para o valor máximo representável (MAX_FLOAT nesse formato). O sinal será preservado se disponível no formato de destino.
- Denorm em um formato de intervalo inferior será convertido em uma representação normalizada no formato de intervalo mais alto, se possível, ou então em uma representação Denorm no formato de intervalo mais alto, se a representação Denorm existir. Caso contrário, se o formato de intervalo superior não tiver uma representação 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 Denorm (porque Denorms em operações em floats de 32 bits são liberados para sinalizar 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 | Dado um valor inteiro n-bit que representa o intervalo assinado [-1.0f a 1.0f], a conversão para ponto flutuante é a seguinte.
|
| FLUTUAR | SNORM | Dado um número de vírgula flutuante, a conversão para um valor inteiro n-bit que representa o intervalo assinado [-1.0f a 1.0f] é a seguinte.
|
| UNORM | FLUTUAR | O valor inicial de n-bit é convertido em float (0.0f, 1.0f, 2.0f, etc.) e depois dividido por (2ⁿ-1). |
| FLUTUAR | UNORM | Deixe c representar o valor inicial.
|
| SRGB | FLUTUAR | A seguir está a conversão ideal de SRGB para FLOAT.
|
| FLUTUAR | SRGB | A seguir está a conversão ideal de FLOAT -> SRGB. Supondo que o componente de cor SRGB de destino tenha n bits:
|
| SINT | SINT com mais bits | Para converter de SINT para um SINT com mais bits, o bit mais significativo (MSB) do número inicial é "sign-extended" para os bits adicionais disponíveis no formato de destino. |
| UINT | SINT com mais bits | Para converter de UINT para um SINT com mais bits, o número é copiado para os bits menos significativos (LSBs) do formato de destino e MSBs adicionais são preenchidos com 0. |
| SINT | UINT com mais bits | Para converter de SINT para UINT com mais bits: Se negativo, o valor é fixado a 0. Caso contrário, o número é copiado para os LSBs do formato de destino e os MSBs adicionais são preenchidos com 0. |
| UINT | UINT com mais bits | Para converter de UINT para UINT com mais bits, o número é copiado para LSBs do formato de destino e MSBs adicionais são preenchidos com 0. |
| SINT ou UINT | SINT ou UINT com menos bits ou iguais | Para converter de um SINT ou UINT para SINT ou UINT com menos bits ou iguais (e/ou alteração na assinatura), o valor inicial é simplesmente fixado ao intervalo do formato de destino. |
Conversão de inteiro de ponto fixo
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" ubíquo é 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 de 8 bits de fração. A parte inteira é armazenada no complemento de 2, pelo menos como definido aqui (embora possa ser definido igualmente para inteiros não assinados também). A parte fracionária é armazenada na forma não assinada. A parte fracionária representa sempre 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 realizadas simplesmente usando a aritmética de inteiros padrão, sem qualquer consideração sobre onde está o decimal implícito. Adicionar 1 a um número de ponto fixo de 16,8 significa apenas adicionar 256, uma vez que a casa decimal está a 8 posições da extremidade menos significativa do número. Outras operações, como a multiplicação, também podem ser realizadas simplesmente usando a aritmética de inteiros, desde que o efeito sobre o decimal fixo 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 inteiro de ponto fixo são usadas de duas maneiras no Direct3D.
- As posições de vértice pós-cortadas no rasterizador são encaixadas no ponto fixo, para distribuir uniformemente a precisão pela área RenderTarget. Muitas operações do rasterizador, incluindo o abate facial como um exemplo, ocorrem em posições ajustadas de ponto fixo, enquanto outras operações, como a configuração do interpolador de atributos, usam posições que foram convertidas de volta para o ponto flutuante a partir das posições ajustadas do ponto fixo.
- As coordenadas de textura para operações de amostragem são ajustadas ao ponto fixo (depois de dimensionadas pelo tamanho da textura), para distribuir uniformemente a precisão pelo espaço de textura, na escolha de locais/pesos de torneira do filtro. Os valores de peso são convertidos de volta para 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 | Inteiro de ponto fixo | A seguir está o procedimento geral para converter um número de ponto flutuante n em um inteiro de ponto fixo i.f, onde i é o número de bits inteiros (assinados) e f é o número de bits fracionários.
|
| Inteiro de ponto fixo | FLUTUAR | Suponha que a representação específica de ponto fixo que está sendo convertida em float não contém mais do que um total de 24 bits de informação, dos quais não mais de 23 bits estão no componente fracionário. Suponha que um determinado número de ponto fixo, fxp, esteja na forma i.f (inteiro de bits i, fração de bits f). A conversão para float é semelhante ao seguinte pseudocódigo. resultado float = (float)(fxp >> f) + // inteiro de extrato
|
Tópicos relacionados
-
Recursos (Direct3D 10)