Я пытаюсь поэкспериментировать с компьютерной графикой и хотел бы реализовать алгоритм Z-буфера для рендеринга в программном обеспечении.
Поэтому я пытаюсь использовать следующее уравнение плоскости:
z = -(ax + by + d)/c
Чтобы вычислить координату Z пикселя, используя уравнение плоской формы, я должен вычислить нормали лица треугольника? или нормали вершины достаточно?
Вот как я это вычисляю:
double zValueOfPoint(float vx, float vy, float vz, float x, float y, float nx, float ny, float nz)
{
float A = nx;
float B = ny;
float C = nz;
float D = -(nx*vx, +ny * vy + nz * vz);
float z = -(A*x + B * y + D) / C;
return z;
}
vx, vy, вершина vz, x, y пиксельная координата, nx, ny, nz нормаль вершины
Теперь для каждого TOP или Bottom Triangle я проверяю пиксель Z Pixel на ZBuffer
// Top of the triangle
for (int y = y0; y<y2; y++)
{
for (int x = xl_edge; x<xr_edge; x++)
{
float zOfPixel = zValueOfPoint(vx, vy, vz, x, y, nx, ny, nz);
if (zOfPixel < zbuffer[int(x + y * m_Width)]) {
zbuffer[int(x + y*m_Width)] = zOfPixel;
SetPixel((unsigned int)x, (unsigned int)y, color);
}
}//end for loop x
То же самое для нижнего треугольника
Прямо сейчас я получаю полностью сломанную модель. Z-буфер инициализирован правильно.