Ventanillas y recortes (Direct3D 9)
Conceptualmente, una ventanilla es un rectángulo bidimensional (2D) en el que se proyecta una escena 3D. En Direct3D, el rectángulo existe como coordenadas dentro de una superficie de Direct3D que el sistema usa como destino de representación. La transformación de proyección convierte los vértices en el sistema de coordenadas usado para la ventanilla. También se usa una ventanilla para especificar el intervalo de valores de profundidad en una superficie de destino de representación en la que se representará una escena (normalmente de 0,0 a 1,0).
El frustum de visualización
Un frustum de visualización es un volumen 3D en una escena colocada en relación con la cámara de la ventanilla. La forma del volumen afecta a cómo se proyectan los modelos desde el espacio de la cámara en la pantalla. El tipo de proyección más común, una proyección de perspectiva, es responsable de hacer que los objetos cerca de la cámara aparezcan más grandes que los objetos a distancia. Para ver la perspectiva, el frustum de visualización se puede visualizar como una pirámide, con la cámara colocada en la punta, como se muestra en la ilustración siguiente. Esta pirámide se interseca con un plano de recorte frontal y trasero. El volumen dentro de la pirámide entre los planos de recorte frontal y trasero es el frustum de visualización. Los objetos solo son visibles cuando están en este volumen.
Si imaginas que estás de pie en una habitación oscura y mirando a través de una ventana cuadrada, estás visualizando un frustum de visualización. En esta analogía, el plano de recorte cercano es la ventana, y el plano de recorte trasero es lo que finalmente interrumpe su vista - el rascacielos a través de la calle, las montañas a distancia, o nada en absoluto. Puede ver todo lo que hay dentro de la pirámide truncada que comienza en la ventana y termina con cualquier interrupción de la vista, y no puede ver nada más.
El frustum de visualización se define mediante fov (campo de vista) y por las distancias de los planos de recorte frontal y trasero, especificados en coordenadas z, como se muestra en el diagrama siguiente.
En este diagrama, la variable D es la distancia desde la cámara hasta el origen del espacio definido en la última parte de la canalización de geometría: la transformación de visualización. Este es el espacio alrededor del cual se organizan los límites de su frustum de visualización. Para obtener información sobre cómo se usa esta variable D para compilar la matriz de proyección, vea Transformación de proyección (Direct3D 9)
Rectángulo de ventanilla
El rectángulo de ventanilla se define en C++ mediante la estructura D3DVIEWPORT9 . La estructura D3DVIEWPORT9 se usa con los siguientes métodos de manipulación de ventanilla expuestos por la interfaz IDirect3DDevice9.
La estructura D3DVIEWPORT9 contiene cuatro miembros : X, Y, Width, Height, que definen el área de la superficie de destino de representación en la que se representará una escena. Estos valores corresponden al rectángulo de destino o al rectángulo de ventanilla, como se muestra en el diagrama siguiente.
Los valores que especifique para los miembros X, Y, Width, Height son coordenadas de pantalla relativas a la esquina superior izquierda de la superficie de destino de representación. La estructura define dos miembros adicionales (MinZ y MaxZ) que indican los intervalos de profundidad en los que se representará la escena.
Direct3D supone que el volumen de recorte de ventanilla oscila entre -1.0 y 1.0 en X y de 1,0 a -1,0 en Y. Estos eran los valores usados con más frecuencia por las aplicaciones en el pasado. Puede ajustar la relación de aspecto de la ventanilla antes de recortar mediante la transformación de proyección.
Nota
MinZ y MaxZ indican los intervalos de profundidad en los que se representará la escena y no se usan para el recorte. La mayoría de las aplicaciones establecerán estos miembros en 0,0 y 1,0 para permitir que el sistema se represente en todo el intervalo de valores de profundidad en el búfer de profundidad. En algunos casos, puede lograr efectos especiales mediante otros intervalos de profundidad. Por ejemplo, para representar una pantalla de encabezado en un juego, puedes establecer ambos valores en 0,0 para forzar al sistema a representar objetos en una escena en primer plano, o puedes establecerlos en 1,0 para representar un objeto que siempre debe estar en segundo plano.
Las dimensiones usadas en los miembros X, Y, Width, Height de la estructura D3DVIEWPORT9 para una ventanilla definen la ubicación y las dimensiones de la ventanilla en la superficie de destino de representación. Estos valores están en coordenadas de pantalla, en relación con la esquina superior izquierda de la superficie.
Direct3D usa la ubicación de la ventanilla y las dimensiones para escalar los vértices para ajustar una escena representada a la ubicación adecuada en la superficie de destino. Internamente, Direct3D inserta estos valores en la siguiente matriz que se aplica a cada vértice.
Esta matriz escala los vértices según las dimensiones de la ventanilla y el intervalo de profundidad deseado y los traduce a la ubicación adecuada en la superficie de destino de representación. La matriz también voltea la coordenada y para reflejar un origen de pantalla en la esquina superior izquierda con y aumentando hacia abajo. Después de aplicar esta matriz, los vértices siguen siendo homogéneos; es decir, siguen existiendo como vértices [x,y,z,w] y deben convertirse en coordenadas no homogéneas antes de enviarse al rasterizador.
Nota
La matriz de escalado de ventanilla incorpora los miembros MinZ y MaxZ de la estructura D3DVIEWPORT9 para escalar vértices para ajustarse al intervalo de profundidad [MinZ, MaxZ]. Esto representa una semántica diferente de las versiones anteriores de DirectX, en las que se usaron estos miembros para el recorte.
Nota
Las aplicaciones suelen establecer MinZ y MaxZ en 0,0 y 1,0 respectivamente para que el sistema se represente en todo el intervalo de profundidad. Sin embargo, puede usar otros valores para lograr ciertos efectos. Por ejemplo, puede establecer ambos valores en 0,0 para forzar a todos los objetos en primer plano o establecer ambos en 1,0 para representar todos los objetos en segundo plano.
Borrar una ventanilla
Al borrar la ventanilla, se restablece el contenido del rectángulo de la ventanilla en la superficie de destino de representación. También puede borrar el rectángulo en las superficies de búfer de profundidad y galería de símbolos.
Use IDirect3DDevice9::Clear para borrar la ventanilla. El método acepta uno o varios rectángulos que definen las áreas de la superficie que se borran. Al establecer el parámetro Count en 1, y el parámetro pRects en la dirección de un único rectángulo que cubre todo el área de ventanilla borrará toda la ventanilla. Otra manera de borrar toda la ventanilla es establecer el parámetro pRects en NULL y el parámetro Count en 0.
IDirect3DDevice9::Clear se puede usar para borrar bits de galería de símbolos dentro de un búfer de profundidad. Simplemente establezca el parámetro Flags para determinar cómo funciona IDirect3DDevice9::Clear con el destino de representación y los búferes de profundidad o galería de símbolos asociados. La marca D3DCLEAR_TARGET borrará la ventanilla con un color RGBA arbitrario que proporcione en el argumento Color (este no es el color del material). La marca D3DCLEAR_ZBUFFER borrará el búfer de profundidad en una profundidad arbitraria que especifique en Z: 0,0 es la distancia más cercana y 1,0 es la más lejana. La marca D3DCLEAR_STENCIL restablecerá los bits de galería de símbolos al valor que proporcione en el argumento galería de símbolos. Puede usar enteros que van de 0 a 2n-1, donde n es la profundidad de bits del búfer de galería de símbolos.
En algunas situaciones, es posible que solo se represente en pequeñas partes de las superficies de destino de representación y búfer de profundidad. Los métodos claros también permiten borrar varias áreas de las superficies en una sola llamada. Para ello, establezca el parámetro Count en el número de rectángulos que desee borrar y especifique la dirección del primer rectángulo en una matriz de rectángulos en el parámetro pRects.
Configurar la ventanilla para el recorte
Los resultados de la matriz de proyección determinan el volumen de recorte en el espacio de proyección como:
-wc<= xc<= wc
-wc<= yc<= wc
0 <= zc<= wc
Donde: x, y, z y w representan las coordenadas del vértice después de aplicar la transformación de proyección. Los vértices que tienen un componente x, y-o z fuera de estos intervalos se recortan, si el recorte está habilitado (el comportamiento predeterminado).
Con la excepción de los búferes de vértices, las aplicaciones habilitan o deshabilitan el recorte mediante el estado de representación de D3DRS_CLIPPING . La información de recorte de los búferes de vértices se genera durante el procesamiento. Para obtener más información, vea Fixed Function Vertex Processing (Direct3D 9) and Programmable Vertex Processing (Direct3D 9).
Direct3D no recorta los vértices transformados de un primitivo de un búfer de vértices a menos que proceda de IDirect3DDevice9::P rocessVertices. Si va a realizar sus propias transformaciones y necesita Direct3D para realizar el recorte, no debe usar búferes de vértices. En este caso, la aplicación recorre los datos para transformarlos. Direct3D recorre los datos una segunda vez para recortarlos y, a continuación, el controlador representa los datos, lo que es ineficaz. Por lo tanto, si la aplicación transforma los datos, también debe recortar los datos.
Cuando el dispositivo recibe vértices previamente transformados y iluminados (vértices T&L) que deben recortarse, para realizar la operación de recorte, los vértices se transforman de nuevo en el espacio de recorte mediante la homogeneidad recíproca del vértice (RHW) y la información de ventanilla. A continuación, se realiza el recorte. No todos los dispositivos son capaces de realizar esta transformación inversa para recortar vértices T&L.
La funcionalidad del dispositivo D3DPMISCCAPS_CLIPTLVERTS indica si el dispositivo es capaz de recortar vértices T&L. Si no se establece esta funcionalidad, la aplicación es responsable de recortar los vértices T&L que pretende enviar al dispositivo para que se representen. El dispositivo siempre es capaz de recortar vértices T&L en el modo de procesamiento de vértices de software (independientemente de si el dispositivo se crea en el modo de procesamiento de vértices de software o cambia al modo de procesamiento de vértices de software).
El único requisito para configurar los parámetros de ventanilla para un dispositivo de representación es establecer el volumen de recorte de la ventanilla. Para ello, inicializa y establece valores de recorte para el volumen de recorte y para la superficie de destino de representación. Normalmente, las ventanillas se configuran para representarse en el área completa de la superficie de destino de representación, pero esto no es un requisito.
Puede usar la siguiente configuración para los miembros de la estructura D3DVIEWPORT9 para lograrlo en C++.
D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };
Después de establecer valores en la estructura D3DVIEWPORT9 , aplique los parámetros de ventanilla al dispositivo llamando a su método IDirect3DDevice9::SetViewport . En el ejemplo de código siguiente se muestra el aspecto que podría tener esta llamada.
HRESULT hr;
hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
return hr;
Si la llamada se realiza correctamente, se establecen los parámetros de ventanilla y surtirán efecto la próxima vez que se llame a un método de representación. Para realizar cambios en los parámetros de la ventanilla, actualice los valores de la estructura D3DVIEWPORT9 y vuelva a llamar a IDirect3DDevice9::SetViewport .
Nota
Los miembros de la estructura D3DVIEWPORT9 MinZ y MaxZ indican los intervalos de profundidad en los que se representará la escena y no se usan para el recorte. La mayoría de las aplicaciones establecen estos miembros en 0,0 y 1,0 para permitir que el sistema se represente en todo el intervalo de valores de profundidad en el búfer de profundidad. En algunos casos, puedes lograr efectos especiales usando otros rangos de profundidad. Por ejemplo, para representar una presentación de encabezado en un juego, puedes establecer ambos valores en 0,0 para forzar que el sistema represente objetos en una escena en primer plano, o puedes establecerlos en 1,0 para representar un objeto que siempre debe estar en segundo plano.
Temas relacionados