Compartir a través de


Introducción con la fase de rasterizador

En esta sección se describe cómo establecer la ventanilla, el rectángulo de tijeras, el estado del rasterizador y el muestreo múltiple.

Establecer la ventanilla

Una ventanilla asigna las posiciones de vértice (en el espacio de recorte) a las posiciones de destino de representación. Este paso escala las posiciones 3D en espacio 2D. Un destino de representación está orientado con los ejes Y que apuntan hacia abajo; esto requiere que las coordenadas Y se voltean durante la escala de ventanilla. Además, las extensiones x e y (intervalo de los valores x e y) se escalan para ajustarse al tamaño de la ventanilla según las fórmulas siguientes:

X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth) 

El tutorial 1 crea una ventanilla 640 × 480 mediante D3D11_VIEWPORT y llamando a ID3D11DeviceContext::RSSetViewports.

    D3D11_VIEWPORT vp[1];
    vp[0].Width = 640.0f;
    vp[0].Height = 480.0f;
    vp[0].MinDepth = 0;
    vp[0].MaxDepth = 1;
    vp[0].TopLeftX = 0;
    vp[0].TopLeftY = 0;
    g_pd3dContext->RSSetViewports( 1, vp );

La descripción de la ventanilla especifica el tamaño de la ventanilla, el intervalo al que se asignará profundidad (mediante MinDepth y MaxDepth) y la ubicación de la parte superior izquierda de la ventanilla. MinDepth debe ser menor o igual que MaxDepth; El intervalo de MinDepth y MaxDepth está comprendido entre 0,0 y 1,0, ambos incluidos. Es habitual que la ventanilla se asigne a un destino de representación, pero no es necesario; además, la ventanilla no tiene que tener el mismo tamaño o posición que el destino de representación.

Puede crear una matriz de ventanillas, pero solo se puede aplicar una a una salida primitiva del sombreador de geometría. Solo se puede establecer una ventanilla activa a la vez. La canalización usa una ventanilla predeterminada (y un rectángulo de tijera, que se describe en la sección siguiente) durante la rasterización. El valor predeterminado es siempre la primera ventanilla (o rectángulo de tijera) de la matriz. Para realizar una selección por primitiva de la ventanilla en el sombreador de geometría, especifique la semántica ViewportArrayIndex en el componente de salida GS adecuado en la declaración de firma de salida de GS.

El número máximo de ventanillas (y rectángulos de tijera) que se pueden enlazar a la fase de rasterizador en cualquier momento es 16 (especificado por D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).

Establecer el rectángulo scissor

Un rectángulo de tijera le ofrece otra oportunidad para reducir el número de píxeles que se enviarán a la fase de fusión de salida. Los píxeles fuera del rectángulo de tijera se descartan. El tamaño del rectángulo tijera se especifica en enteros. Solo se puede aplicar un rectángulo de tijera (basado en ViewportArrayIndex en la semántica del valor del sistema) a un triángulo durante la rasterización.

Para habilitar el rectángulo scissor, use el miembro ScissorEnable (en D3D11_RASTERIZER_DESC1). El rectángulo de tijera predeterminado es un rectángulo vacío; es decir, todos los valores de corrección son 0. En otras palabras, si no configura el rectángulo tijera y el tijera está habilitado, no enviará ningún píxel a la fase de fusión de salida. La configuración más común es inicializar el rectángulo de tijera al tamaño de la ventanilla.

Para establecer una matriz de rectángulos de tijeras en el dispositivo, llame a ID3D11DeviceContext::RSSetScisorRects con D3D11_RECT.

  D3D11_RECT rects[1];
  rects[0].left = 0;
  rects[0].right = 640;
  rects[0].top = 0;
  rects[0].bottom = 480;

  g_pd3dContext->RSSetScissorRects( 1, rects );

Este método toma dos parámetros: (1) el número de rectángulos de la matriz y (2) una matriz de rectángulos.

La canalización usa un índice de rectángulo de tijera predeterminado durante la rasterización (el valor predeterminado es un rectángulo de tamaño cero con el recorte deshabilitado). Para invalidar esto, especifique la semántica SV_ViewportArrayIndex en un componente de salida de GS en la declaración de firma de salida de GS. Esto hará que la fase de GS marque este componente de salida de GS como un componente generado por el sistema con esta semántica. La fase de rasterizador reconoce esta semántica y usará el parámetro al que está asociado como índice de rectángulo de tijera para acceder a la matriz de rectángulos de tijera. No olvide indicar a la fase de rasterizador que use el rectángulo scissor que defina habilitando el valor ScissorEnable en la descripción del rasterizador antes de crear el objeto rasterizador.

