【发布时间】:2020-01-12 20:48:13
【问题描述】:
我正在尝试使用计算机图形进行实验,并希望实现 Z Buffer 算法以在软件中进行渲染。
所以我尝试使用以下平面方程:
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 法线
现在对于每个顶部或底部三角形,我检查 Z 像素到 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 Buffer 已正确初始化。
【问题讨论】:
-
float D = -(nx*vx, +ny * vy + nz * vz)中间多了一个逗号。此外,一旦您在光栅器中实现了透视插值,这是免费的。 -
z直接从面顶点插入,与x,y相同的方式...同时光栅化。无需使用平面方程...
标签: c++ graphics 3d rendering zbuffer