Graphics 三维图形算法(硬件)

Graphics 三维图形算法(硬件),graphics,matrix,hardware,gpu,Graphics,Matrix,Hardware,Gpu,我正在尝试设计一个asic图形处理器。我已经在这个主题上做了广泛的研究,但对于如何平移和旋转点,我还是有点模糊。我正在使用正交投影来栅格化变换的点 我一直在使用下面关于矩阵乘法(齐次坐标)的讲座 有人能更深入地解释一下吗。我对算法仍然有些不确定。我正在传递一个摄影机(x,y,z)和一个表示摄影机角度的摄影机向量(x,y,z),以及一个点(x,y,z)。在矩阵中,将点变换到新的适当位置时,应该做什么 以下是伪代码中的完整转换算法: void project(Vec3d objPos, Matri

我正在尝试设计一个asic图形处理器。我已经在这个主题上做了广泛的研究,但对于如何平移和旋转点,我还是有点模糊。我正在使用正交投影来栅格化变换的点

我一直在使用下面关于矩阵乘法(齐次坐标)的讲座


有人能更深入地解释一下吗。我对算法仍然有些不确定。我正在传递一个摄影机(x,y,z)和一个表示摄影机角度的摄影机向量(x,y,z),以及一个点(x,y,z)。在矩阵中,将点变换到新的适当位置时,应该做什么

以下是伪代码中的完整转换算法:

void project(Vec3d objPos, Matrix4d modelViewMatrix,
    Matrix4d projMatrix, Rect viewport, Vec3d& winCoords)
{
    Vec4d in(objPos.x, objPos.y, objPos.z, 1.0);
    in = projMatrix * modelViewMatrix * in;
    in /= in.w; // perspective division
    // "in" is now in normalized device coordinates, which are in the range [-1, 1].

    // Map coordinates to range [0, 1]
    in.x = in.x / 2 + 0.5;    
    in.y = in.y / 2 + 0.5;    
    in.z = in.z / 2 + 0.5;    

    // Map to viewport
    winCoords.x = in.x * viewport.w + viewport.x;    
    winCoords.y = in.y * viewport.h + viewport.y;    
    winCoords.z = in.z;    
}
然后使用winCoords.x和winCoords.y进行光栅化


有关此算法各阶段的解释,请参见问题9.011。在开始销售的前几年,面向PC的大众市场图形处理器根本不平移或旋转点。是否需要实现此功能?如果没有,您可能希望让软件来做。根据您的情况,软件可能是更明智的选择

如果您需要实现该功能,我将告诉您他们在早期是如何实现的

硬件有16个浮点寄存器,表示4x4矩阵。应用程序开发人员在渲染三角形网格之前,使用ModelViewProjection矩阵加载这些寄存器。ModelViewProjection矩阵为:

模型*视图*投影

其中,“模型”是将顶点从“模型”坐标转换为“世界”坐标的矩阵,“视图”是将顶点从“世界”坐标转换为“相机”坐标的矩阵,“投影”是将顶点从“相机”坐标转换为“屏幕”坐标的矩阵。它们一起将顶点从“模型”坐标(相对于它们所属的三维模型的坐标)带到“屏幕”坐标中,您可以在其中将它们栅格化为三角形

这是三个不同的矩阵,但它们相乘在一起,4x4结果写入硬件寄存器

当顶点缓冲区渲染为三角形时,硬件从内存中将顶点作为[x,y,z]向量读入,并将其视为[x,y,z,w],其中w始终为1。然后将每个向量乘以4x4 ModelViewProjection矩阵,得到[x',y',z',w']。如果有透视图(你说没有),那么我们除以w'得到透视图[x'/w',y'/w',z'/w',w'/w']


然后用新计算的顶点栅格化三角形。这使模型的顶点可以在需要时处于只读内存中,尽管模型和相机可能处于运动状态。

我不知道任何opengl,我只是尝试在硬件中实现这一点。你能解释一下模型视图矩阵和投影矩阵吗。我将接收相机角度(矢量)和相机位置(顶点)。这些是如何生成modelviewmatrix和投影矩阵的?modelviewmatrix是旋转矩阵,投影矩阵是平移矩阵吗?@Steve:“模型视图”是“模型”和“视图”变换的组合;模型变换将模型空间转换为世界空间,视图变换将世界空间转换为眼睛空间。你应该阅读OpenGL,它试图用软件对3D硬件建模,因此了解它可以让你很好地了解这些硬件如何工作。@史蒂夫:正如unwind所说,modelView是视图(相机)变换和模型变换的组合,尽管在你的情况下没有模型变换,因此,您可以将modelView视为表示摄影机变换的矩阵。因此,在您的示例中,modelView是平移和旋转的组合。您可以通过创建平移矩阵,然后创建旋转矩阵,然后将这两个矩阵相乘来生成modelView矩阵。@Steve:至于proj矩阵,它与摄影机的方向和位置无关。它基本上指定了如何将三维坐标投影(展平)到二维平面上。可以将其视为指定摄影机的查看体积(对于正交投影,这将是长方体)。您可以使用OpenTK的Matrix4类提供的静态方法生成旋转矩阵、平移矩阵和proj矩阵(您可以使用它们的代码)。