3D图形算法(硬件)

时间:2011-04-04 14:51:35

标签: graphics matrix hardware gpu

我正在尝试设计一个asic图形处理器。我已经对这个主题进行了广泛的研究,但我对如何翻译和旋转点仍然很模糊。我正在使用正交投影来栅格化转换后的点。

我一直在使用以下有关矩阵乘法(同质坐标)的讲座 http://www.cs.kent.edu/~zhao/gpu/lectures/Transformation.pdf

有人可以向我解释一下这个问题。我对这个算法仍然有些不满。我正在传递相机(x,y,z)和表示相机角度的相机矢量(x,y,z)以及点(x,y,z)。什么应该去矩阵内的哪个位置转换到新的适当位置?

2 个答案:

答案 0 :(得分:1)

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

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进行栅格化。

有关此算法各阶段的说明,请参阅OpenGL FAQ中的问题9.011。

答案 1 :(得分:0)

在他们出售的头几年,用于PC的大众市场图形处理器根本没有转换或旋转点。您是否需要实施此功能?如果没有,您可能希望让软件这样做。根据您的具体情况,软件可能是更合理的途径。

如果您需要实施该功能,我会告诉您他们在早期是如何做到的。

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

模型*查看*投影

其中“模型”是将顶点从“模型”坐标带入“世界”坐标的矩阵,“视图”是将“世界”坐标中的顶点带入“相机”坐标的矩阵,“投影”是将顶点从“相机”坐标带到“屏幕”坐标的矩阵。它们将顶点从“模型”坐标 - 相对于它们所属的3D模型的坐标 - 带入“屏幕”坐标,您打算将它们光栅化为三角形。

这是三个不同的矩阵,但它们相乘,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']。

然后使用新计算的顶点对三角形进行栅格化。如果需要,这可以使模型的顶点位于只读存储器中,尽管模型和相机可能处于运动状态。