Compartir a través de


Canalización de transformación Direct3D

En este artículo se proporciona una explicación técnica para los desarrolladores de aplicaciones de Direct3D sobre cómo establecer los parámetros de la canalización de transformación direct3D mediante la manipulación directa de matrices de Direct3D.

Información general

Direct3D usa tres transformaciones para cambiar las coordenadas del modelo 3D en coordenadas de píxeles (espacio de pantalla). Estas transformaciones son transformación del mundo, transformación de vista y transformación de proyección.

La transformación del mundo controla cómo se transforman las coordenadas del modelo en coordenadas del mundo. La transformación mundial puede incluir traducciones, rotaciones y escalas, pero no se aplica a las luces. Para obtener más información sobre cómo trabajar con transformaciones del mundo, consulte Transformación mundial.

Ver la transformación controla la transición de las coordenadas del mundo a "espacio de cámara", determinando la posición de la cámara en el mundo. Para obtener un ejemplo de cómo trabajar con transformaciones de vista, vea Ver transformación.

La transformación de proyección cambia la geometría del espacio de la cámara en "espacio de recorte" y aplica distorsión de perspectiva. El término "espacio de recorte" hace referencia a cómo se recorta la geometría en el volumen de vista durante esta transformación. Para obtener un ejemplo de cómo trabajar con transformaciones de proyección, consulte Transformación de proyección.

Por último, la geometría en el espacio de clip se transforma en coordenadas de píxeles (espacio de pantalla). Esta transformación se controla mediante la configuración de la ventanilla.

El recorte y la transformación de vértices deben tener lugar en un espacio homogéneo (simplemente put, espacio en el que el sistema de coordenadas incluye un cuarto elemento), pero el resultado final de la mayoría de las aplicaciones debe ser coordenadas tridimensionales no homogéneos (3D) definidas en "espacio de pantalla". Esto significa que tanto los vértices de entrada como el volumen de recorte deben traducirse en un espacio homogéneo para realizar el recorte y, a continuación, traducirlos de nuevo al espacio no homogéneo que se va a mostrar.

Las tres transformaciones de Direct3D, la vista y la transformación de proyección se definen mediante matrices de Direct3D. Una matriz de Direct3D es una matriz homogéneo de 4x4 definida por una estructura D3DMATRIX . Aunque las matrices de Direct3D no son objetos estándar, no están representados por una interfaz COM, puede crearlas y establecerlas igual que cualquier otro objeto Direct3D. Para obtener más información sobre las matrices de Direct3D, consulte Transformaciones.

Canalización de transformación

Si pm = (Xm, Ym, Zm, Zm, 1), las transformaciones que se muestran en la ilustración siguiente se aplican a las coordenadas de pantalla de proceso Ps = (Xs, Ys, Zs, Ws).

transformación del espacio del modelo para el espacio de pantalla

