C++ 转换后的w值为0

C++ 转换后的w值为0,c++,graphics,renderer,C++,Graphics,Renderer,我正在制作软件渲染器 有时,变换顶点的w坐标为0 所以,如果我把其他坐标除以w,就会出现错误 如果摄影机位置的z坐标等于顶点位置的z坐标,则变换顶点的w坐标为0 我的密码有错吗 下面的代码是我的转换代码 void Camera::ComputeWorldToCameraMat() { Vector3 zaxis; zaxis.Set( _dir.x - _pos.x, _dir.y - _pos.y, _dir.z - _pos.z ); zaxis.Normalize(

我正在制作软件渲染器

有时,变换顶点的w坐标为0

所以,如果我把其他坐标除以w,就会出现错误

如果摄影机位置的z坐标等于顶点位置的z坐标,则变换顶点的w坐标为0

我的密码有错吗

下面的代码是我的转换代码

void Camera::ComputeWorldToCameraMat()
{
    Vector3 zaxis;
    zaxis.Set( _dir.x - _pos.x, _dir.y - _pos.y, _dir.z - _pos.z );
    zaxis.Normalize();

    // xaxis = zaxis X up
    Vector3 xaxis;
    xaxis = cross(zaxis, _up);
    xaxis.Normalize();

    Vector3 yaxis;
    yaxis = cross(zaxis, xaxis);

    _worldToCamera.Identity();

    _worldToCamera.a11 = xaxis.x;
    _worldToCamera.a12 = yaxis.x;
    _worldToCamera.a13 = zaxis.x;
    _worldToCamera.a14 = 0;

    _worldToCamera.a21 = xaxis.y;
    _worldToCamera.a22 = yaxis.y;
    _worldToCamera.a23 = zaxis.y;
    _worldToCamera.a24 = 0;

    _worldToCamera.a31 = xaxis.z;
    _worldToCamera.a32 = yaxis.z;
    _worldToCamera.a33 = zaxis.z;
    _worldToCamera.a34 = 0;

    _worldToCamera.a41 = -dot(xaxis, _pos);
    _worldToCamera.a42 = -dot(yaxis, _pos);
    _worldToCamera.a43 = -dot(zaxis, _pos);
    _worldToCamera.a44 = 1;
}

void Camera::ComputeProjectionMat( Viewport* viewport)
{
    int width = viewport->_width;
    int height = viewport->_height;
    //float tanfov = (float)tan(_fov * 0.5f);
    float cot = 1.0f / tan( _fov * 0.5f );
    float aspect = (float)(width / height);

    _projection.Identity();

    _projection.a11 = cot / aspect;
    _projection.a12 = 0;
    _projection.a13 = 0;
    _projection.a14 = 0;

    _projection.a21 = 0;
    _projection.a22 = cot;
    _projection.a23 = 0;
    _projection.a24 = 0;

    _projection.a31 = 0;
    _projection.a32 = 0;
    _projection.a33 = -1 * (_farZ + _nearZ) / ( _farZ - _nearZ );
    _projection.a34 = 2 * ( _nearZ * _farZ ) / ( _farZ - _nearZ );

    _projection.a41 = 0;
    _projection.a42 = 0;
    _projection.a43 = 1;
    _projection.a44 = 0;
}

您知道“剪辑空间”以及剪辑基本体的方法吗?如果我没记错的话,这就是你需要的。特别是,如果你不做这一步,你会遇到麻烦,如果你从相机后面到前面画一条线。由于w。剪裁后,没有任何Z值小于
nearZ
,因此不会被零除。这可能很好地解释了这一点: