2009-12-17 74 views
0

作为一项家庭作业,我们正在编写一个软件光栅化程序。我已经注意到我的z缓冲区不能正常工作,所以我试图通过输出到屏幕来调试它。 (黑色近,白色远离)。在软件光栅化程序中实现z缓冲区

但是,我得到了每个顶点z的奇特值。这是我用来变换点:

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值,使它位于两个设定点之间?

在此先感谢。

回答

4

要标准化Z值,您必须定义一个近剪裁平面和一个远剪裁平面。然后你将Z归一化,使它在近平面处为0,在远平面处为1。

但是,您通常会在投影后执行此操作。看起来最后一行是投影发生的地方。

其他的一些事情:

  • 您计算全矩阵向量乘法,但只保留Z,这是一种浪费。你应该考虑改变点并保留所有的X,Y,Z坐标;
  • 您在每个顶点重新计算tanf(),但是它的常量;
  • 我建议你使用投影矩阵而不是tanf计算;
  • 从简单的正交投影开始,它将更容易调试。
1

假设你想知道在vertez,这将是a_Point Z:

首先,你要这样执行在你的相机的旋转而不是原点旋转之前执行转换你的空间,可能在别的地方。其次,camera_new没有很好地选择一个名称,因为它代表相机位置的新参考集中a_Point的坐标。相反,做到以下几点:

Vec3 point_new = (m_MatRotation * (a_Point-m_Position)); 

如果不工作,你必须通过创建执行一个乘法平移,旋转和投影所有真正的投影矩阵做了艰辛的道路。这里有一些教程,帮助我了解如何做到这一点。

http://www.songho.ca/opengl/gl_projectionmatrix.html

codeguru.com/cpp/misc/misc/math/article.php/c10123/

一旦你已经成功地投影到屏幕上的顶点在透视正确的方法,你”我们必须找到一种方法来填充它们之间的空间,并找出填充的每个像素是什么z。这是一个全新的故事,维基百科关于纹理贴图的文章帮助我做到了这一点。

en.wikipedia.org/wiki/Texture_mapping#Perspective_correctness

抱歉,我不能给你更多的链接,#1不会让我,因为我是一个新用户...