Procesamiento de vértices de función fija (Direct3D 9)

En la canalización de vértices de función fija, el procesamiento de los vértices en un búfer de vértices aplica las matrices de transformación actuales para el dispositivo. Las operaciones de vértice, como la iluminación, la generación de marcas de clip y las extensiones de actualización también se pueden aplicar, opcionalmente. Cuando se usa el procesamiento fijo de vértices de función, la modificación de los elementos del búfer de vértices de destino se controla mediante la marca D3DPV_DONOTCOPYDATA . Esta marca solo se aplica al procesamiento de vértices de función fija. La interfaz IDirect3DDevice9 expone el método IDirect3DDevice9::P rocessVertices para procesar vértices. Los vértices se procesan desde un sombreador de vértices al conjunto de flujos de datos de entrada, lo que genera una única secuencia de datos de vértices intercalados en el búfer de vértices de destino llamando al método IDirect3DDevice9::P rocessVertices . El método acepta cinco parámetros que describen la ubicación y la cantidad de vértices que el método tiene como destino, el búfer de vértices de destino y las opciones de procesamiento. Después de la llamada, el búfer de destino contiene los datos de vértices procesados.

Los parámetros primero, segundo y tercero, SrcStartIndex, DestIndex y VertexCount, reflejan el índice del primer vértice que se va a cargar, el índice dentro del búfer de destino en el que se colocarán los vértices y el número total de vértices que se van a procesar y colocar en el búfer de destino, respectivamente. El cuarto parámetro, pDestBuffer debe establecerse en la dirección de la interfaz IDirect3DVertexBuffer9 del objeto de búfer de vértices que recibirá los vértices de origen. El parámetro SrcStartIndex especifica el índice en el que el método debe empezar a procesar vértices.

El parámetro final, Flags, determina las opciones de procesamiento especiales para el método . Puede establecer este parámetro en 0 para el procesamiento de vértices predeterminado o para D3DPV_DONOTCOPYDATA optimizar el procesamiento en algunas situaciones. También puede combinar el valor de D3DPV_DONOTCOPYDATA con uno o varios valores D3DLOCK adecuados para el búfer de destino. Al establecer Marcas en 0, los componentes de vértices del formato de vértice del búfer de vértices de destino que no se ven afectados por la operación de vértice todavía se copian del sombreador de vértices o se establecen en 0. Sin embargo, al usar D3DPV_DONOTCOPYDATA, IDirect3DDevice9::P rocessVertices no sobrescribe la información de coordenadas de textura y color en el búfer de destino a menos que Direct3D genere estos datos. El color difuso se genera cuando la iluminación está habilitada, es decir, D3DRS_LIGHTING se establece en TRUE. El color especular se genera cuando la iluminación está habilitada y se habilita especular, es decir, D3DRS_SPECULARENABLE y D3DRS_LIGHTING se establecen en TRUE. El color especular también se genera cuando se habilita la niebla. Las coordenadas de textura se generan cuando se habilita la transformación de texturas o la generación de texturas. IDirect3DDevice9::P rocessVertices usa los estados de representación actuales para determinar qué procesamiento de vértices se debe realizar.

Configuración de uso de FVF para búferes de vértices de destino

El método IDirect3DDevice9::P rocessVertices requiere una configuración específica para D3DFVF del búfer de vértices de destino. La configuración de uso de FVF debe ser compatible con la configuración actual para el procesamiento de vértices.

Para el procesamiento fijo de vértices de función, IDirect3DDevice9::P rocessVertices requiere la siguiente configuración de FVF:

  • El tipo de posición siempre es D3DFVF_XYZRHW ; por lo tanto, D3DFVF_XYZ y D3DFVF_XYZB1 a través de D3DFVF_XYZB5 No son válidos.
  • No se deben establecer las marcas D3DFVF_NORMAL, D3DFVF_RESERVED0 y D3DFVF_RESERVED2.
  • La marca de D3DFVF_DIFFUSE debe establecerse si una operación OR de las condiciones siguientes devuelve true:
    • La iluminación está habilitada; es decir, D3DRS_LIGHTING es TRUE.
    • La iluminación está deshabilitada, el color difuso está presente en los flujos de vértices de entrada y no se establece D3DPV_DONOTCOPYDATA .
  • La marca de D3DFVF_SPECULAR debe establecerse si una operación OR de las condiciones siguientes devuelve true:
    • La iluminación está habilitada y el color especular está habilitado; es decir, D3DRS_SPECULARENABLE es TRUE.
    • La iluminación está deshabilitada, el color especular está presente en los flujos de vértices de entrada y no se establece D3DPV_DONOTCOPYDATA .
    • La niebla de vértices está habilitada; es decir, D3DRS_FOGVERTEXMODE no se establece en D3DFOG_NONE.