Establecer el estado del rasterizador

A partir de Direct3D 10, el estado del rasterizador se encapsula en un objeto de estado de rasterizador. Puede crear hasta 4096 objetos de estado de rasterizador que, a continuación, se pueden establecer en el dispositivo pasando un identificador al objeto de estado.

Use ID3D11Device1::CreateRasterizerState1 para crear un objeto de estado de rasterizador a partir de una descripción de rasterizador (consulte D3D11_RASTERIZER_DESC1).

    ID3D11RasterizerState1 * g_pRasterState;

    D3D11_RASTERIZER_DESC1 rasterizerState;
    rasterizerState.FillMode = D3D11_FILL_SOLID;
    rasterizerState.CullMode = D3D11_CULL_FRONT;
    rasterizerState.FrontCounterClockwise = true;
    rasterizerState.DepthBias = false;
    rasterizerState.DepthBiasClamp = 0;
    rasterizerState.SlopeScaledDepthBias = 0;
    rasterizerState.DepthClipEnable = true;
    rasterizerState.ScissorEnable = true;
    rasterizerState.MultisampleEnable = false;
    rasterizerState.AntialiasedLineEnable = false;
    rasterizerState.ForcedSampleCount = 0;
    g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );

Este conjunto de estados de ejemplo logra quizás la configuración de rasterizador más básica:

  • Modo de relleno sólido
  • Eliminar o quitar caras posteriores; supongamos que el orden de viento en sentido contrario a las agujas del reloj para los primitivos
  • Desactivar el sesgo de profundidad, pero habilitar el almacenamiento en búfer de profundidad y habilitar el rectángulo de tijera
  • Desactivar el muestreo múltiple y el suavizado de contornos de línea

Además, las operaciones básicas de rasterizador siempre incluyen lo siguiente: recorte (al frustum de vista), división de perspectiva y escala de ventanilla. Después de crear correctamente el objeto de estado de rasterizador, establézcalo en el dispositivo de la siguiente manera:

    g_pd3dContext->RSSetState(g_pRasterState);

Muestreo múltiple

Muestras de muestreo múltiple algunos o todos los componentes de una imagen en una resolución superior (seguido del muestreo inferior a la resolución original) para reducir la forma más visible de alias causado por dibujar bordes poligonales. Aunque el muestreo múltiple requiere muestras de sub píxeles, la GPU moderna implementa el muestreo múltiple para que un sombreador de píxeles se ejecute una vez por píxel. Esto proporciona un equilibrio aceptable entre el rendimiento (especialmente en una aplicación enlazada a GPU) y el suavizado del alias de la imagen final.

Para usar el muestreo múltiple, establezca el campo enable en la descripción de rasterización, cree un destino de representación de muestreo múltiple y lea el destino de representación con un sombreador para resolver los ejemplos en un solo color de píxel o llame a ID3D11DeviceContext::ResolveSubresource para resolver los ejemplos mediante la tarjeta de vídeo. El escenario más común es dibujar en uno o varios destinos de representación de muestreo múltiple.

El muestreo múltiple es independiente de si se usa o no una máscara de ejemplo, se habilita el alfa-cobertura o las operaciones de galería de símbolos (que siempre se realizan por muestra).

Las pruebas de profundidad se ven afectadas por el muestreo múltiple:

  • Cuando se habilita el muestreo múltiple, la profundidad se interpola por muestra y la prueba de profundidad/galería de símbolos se realiza por muestra; El color de salida del sombreador de píxeles se duplica para todas las muestras que pasan. Si el sombreador de píxeles genera profundidad, el valor de profundidad se duplica para todas las muestras (aunque este escenario pierde la ventaja del muestreo múltiple).
  • Cuando el muestreo múltiple está deshabilitado, las pruebas de profundidad/galería de símbolos todavía se realizan por muestra, pero la profundidad no se interpola por muestra.

No hay ninguna restricción para mezclar la representación multimuestreo y no multimuestreo dentro de un único destino de representación. Si habilita el muestreo múltiple y se dibuja en un destino de representación no multimuestreo, se produce el mismo resultado que si no se habilitara el muestreo múltiple; el muestreo se realiza con una sola muestra por píxel.

Etapa del rasterizador