Planos de clip de usuario en hardware de nivel de característica 9

A partir de Windows 8, Microsoft High Level Shader Language (HLSL) admite una sintaxis que puede usar con la API de Microsoft Direct3D 11 para especificar planos de recorte de usuario en el nivel de característica 9_x y versiones posteriores. Puede usar esta sintaxis de planos clip para escribir un sombreador y, a continuación, usar ese objeto de sombreador con la API de Direct3D 11 para ejecutarse en todos los niveles de características de Direct3D.

Información previa

Puede acceder a los planos de recorte de usuario en la API de Microsoft Direct3D 9 a través de los métodos IDirect3DDevice9::SetClipPlane e IDirect3DDevice9::GetClipPlane . En Microsoft Direct3D 10 y versiones posteriores, puede acceder a los planos de recorte de usuario a través de la semántica SV_ClipDistance . Pero antes de Windows 8, SV_ClipDistance no estaba disponible para el nivel de característica 9_x hardware en las API de Direct3D 10 o Direct3D 11. Por lo tanto, antes de Windows 8, la única manera de acceder a los planos de clip de usuario con el nivel de característica 9_x hardware era a través de la API de Direct3D 9. Las aplicaciones de la Tienda Windows de Direct3D no pueden usar la API de Direct3D 9. Aquí se describe la sintaxis que puede usar para acceder a los planos de recorte de usuario a través de la API de Direct3D 11 en el nivel de característica 9_x y versiones posteriores.

Las aplicaciones usan planos de recorte para definir un conjunto de planos invisibles dentro del mundo 3D que recortan (desechan) todos los primitivos dibujados. Windows no dibujará ningún píxel que esté en el lado negativo de ningún plano de clip. A continuación, las aplicaciones pueden usar planos de recorte para representar reflejos planares.

Sintaxis

Use esta sintaxis para declarar planos de clip como atributos de función en una declaración de función. Por ejemplo, aquí usamos la sintaxis en un fragmento de sombreador de vértices:

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

Este ejemplo para un fragmento de sombreador de vértices denota dos planos de clip. Muestra que debe colocar el nuevo atributo clipplanes entre corchetes inmediatamente antes del valor devuelto del sombreador de vértices. Entre paréntesis después del atributo clipplanes , se proporciona una lista de hasta 6 constantes float4 que definen los coeficientes del plano para cada plano de clip activo. En el ejemplo también se muestra que debe hacer que los coeficientes de cada plano residan en un búfer de constantes.

Nota

No hay ninguna sintaxis disponible para deshabilitar un plano de recorte dinámicamente. Debe volver a compilar un sombreador idéntico sin ningún atributo clipplanes , o bien la aplicación puede establecer los coeficientes en el búfer de constantes en cero para que el plano ya no afecte a ninguna geometría.

 

Esta sintaxis está disponible para cualquier destino de sombreador de vértices 4.0 o posterior, que incluye vs_4_0_level_9_1 y vs_4_0_level_9_3.

Creación de planos de clip en el espacio de clip en el nivel de característica 9 y superior

Aquí se muestra cómo crear planos de recorte en el espacio de recorte en el nivel de característica 9_x y versiones posteriores.

Lectura en segundo plano

"Introducción a la programación de juegos 3D con DirectX 10" de Frank D. Luna explica el fondo matemático gráfico (capítulos 1, 2 y 3) que necesita, y las distintas transformaciones de espacios y espacios que se producen en el sombreador de vértices (secciones 5.6 y 5.8).

10 Niveles de características de 10Level9

En Direct3D 10 y versiones posteriores, puede recortar en cualquier espacio que tenga sentido, a menudo en el espacio mundial o en el espacio de vista. Pero Direct3D 9 usa el espacio de recorte, que es el espacio de proyección de división de perspectiva previa. Los vectores están en el espacio de recorte cuando el sombreador de vértices los pasa a las fases siguientes en la canalización de gráficos.

Al escribir una aplicación de la Tienda Windows, debes usar 10 Niveles de características (nivel de característica 9_x) para que la aplicación pueda ejecutarse en el nivel de característica 9_x y hardware superior. Dado que la aplicación admite el nivel de característica 9_x y versiones posteriores, también debes usar la funcionalidad común de aplicar planos de recorte en el espacio de recorte.