Estas son las descripciones de las fases que se muestran en la ilustración anterior:

  1. La matriz mundial Mworld transforma los vértices del espacio del modelo al espacio mundial. Esta matriz se establece mediante:

        d3dDevice->SetTransform (D3DTRANSFORMSTATE_WORLD, matrix address) 
    

    La implementación de Direct3D supone que la última columna de esta matriz es (0, 0, 0, 1). No se devuelve ningún error si el usuario especifica una matriz con una última columna diferente, pero la iluminación y la niebla serán incorrectas.

  2. La matriz de vistas Mview transforma los vértices del espacio del mundo al espacio de la cámara. Esta matriz se establece mediante:

        d3dDevice->SetTransform (D3DTRANSFORMSTATE_VIEW, matrix address) 
    

    La implementación de Direct3D supone que la última columna de esta matriz es (0, 0, 0, 1). No se devuelve ningún error si el usuario especifica una matriz con una última columna diferente, pero la iluminación y la niebla serán incorrectas.

  3. Matriz de proyección Mproj transforma vértices del espacio de la cámara al espacio de proyección. Esta matriz se establece mediante:

        d3dDevice->SetTransform (D3DTRANSFORMSTATE_PROJECTION, matrix address) 
    

    La última columna de la matriz de proyección debe ser (0, 0, 1, 0) o (0, 0, a, 0) para efectos correctos de niebla e iluminación; (0, 0, 1, 0) se prefiere el formulario.

    El volumen de recorte de todos los puntos Xp = (Xp, Yp, Zp, Wp) en el espacio de proyección se define como:

        -Wp < Xp <= Wp 
        -Wp < Yp <= Wp 
        0 < Zp <= Wp 
    

    Se recortarán todos los puntos que no cumplan estas ecuaciones.

    Si un volumen de vista se define como:

    • Ancho de la ventana sw-screen en el espacio de la cámara cerca del plano de recorte
    • Alto de la ventana de pantalla sh en el espacio de la cámara cerca del plano de recorte
    • Distancia Zn al plano de recorte cercano a lo largo de los ejes Z en el espacio de la cámara
    • Distancia Zf al plano de recorte lejano a lo largo de los ejes Z en el espacio de la cámara

    a continuación, se puede escribir una matriz de proyección de perspectiva como se indica a continuación:

    Muestra una matriz de proyección de perspectiva.

    donde Mij es miembro de Mproj.

    Para la proyección ortogonal tenemos:

    Proyección ortogonal

    Direct3D supone que la matriz de proyección de perspectiva tiene la forma :

    matriz de proyección de perspectiva

    Si la matriz de proyección de perspectiva no tiene este formato, habrá algunos artefactos. Por ejemplo, la niebla de la mesa no funcionará.

  4. Direct3D permite al usuario cambiar el volumen del clip de la siguiente manera:

    cambiar el volumen del clip

    Esto se puede reescribir como:

    cambiar el volumen de recorte reescrito

    donde:

        Cx, Cy - dvClipX, dvClipY from D3DVIEWPORT9  
        Cw, Ch - dvClipWidth, dvClipHeight from D3DVIEWPORT9  
        Zmin, Zmax - dvMinZ, dvMaxZ from D3DVIEWPORT9  
    

    Esta transformación puede proporcionar una mayor precisión y equivale a escalar y cambiar el volumen de recorte.

    La matriz de Mclip correspondiente es:

    matriz de mclip

    Un vértice se transforma mediante:

        dvClipWidth = 2   
        dvClipHeight = 2   
        dvClipX = -1   
        dvClipY = 1   
        dvMinZ = 0   
        dvMaxZ = 1   
    

    Si no desea escalar el volumen del clip, puede establecer parámetros de ventanilla en valores predeterminados:

        (Xc, Yc, Zc, Wc) = (Xp, Yp, Zp, Wp) * Mclip   
    
  5. La fase de recorte es opcional si el usuario especifica la marca D3DDP_DONOTCLIP en una llamada a DrawPrimitive. En este caso, se pueden combinar todas las matrices (incluidas Mvs).

  6. La matriz de escala de ventanillas Mvs escala las coordenadas que se van a estar dentro de la ventana de ventanilla y voltea el eje Y de arriba a abajo:

    matriz de escala de ventanillas mvs

    donde:

        dwX, dwY - viewport offsets in pixels from D3DVIEWPORT9 
        dwWidth, dwHeight - viewport width and height in pixels from D3DVIEWPORT9    
    
  7. Por último, las coordenadas de pantalla se calculan y se pasan al rasterizador:

    coordenadas de pantalla calculadas y pasadas al rasterizador

Sugerencias de uso

Estas son algunas sugerencias para usar la canalización de transformación Direct3D:

  • La última columna de las matrices de mundo y vista debe ser (0, 0, 0, 1) o la iluminación será incorrecta.

  • Establezca los parámetros de ventanilla para crear una matriz de Mclip de identidad, a menos que comprenda exactamente para qué se necesita.

        dvClipWidth = 2 
        dvClipHeight = 2
        dvClipX = -1
        dvClipY = 1
        dvMinZ = 0 
        dvMaxZ = 1