Además, el recuento de coordenadas de textura debe establecerse de la siguiente manera:

  • Si la transformación de textura y la generación de texturas están deshabilitadas para todas las fases de textura activas y no se establece el D3DPV_DONOTCOPYDATA , se requiere el número y el tipo de coordenadas de textura de salida para que coincidan con los de las coordenadas de textura del vértice de entrada. Si D3DPV_DONOTCOPYDATA se establece y se deshabilitan la transformación de textura y la generación de texturas, se omiten las coordenadas de textura de salida.
  • Si la transformación de texturas o la generación de texturas está habilitada para cualquier fase de textura activa, es posible que el vértice de salida tenga que contener más conjuntos de coordenadas de textura que el vértice de entrada. Esto se debe a la proliferación de coordenadas de textura de las generadas por la generación de texturas o derivadas por transformaciones de textura. Tenga en cuenta que se produce una proliferación similar de coordenadas de textura durante las llamadas IDirect3DDevice9::D rawPrimitive , pero no es visible para el programador de aplicaciones. En este caso, Direct3D genera un nuevo conjunto de coordenadas de textura. El nuevo conjunto de coordenadas de textura se deriva paso a paso por las fases de textura y analizando la configuración de generación de texturas, transformación de textura y índice de coordenadas de textura para determinar si se requiere un conjunto único de coordenadas de textura para esa fase. Cada vez que se requiere un nuevo conjunto, se asigna en orden creciente. Tenga en cuenta que el requisito máximo y típico es uno establecido por fase, aunque podría ser menor debido al uso compartido de coordenadas de textura no transformadas a través de D3DTSS_TEXCOORDINDEX.

Por lo tanto, para cada fase de textura, se genera un nuevo conjunto de coordenadas de textura si una textura está enlazada a esa fase y se cumple cualquiera de las condiciones siguientes:

  • La generación de texturas está habilitada para esa fase.
  • La transformación de textura está habilitada para esa fase.
  • Las coordenadas de textura de entrada no transformadas se hacen referencia a través de D3DTSS_TEXCOORDINDEX por primera vez.

Cuando Direct3D genera coordenadas de textura, se requiere la aplicación para realizar las siguientes acciones:

  1. Use un búfer de vértices de destino con el uso de FVF adecuado.
  2. Vuelva a programar el D3DTSS_TEXCOORDINDEX de la fase de textura según la ubicación de las coordenadas de textura postprocesadas. Tenga en cuenta que la programación de la configuración de D3DTSS_TEXCOORDINDEX se produce cuando se usa el búfer de vértices procesado en las llamadas posteriores iDirect3DDevice9::D rawPrimitive e IDirect3DDevice9::D rawIndexedPrimitive .

Por último, la dimensionalidad de coordenadas de textura (D3DFVF_TEX0 a través de D3DFVF_TEX8 ) debe establecerse de la siguiente manera:

  • Para cada conjunto de coordenadas de textura, si la transformación de textura y la generación de texturas están deshabilitadas, la dimensionalidad de coordenadas de textura de salida debe coincidir con la entrada. Si la transformación de textura está habilitada, la dimensionalidad de salida debe coincidir con el recuento definido por la configuración de D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 o D3DTTFF_COUNT4. Si la transformación de textura está deshabilitada y la generación de texturas está habilitada, la dimensionalidad de salida debe coincidir con la configuración del modo de generación de texturas; actualmente, todos los modos generan tres valores float.

Cuando se produce un error en IDirect3DDevice9::P rocessVertices debido a un código FVF del búfer de vértices de destino incompatible, el código esperado se imprime en la salida de depuración (solo compilaciones de depuración).

Búferes de vértices