如何从2个向量构建顶点矩阵?

时间:2019-04-24 19:22:56

标签: c++ graphics 3d vulkan

我正在用C ++编写一个与Vulkan交互的游戏引擎。为了使我能够在屏幕上绘制任何内容,我需要编写顶点。

游戏引擎为Vulkan提供了更高级别的界面,它需要能够根据位置Vector3和大小Vector3构造顶点。

我对如何有效地解决这个问题一无所知,有人可能会指出正确的方向吗?谢谢!

class SquareMatrix {
public:
  Vector3 s1v1, s1v2, s1v3, s1v4, // Top
          s2v1, s2v2, s2v3, s2v4, // Bottom
          s3v1, s3v2, s3v3, s3v4, // Left
          s4v1, s4v2, s4v3, s4v4, // Right
          s5v1, s5v2, s5v3, s5v4, // Front
          s6v1, s6v2, s6v3, s6v4; // Back
  SquareMatrix(Vector3& v1, Vector3& v2) {
    std::array<std::array<Vector3, 4>, 6> Square;
    for(int a=0; a<=6; a++) {
      for(int b = 0; b <= 4; b++) {
        // Stumped!
      }
    }
  }
};

2 个答案:

答案 0 :(得分:0)

无论如何,您要做的第一件事是使用数组而不是大量字段来存储顶点。

我假设通过写顶点是在调用vkMapMemoryvkUnmapMemory之间编写顶点(我不是Vulkan专家大声笑)。在这种情况下,我想到的最有效的方法是使用浮点数组而不是Vertex3数组(否则,您必须一个一个地复制,或者必须找到一个遍历标准布局,对齐要求以及比简单的float数组复杂得多的其他内容),并使用该内容进行编写。至于编辑float数组,这非常简单。另一个实际上等效的选项是浮点数的多维数组,并且在顶点数量永远不变(在编译时已知)的情况下,这也有效(在任何情况下,简单数组都可以简单地模拟多维数组)无论如何)。

答案 1 :(得分:0)

这两个向量可能代表“轴对齐边界框”(AABB):https://en.m.wikipedia.org/wiki/Bounding_volume

AABB是一种长方体(即矩形的3D版本),其特殊之处在于其边缘与笛卡尔轴对齐。这意味着我们可以使用框的中心点和三个正交方向的半角(大小)或对应于框的最小和最大角的两个顶点来定义任何AABB。

因此,在代码中,您最好定义一个结构AABB,其中包含两个顶点,这些顶点的名称为minPoint和maxPoint。

另一件事是您不需要定义24个顶​​点。您只需要8个顶点。然后,您需要定义6个面,每个面包含3个三角形的整数或4个方形的4个整数,这些整数是顶点的索引。 Vulkan应该提供带有两个参数的render函数:顶点列表(可能是浮点数数组)和面列表(可能是整数数组)。

希望这会有所帮助。