Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在软件光栅化器中实现z缓冲区_C++_Math_Rendering - Fatal编程技术网

C++ 在软件光栅化器中实现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

作为家庭作业,我们正在编写一个软件光栅器。我已经注意到我的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值,使其位于两个设定点之间


提前感谢。

要规范化Z值,必须定义近剪裁平面和远剪裁平面。然后对Z进行规格化,使其在近平面为0,在远平面为1

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

其他一些事情:

  • 计算完整的矩阵向量乘法,但只保留Z,这是浪费。你应该考虑变换点并保持所有的x,y,z坐标;<李>
  • 在每个顶点重新计算tanf(),但它是常数
  • 我建议你使用投影矩阵而不是tanf计算
  • 从一个简单的正交投影开始,它将更容易调试

要规范化Z值,必须定义近剪裁平面和远剪裁平面。然后对Z进行规格化,使其在近平面为0,在远平面为1

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

其他一些事情:

  • 计算完整的矩阵向量乘法,但只保留Z,这是浪费。你应该考虑变换点并保持所有的x,y,z坐标;<李>
  • 在每个顶点重新计算tanf(),但它是常数
  • 我建议你使用投影矩阵而不是tanf计算
  • 从一个简单的正交投影开始,它将更容易调试

假设您想知道顶点处的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不允许我使用,因为我是新用户…

假设您想知道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不会让我,因为我是一个新用户