Pular para o conteúdo

Renderizador em Software 3D (CPU Pipeline) (SoftwareRenderer3D.cs)

O arquivo SoftwareRenderer3D.cs implementa o pipeline completo de renderização 3D na CPU, sem utilizar OpenGL ou DirectX.


Em um objeto 3D fechado, as faces de trás nunca são visíveis pela câmera. Se o produto escalar entre a normal da face N⃗\vec{N} e o vetor da câmera V⃗\vec{V} for positivo (N⃗⋅V⃗≥0\vec{N} \cdot \vec{V} \ge 0), a face está virada para trás e é descartada imediatamente, economizando metade do tempo de desenho.


Para cada triângulo 2D desenhado na tela, calculamos as Coordenadas Baricêntricas (w0,w1,w2)(w_0, w_1, w_2) de cada pixel dentro da caixa delimitadora (Bounding Box). Se w0≥0w_0 \ge 0, w1≥0w_1 \ge 0 e w2≥0w_2 \ge 0, o pixel está dentro do triângulo.


Se você colocar a mão na frente dos olhos, você não vê a parede atrás porque a sua mão está mais perto.

O Z-Buffer é uma matriz de profundidade na memória RAM:

float zInterpolado = (float)(w0 * z0 + w1 * z1 + w2 * z2);
int idx = y * width + x;
// Teste de Profundidade do Z-Buffer:
if (zInterpolado < zBuffer[idx])
{
zBuffer[idx] = zInterpolado; // Atualiza a profundidade mais proxima
dstRow[x] = corDoPixel; // Pinta o pixel na tela
}

  • Flat Shading: Pinta cada face triangular com uma única cor uniforme (efeito facetado Low-Poly).
  • Gouraud Shading: Calcula a luz em cada vértice e interpola as cores suavemente pelo meio do triângulo usando as coordenadas baricêntricas.

Próximo Passo: Veja como o WPF acelera isso por hardware em Viewport3D & Câmera Arcball.