2012-06-25 16 views
8

Soy relativamente nuevo en la programación de gráficos, y acabo de leer algunos libros y he estado escaneando a través de tutoriales, así que, por favor, perdónenme si esto parece una pregunta tonta.¿Qué hace un sombreador de píxeles en realidad?

Tengo los conceptos básicos de directx11 en funcionamiento, y ahora estoy buscando divertirme. así que, naturalmente, he estado leyendo mucho sobre la tubería sombreadora, y ya estoy fascinado. La idea de escribir un código simple y minúsculo que tenga que ser lo suficientemente eficiente para ejecutarse quizás decenas de miles de veces cada 60 de segundo sin desperdiciar recursos me tiene apurado para captar el concepto antes de continuar y posiblemente hacer un desastre. de cosas. Lo que estoy teniendo problemas es captar lo que el sombreador de píxeles está haciendo en realidad.

Los sombreadores de vértices son fáciles de entender, organizas los vértices de un objeto en estructuras de datos uniformes que relacionan información sobre él, como coordenadas de posición y textura, y luego pasan cada vértice al sombreador para convertirlo de 3d a 2d forma de matrices de transformación. Mientras lo entiendo, puedo averiguar cómo codificarlo.

Pero no tengo pixel shaders. Lo que obtengo es que la salida del sombreador de vértices es la entrada del sombreador de píxeles. Entonces, ¿no sería eso simplemente dar al sombreador de píxeles las coordenadas 2d de los vértices del polígono? Lo que he llegado a entender es que el sombreador de píxeles recibe píxeles individuales y realiza cálculos sobre ellos para determinar cosas como el color y la iluminación. Pero si eso es cierto, ¿qué píxeles? ¿Toda la pantalla o solo los píxeles que se encuentran dentro del polígono 2d transformado?

o he entendido mal algo por completo?

Respuesta

10

Los sombreadores de vértices son fáciles de entender, organizas los vértices de un objeto en estructuras de datos uniformes que relacionan información sobre él, como coordenadas de posición y textura, y luego pasan cada vértice al sombreador para convertirlo de 3d a 2d a través de matrices de transformación.

Después de esto, primitivas (triángulos o múltiplos de triángulos) se generan y se recortan (en Direct3D 11, en realidad es un poco más complicados gracias a transformar retroalimentación, shaders de geometría, tesselation, lo que sea ... pero sea ​​lo que sea, al final tiene triángulos).

Ahora, los fragmentos se "generan", es decir, un solo triángulo se divide en pequeñas celdas con una cuadrícula regular, los atributos de salida del sombreador de vértices se interpolan según la posición relativa de cada celda de cuadrícula a los tres vértices y un " tarea "está configurado para cada pequeña celda de la cuadrícula. Cada una de estas celdas es un "fragmento" (si se usa multimuestreo, pueden estar presentes varios fragmentos para un píxel).

Finalmente, se ejecuta un pequeño programa sobre todas estas "tareas", este es el sombreador de píxeles (o sombreador de fragmentos).

Toma atribuye el vértice interpolada, y lee opcionalmente valores uniformes o texturas, y produce una salida (que puede producir opcionalmente varias salidas, también). Esta salida del sombreador de píxeles se refiere a un fragmento, y luego se descarta (por ejemplo, debido a la prueba de profundidad) o se mezcla con el búfer de cuadros. Normalmente, muchas instancias del mismo sombreador de píxeles se ejecutan en paralelo al mismo tiempo. Esto se debe a que es más eficiente en silicio y más eficiente en el uso de energía que una GPU como esta. Un sombreador de píxeles no sabe si alguno de los otros se ejecuta al mismo tiempo.
Los sombreadores de píxeles comúnmente se ejecutan en un grupo (también llamado "warp" o "wavefront"), y todos los sombreadores de píxeles dentro de un grupo ejecutan exactamente la misma instrucción al mismo tiempo (en diferentes datos). De nuevo, esto permite construir chips más potentes que consumen menos energía y son más baratos.




Nótese que en este caso, el fragment shader todavía sólo se ejecuta una vez por cada "célula". La multimuestra solo decide si almacena o no el valor calculado en una de las "ranuras" adicionales de mayor resolución (submuestras) de acuerdo con la prueba de profundidad (resolución más alta). Para la mayoría de los píxeles en la pantalla, todas las submuestras son iguales. Sin embargo, en los bordes, solo algunas submuestras se rellenarán con una geometría de primer plano, mientras que otras mantendrán su valor lejos de la geometría de "fondo" más alejada. Cuando se resuelve la imagen multipantalla (es decir, se convierte en una imagen "normal"), la tarjeta gráfica genera una "mezcla" (en el caso más sencillo, simplemente la media aritmética) de estas submuestras, lo que resulta en todo excepto en los bordes que salen lo mismo de siempre, y los bordes están "suavizados".

+0

bien, creo que ahora entiendo. Sin embargo, como soy un aprendiz visual, hice un diagrama de lo que creo que has descrito, así que dime si me falta algo. http://postimage.org/image/9oy2nroqr/ – FatalCatharsis

+1

Un error: las coordenadas post-vertexshader son ** no ** coordenadas de píxeles, pero _normalized_. Para Direct3D esto significa que están entre 0.0 y 1.0 (-1.0 y 1.0 en OpenGL). Esto no es muy intuitivo al principio, porque la pantalla generalmente no es cuadrada, pero "simplemente funciona" (sin preocupaciones, ¡nada especial para usted!) Y es más eficiente para el hardware hacer cálculos (por ejemplo, recorte) en este espacio. El resto se ve bien (geom shader, tesselation y clipping se conocen como "cosas que ocurren en el medio"). – Damon

+0

ah gotcha, prefiero las coordenadas normalizadas en realidad, ya que todo estaría en la misma escala sin importar la resolución de pantalla elegida, (opengl parece un poco extraño, -1 a 1). ¿Entonces el sombreador de geometría y las etapas de tesselación ocurren en el medio? Me hubiera imaginado que son lo primero, ya que los nuevos vértices podrían alimentarse en el sombreador de vértices y convertirse en coords de pantalla. son los nuevos vértices que se crean automáticamente convertidos en 2d? – FatalCatharsis

2

Su comprensión de los sombreadores de píxeles es correcta ya que "recibe píxeles individuales y realiza cálculos sobre ellos para determinar cosas como el color y la iluminación".

Los píxeles que el sombreador recibe son los individuales calculados durante la rasterización del polígono 2d transformado (el triángulo es específico). Entonces, mientras que el sombreador de vértices procesa los 3 puntos del triángulo, el sombreador de píxeles procesa los píxeles, uno a la vez, que "completan" el triángulo.

Cuestiones relacionadas