Asignación de desplazamiento (Direct3D 9)
Los mapas de desplazamiento son similares a los mapas de textura, pero el motor de vértices accede a ellos.
Diagrama de bloques
Hay una fase de muestreo adicional en la parte temprana de la canalización de vértices, como se muestra en el diagrama siguiente, que puede muestrear un mapa de desplazamiento para proporcionar datos de desplazamiento de vértices.
El estado del sampler del mapa de desplazamiento se puede establecer mediante SetSamplerState mediante el número de fase 256, que es un nuevo número de fase. SetTexture establece la textura del mapa de desplazamiento.
El mapa se puede preamplear o no, lo que significa que se puede ordenar de una manera que permita la búsqueda de los valores de desplazamiento sin filtrar.
- Los mapas de desplazamiento son análogos a los mapas de texturas, pero son accesibles por el motor de vértices.
- Hay una fase de muestreo adicional en la parte temprana de la canalización de vértices que puede muestrear un mapa de desplazamiento. La API SetSamplerState habitual tiene acceso a esta fase, pero el número de fase es D3DDMAPSAMPLER = 256.
- El estado del sampler del mapa de desplazamiento se puede establecer mediante SetSamplerState(D3DDMAPSAMPLER, ...) API.
- La textura del mapa de desplazamiento se establece mediante la API SetTexture(D3DDMAPSAMPLER, texture).
- El mapa se puede muestrear previamente o no. Esto significa que se puede ordenar de una manera determinada que permite la búsqueda de los valores de desplazamiento sin filtrar.
- Los cambios en la estructura de declaración permiten la especificación de la coordenada de textura utilizada para buscar el mapa de texturas. Por ejemplo, Stream0, Offset, FLOAT2, LOOKUP, Displacement_value. Esto indica al teselador que use el vector flotante 2D en stream0 en un desplazamiento determinado como coordenada de textura para buscar el mapa de desplazamiento y asociarle la semántica de uso de Displacement_value. La declaración del sombreador de vértices contendrá una línea similar a {dcl_texture0, v0} que indica que la semántica de textura0 se asociará al registro de entrada v0. El valor de desplazamiento que se busca se copia en el registro de entrada v0.
- Hay un tipo especial de asignación de desplazamiento, cuando el mapa de texturas se muestrea previamente. El índice secuencial de vértices generados se usa como coordenada de textura para un mapa de textura. Por ejemplo, 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Usage, UsageIndex.
- La salida de la búsqueda es de 4 floats.
- La asignación de desplazamiento solo se admite con N revisiones.
- Los controladores deben omitir D3DDMAPSAMPLER en SetTextureStageState si no controlan los mapas de desplazamiento.
- no se admite D3DTEXF_ANISOTROPIC modo de filtro.
- Cuando D3DSAMP_MIPFILTER en el sampler de mapa de desplazamiento no es D3DTEXF_NONE, el nivel de detalle se calcula de la siguiente manera (tenga en cuenta que el estado de teselación adaptable se usa incluso si el D3DRS_ENABLEADAPTIVETESSELLATION es FALSE): Tmax = render state D3DRS_MAXTESSELLATIONLEVEL
- Calcular el nivel de teselación Te para un vértice Vi: (Xi, Yi, Zi) de la misma manera que se describe en la sección "Teselación adaptable". Nivel de detalle L = log2(Tmax): log2 (Te).
- Las operaciones de muestreo y filtrado de texturas siguen las mismas reglas que la canalización de píxeles (se aplica el sesgo de nivel de detalle (LOD), etc.).
- No todos los formatos se pueden usar como mapas de desplazamiento, sino solo aquellos que admiten el D3DUSAGE_DMAP. La aplicación puede consultarlo con CheckDeviceFormat CheckDeviceFormat.
- D3DUSAGE_DMAP debe especificarse en CreateTexture para notificar al controlador que esta textura se va a usar como mapa de desplazamiento.
- D3DUSAGE_DMAP solo se puede usar con texturas. No se puede usar con mapas o volúmenes de cubos.
- Las texturas y los destinos de representación creados con D3DUSAGE_DMAP se pueden establecer en fases normales del sampler y como destinos de representación.
- Los estados de representación para establecer el modo de ajuste de las coordenadas de textura se omiten en la asignación de desplazamiento. En general, no hay modos de ajuste para el motor de teselador.
- Un sampler de mapa de desplazamiento tiene un comportamiento idéntico al de los muestreadores de textura de píxeles. Si se busca una textura con menos de cuatro canales (como R32f), los valores buscados van a los canales adecuados del registro de destino (el registro de entrada del sombreador de vértices etiquetado con la semántica _sample), mientras que los demás canales tienen como valor predeterminado (1, 1, 1). Cuando se busca, D3DFMT_L8 se transmite a los canales R, G, B y A de forma predeterminada a 1. El rasterizador de referencia tiene los detalles de implementación completos.
Asignación de desplazamiento muestreada previamente
- Se introduce un nuevo estado de muestra: D3DSAMP_DMAPOFFSET (DWORD): desplazamiento (en vértices) en un mapa de desplazamiento pre muestreado.
- Se introduce un nuevo método de declaración: D3DDECLMETHOD_LOOKUPPRESAMPLED.
- Se debe deshabilitar la teselación adaptable.
- Se omite la configuración del filtro de textura. Se realiza el muestreo de puntos. Se supone que el filtro de textura mip es D3DTEXF_NONE. Se supone que todos los demás modos de filtro de textura son D3DTEXF_POINT.
- Las coordenadas de textura se calculan como: U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) donde Index es un índice secuencial de vértices generados más TSS[D3DSAMP_DMAPOFFSET]. El índice secuencial se establece en cero al principio de cada primitivo y se incrementa después de generar un vértice.
Estos son los cambios de api que admiten la asignación de desplazamiento.
- Se ha agregado un formato de canal único, D3DFMT_L16.
- Nueva marca de uso, D3DUSAGE_DMAP.
- Una fase de textura especial, utilizada para establecer una textura de mapa de desplazamiento, D3DDMAPSAMPLER.
- Se han agregado nuevos límites de hardware, D3DDEVCAPS2_DMAPNPATCH y D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Consulte D3DDEVCAPS2.
Temas relacionados