Calcular matemáticamente una tubería de gráficos simple

Estoy tratando de hacer / entender todos los cálculos matemáticos básicos necesarios en la tubería de gráficos para renderizar una imagen 2D simple a partir de una descripción de escena 3D como VRML. Hay un buen ejemplo de los pasos necesarios, como transformación del modelo (coordenadas del objeto a coordenadas del mundo), transformación de la vista (de coordenada del mundo para ver coordenada), cálculo de las normales del vértice para la iluminación, recortar , calcular las coordenadas de la pantalla de objetos dentro de la vista frustum y crear la proyección 2D para calcular los píxeles individuales con colores.

Estoy acostumbrado a las matemáticas de renderizado de OpenGL , así que me apego a ellas (todas las representaciones usan casi las mismas matemáticas)

Primero algunas termias para explicar:

  1. Matriz de transformación

    Representa un sistema de coordenadas en el espacio 3D

    double m[16]; // it is 4x4 matrix stored as 1 dimensional array for speed m[0]=xx; m[4]=yx; m[ 8]=zx; m[12]=x0; m[1]=xy; m[5]=yy; m[ 9]=zy; m[13]=y0; m[2]=xz; m[6]=yz; m[10]=zz; m[14]=z0; m[3]= 0; m[7]= 0; m[11]= 0; m[15]= 1; 

    dónde:

    • X(xx,xy,xz) es el vector unitario del eje X en GCS (sistema de coordenadas globales)
    • Y(yx,yy,yz) es el vector unitario del eje Y en GCS
    • Z(zx,zy,zz) es el vector unitario del eje Z en GCS
    • P(x0,y0,z0) es el origen del sistema de coordenadas representado en GCS

    La matriz de transformación se usa para transformar coordenadas entre GCS y LCS (sistema de coordenadas local)

    • GCS -> LCS: Al = Ag * m;
    • GCS <- LCS: Ag = Al * (m^-1);
    • Al (x,y,z,w=1) es un punto 3D en LCS ... en coordenadas homogéneas
    • Ag (x,y,z,w=1) es un punto 3D en GCS ... en coordenadas homogéneas

    se agrega la coordenada homogénea w=1 para que podamos multiplicar vectores 3D por matriz 4x4

    • m matriz de transformación
    • m^-1 matriz de transformación inversa

    En la mayoría de los casos es m ortonormal lo que significa que los vectores X,Y,Z son perpendiculares entre sí y con el tamaño de la unidad esto puede usarse para restaurar la precisión de la matriz después de rotaciones, traducciones, etc.

    Para obtener más información, consulte Descripción de las matrices de transformación homogénea 4x4.

  2. Renderizar matrices

    Usualmente se usan estas matrices:

    • model - representa el sistema de coordenadas del objeto renderizado real
    • view - representa el sistema de coordenadas de la cámara (el eje Z es la dirección de la vista)
    • modelview : modelo y vista multiplicados juntos
    • normal - lo mismo que modelview pero x0,y0,z0 = 0 para cálculos vectoriales normales
    • texture : manipule las coordenadas de la textura para facilitar la animación de la textura y el efecto generalmente una matriz de unidad
    • projection : representa las proyecciones de la vista de la cámara ( perspectiva , orto, ...) no debe incluir ninguna rotación o traducción, se parece más a la calibración del sensor de la cámara (de lo contrario, la niebla y otros efectos fallarán ...)
  3. La renderización matemática

    Para renderizar una escena 3D necesita rutinas de renderizado 2D como dibujar un triángulo texturizado 2D ... El renderizado convierte los datos de escena 3D a 2D y lo renderiza. Existen más técnicas, pero la más usual es el uso de representación de modelos de límites + representación de límites (solo superficie) La conversión 3D -> 2D se realiza mediante proyección (ortogonal o perspectiva) y Z-buffer o clasificación Z.

    • Z-buffer es fácil y nativo de ahora-días gfx HW
    • La clasificación Z se realiza por CPU, por lo que es más lenta y necesita memoria adicional, pero es necesaria para la correcta representación de las superficies transparentes.

Entonces la tubería es como esta:

  1. obtener datos representados reales del modelo

    • Vertex v
    • Normal n
    • Coordinación de texturas
    • Color, coordinación de niebla , etc.
  2. conviértalo al espacio apropiado

    • v=projection*view*model*v ... cámara espacio + proyección
    • n=normal*n ... espacio global
    • t=texture*t ... espacio de textura
  3. recortar datos a la pantalla

    Este paso no es necesario, pero evita renderizar cosas de la pantalla para mayor velocidad y también se hace aquí la eliminación de rostros. Si el vector normal del 'triángulo' renderizado es opuesto, entonces la regla de devanado de polígono establece entonces el 'triángulo'

  4. renderizar los datos 3D / 2D

    use solo las coordenadas vx,vy para representación de pantalla y vz para z-buffer test / value también aquí va la división de perspectiva para proyecciones de perspectiva

    • vx/=vz,vy/=vz

    Z-buffer funciona así: Z-buffer ( zed ) es una matriz 2D con el mismo tamaño (resolución) que la pantalla ( scr ). Cualquier píxel scr[y][x] se representa solo if (zed[y][x]>=z) en ese caso scr[y][x]=color; zed[y][x]=z; scr[y][x]=color; zed[y][x]=z; La condición if puede ser diferente (es modificable)

    En caso de utilizar triangularjs o primitivas superiores para renderizar, las primitivas 2D resultantes se convierten en píxeles en proceso, llamado rasterización, por ejemplo, así:

    • Algoritmo para llenar el triángulo

Para mayor claridad aquí es cómo se ve:

Representación 3D

[Notas]

Las matrices de transformación son multiplicativas, por lo que si necesita transformar N puntos por matrices M , puede crear una sola matrix = m1*m2*...mM y convertir N puntos solo en esta matrix resultante (para la velocidad). A veces se utilizan matriz de transformación 3x3 + shift vector lugar de matriz 4x4 . en algunos casos es más rápido, pero no se pueden multiplicar más transformaciones juntas de manera fácil. Para la manipulación de matrices de transformación, busque operaciones básicas como Girar o Traducir. También hay matrices para rotaciones dentro de LCS, que son más adecuadas para la entrada de control humano pero que no son nativas para renderizaciones como OpenGL o DirectX . (porque usan matriz inversa)

Ahora todo lo anterior fue para renderizado poligonal estándar (representación de objetos en la superficie). También hay otros renderizadores como la representación volumétrica o los rastreadores de rayos (Back) y los métodos híbridos. Además, la escena puede tener cualquier dimensionalidad, no solo 3D. Aquí algunos QA relacionados que cubren estos temas:

  • GLSL 3D Volumetric back raytracer
  • GLSL 3D Mesh back raytracer
  • Técnicas 2D Doom / Wolfenstein
  • Técnicas de representación 4D

Puede consultar el Capítulo 15 del libro Gráficos de computadora: Principios y práctica – Tercera edición por Hughes et al. Ese capítulo

Deriva los algoritmos de trazado de rayos y rasterización y luego crea el código fuente completo para un rastreador de rayos de software, rasterizador de software y procesador de rasterización acelerado por hardware.