C++ 在软件光栅化器中实现z缓冲区
作为家庭作业,我们正在编写一个软件光栅器。我已经注意到我的z缓冲没有正常工作,所以我试图通过将其输出到屏幕来调试它。(黑色近,白色远) 但是,我得到了每个顶点的z的特殊值。这是我用来变换点的:C++ 在软件光栅化器中实现z缓冲区,c++,math,rendering,C++,Math,Rendering,作为家庭作业,我们正在编写一个软件光栅器。我已经注意到我的z缓冲没有正常工作,所以我试图通过将其输出到屏幕来调试它。(黑色近,白色远) 但是,我得到了每个顶点的z的特殊值。这是我用来变换点的: float Camera::GetZToPoint(Vec3 a_Point) { Vec3 camera_new = (m_MatRotation * a_Point) - m_Position; return (HALFSCREEN / tanf(_RadToDeg(60.f * 0
float Camera::GetZToPoint(Vec3 a_Point)
{
Vec3 camera_new = (m_MatRotation * a_Point) - m_Position;
return (HALFSCREEN / tanf(_RadToDeg(60.f * 0.5f)) / camera_new.z);
}
m_MatRotation
是一个3x3矩阵。将其与向量相乘将返回一个已转换的向量
我得到0和x之间的最大值和最小值,其中x是一个看似随机的数字
我这样做对吗?如果是这样,我如何规范化我的Z值,使其位于两个设定点之间
提前感谢。要规范化Z值,必须定义近剪裁平面和远剪裁平面。然后对Z进行规格化,使其在近平面为0,在远平面为1 但是,您通常会在投影之后执行此操作。看起来你的最后一行是投影发生的地方 其他一些事情:
- 计算完整的矩阵向量乘法,但只保留Z,这是浪费。你应该考虑变换点并保持所有的x,y,z坐标;<李>
- 在每个顶点重新计算tanf(),但它是常数李>
- 我建议你使用投影矩阵而不是tanf计算李>
- 从一个简单的正交投影开始,它将更容易调试
- 计算完整的矩阵向量乘法,但只保留Z,这是浪费。你应该考虑变换点并保持所有的x,y,z坐标;<李>
- 在每个顶点重新计算tanf(),但它是常数李>
- 我建议你使用投影矩阵而不是tanf计算李>
- 从一个简单的正交投影开始,它将更容易调试
Vec3 point_new = (m_MatRotation * (a_Point-m_Position));
如果这不起作用,你将不得不通过创建一个真正的投影矩阵来完成,该矩阵在一次乘法中执行平移、旋转和投影。这里有一些教程,帮助我了解了如何做到这一点
codeguru.com/cpp/misc/misc/math/article.php/c10123/
一旦你成功地以透视正确的方式在屏幕上投影顶点,你就必须找到一种方法来填充它们之间的空间,并为每个填充的像素找到什么是z。这是一个全新的故事,维基百科关于纹理映射的文章帮助我做到了这一点
en.wikipedia.org/wiki/Texture#u mapping#Perspective#u correction
很抱歉,我无法给您提供更多链接,Stackoverflow不允许我使用,因为我是新用户…假设您想知道vertez的z,这将是一个点: 首先,您希望在旋转之前执行平移,以便围绕相机而不是空间原点执行旋转,因为空间原点可能在其他地方。其次,camera_new并不是一个很好的名称,因为它代表了由相机位置设置的新参照集中的一个_点的坐标。相反,请执行以下操作:
Vec3 point_new = (m_MatRotation * (a_Point-m_Position));
如果这不起作用,你将不得不通过创建一个真正的投影矩阵来完成,该矩阵在一次乘法中执行平移、旋转和投影。这里有一些教程,帮助我了解了如何做到这一点
codeguru.com/cpp/misc/misc/math/article.php/c10123/
一旦你成功地以透视正确的方式在屏幕上投影顶点,你就必须找到一种方法来填充它们之间的空间,并为每个填充的像素找到什么是z。这是一个全新的故事,维基百科关于纹理映射的文章帮助我做到了这一点
en.wikipedia.org/wiki/Texture#u mapping#Perspective#u correction
对不起,我不能给你更多的链接,Stackoverflow不会让我,因为我是一个新用户