Al compilar un sombreador de vértices con vs_4_0_level_9_1 o posterior, ese sombreador de vértices puede usar el atributo clipplanes . Un objeto Direct3D 10 o posterior tiene un producto de punto del vértice emitido que contiene cada una de las constantes globales float4 especificadas en el atributo . El objeto Direct3D 9 tiene suficientes metadatos para hacer que el tiempo de ejecución 10Level9 emita las llamadas adecuadas a IDirect3DDevice9::SetClipPlane.

Matemáticas del plano de recorte

Un plano de clip se define mediante un vector con 4 componentes. Los tres primeros componentes definen un vector x, y, z que emana del origen en el espacio que queremos recortar. Este vector implica un plano, perpendicular al vector y que se ejecuta a través del origen. Windows mantiene todos los píxeles en el lado vectorial del plano y recorta todos los píxeles detrás del plano. El componente w de adelante inserta el plano hacia atrás y hace que Windows recorte menos (un w negativo hace que Windows recorte más) a lo largo de la línea vectorial. Si los componentes x, y, z componen un vector de unidad (normalizado), w vuelve a insertar las unidades del plano w.

La matemática que realiza la unidad de procesamiento de gráficos (GPU) para determinar el recorte es un producto de punto simple entre el vector de vértice (x, y, z, 1) y el vector del plano de recorte. Esta operación matemática crea una longitud de proyección en el vector del plano de clip. Un producto de puntos negativos muestra que el vértice se encuentra en el lado recortado del plano.

Recorte en el espacio de vista

Este es nuestro vértice en el espacio de vista:

vértice en el espacio de vista

Este es nuestro plano de recorte en el espacio de vista:

plano de recorte en el espacio de vista

Este es el producto de punto del vértice y el plano de recorte en el espacio de vista:

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

Esta operación matemática funciona para un objeto Direct3D 10 o posterior, pero no funcionará para un objeto Direct3D 9. Para Direct3D 9, primero debemos pasar por nuestra transformación de proyección en espacio de clip.

Matriz de proyección

Una matriz de proyección transforma un vértice desde el espacio de vista (donde el origen es el ojo del visor, +x está a la derecha, +y está arriba y +z está directamente) en espacio de recorte. La matriz de proyección prepara el vértice para el recorte de hardware y la fase de rasterización. Esta es una matriz de perspectiva estándar (otras proyecciones requieren matemáticas diferentes):

*r* relación de ancho/alto de ventana *α* ángulo de visión *f* distancia desde el visor hasta la distancia del plano lejano *n* desde el visor hasta el plano cercano
! [matriz de proyección] (images/projection-matrix.png)

La siguiente matriz es una versión simplificada de la matriz anterior. Mostramos la matriz simplificada para poder usarla más adelante en la operación de multiplicación de matriz.

matriz de proyección simplificada

Ahora transformamos nuestro vértice de espacio de vista en espacio de recorte con una matriz multiplicada:

multiplicación de matriz

En nuestra operación de multiplicación de matriz, nuestros componentes x e y solo se ajustan ligeramente, pero nuestros componentes z y w están bastante mangledados. Nuestro plano de recorte no nos dará lo que queremos más.

Recorte del plano de recorte de espacio

Aquí queremos crear un plano de recorte de espacio de clip cuyo producto de punto con nuestro vértice de espacio de clip nos da el mismo valor que v · C en la sección Recorte en el espacio de vista .

plano de recorte

v · C = v P · CP

vCₓ +vyCy + vzC zC = w + vPCPₓ +vyPyC P y V y + vzAyCPz + BCPz v z + CPw

Ahora podemos dividir la operación matemática anterior por componente de vértice en cuatro ecuaciones independientes:

Componente de vértice x del producto del plano de recorte

Componente de vértice del producto del plano de recorte

Componente de vértice del producto del plano de recorte

Componente de vértice z del producto del plano de clip

Nuestro plano de recorte de espacio de vista y nuestra matriz de proyección derivan y nos dan nuestro plano de recorte de espacio de clip.

clip space clip plane

Guía de programación para HLSL

Sintaxis de declaración de funciones