首页 > 解决方案 > opengl没有画一些三角形

问题描述

在 opengl 中,我试图编写一个程序,该程序能够使用三角形在屏幕上绘制多个矩形。我没有手动写下所有顶点,而是编写了一个嵌套的 for 循环来生成顶点。然而,这个程序并没有绘制所有的三角形,而是只将最后两个三角形输出为一个矩形(见下图)。我确信这种生成三角形的方式非常糟糕且效率低下,但这不是我对这段代码输出的主要抱怨。下面是将顶点添加到数组的嵌套 for 循环(请注意此代码绝对令人作呕)

    float initTri1[] = { -1.5f, 0.5f, 0.0f, -1.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f };
    float initTri2[] = { -1.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.5f, 0.0f };
    float vertices[18*4];
    float increment =0.0f;
    // draws an amount of rectangles equal to the number after 18 in vertices
    for (int j = 0; j < sizeof(vertices)/sizeof(vertices[0])/18; j++)
    {
        increment += 0.5f;
        // draws triangle with hypotenuse on right side
        for (int i = 0; i < 9; i++)
        {
            // shifts the value of the initial triangles x verticies by 0.5
            if ((i + 1) % 3 != 1)
            {
                vertices[i+j*9] = initTri1[i];
            }
            // keeps the y and z values the same as the initial triangle.
            else
            {
                vertices[i+j*9] = initTri1[i] + increment;
            }
        }
        // sometimes draws the triangle with the hypotenuse on the left side
        for (int i = 9; i < 18; i++)
        {
            // shifts the value of the initial triangles x verticies by 0.5
            if ((i + 1) % 3 != 1)
            {
                vertices[i+j*9] = initTri2[i - 9];
            }
            // keeps the y and z values the same as the initial triangle.
            else
            {
                vertices[i+j*9] = initTri2[i - 9] + increment;
            }
        }
    }

下面是生成结果的图像:分别为 2 个三角形、4 个三角形和 8 个三角形。 成功绘制了两个三角形的矩形 无法绘制所有矩形 无法绘制所有矩形

标签: c++opengl

解决方案


我觉得无法遵循 OP 的索引计算。试一试更容易。结果看起来不对:

vertices[0]: -1, 0.5, 0
vertices[3]: -1, 0, 0
vertices[6]: -0.5, 0, 0
vertices[9]: -0.5, 0.5, 0
vertices[12]: -0.5, 0, 0
vertices[15]: 0, 0, 0

vertices[18]: 0, 0.5, 0
vertices[21]: 0, 0, 0
vertices[24]: 0.5, 0, 0
vertices[27]: 0.5, 0.5, 0
vertices[30]: 0.5, 0, 0
vertices[33]: 1, 0, 0

vertices[36]: 0.5, 0.5, 0
vertices[39]: 1, 0, 0
vertices[42]: 1, 0.5, 0
vertices[45]: 0, 8.40779e-45, 0
vertices[48]: 8.82286e-39, 0, 8.82332e-39
vertices[51]: 0, 5.87998e-39, 0

vertices[54]: 5.87998e-39, 0, 8.82286e-39
vertices[57]: 0, -4.13785e+09, 4.58841e-41
vertices[60]: 1.4013e-45, 0, 2.8026e-45
vertices[63]: 0, 8.82195e-39, 0
vertices[66]: 5.88135e-39, 0, 0
vertices[69]: 0, 0, 0

关于大肠杆菌的演示

所以,我只是重写了循环,而不是繁琐地调试它。(这对我来说似乎是较小的邪恶。)

#include <iostream>

int main()
{
  float initTri1[] = { -1.5f, 0.5f, 0.0f, -1.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f };
  const size_t nTri1 = std::size(initTri1);
  float initTri2[] = { -1.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.5f, 0.0f };
  const size_t nTri2 = std::size(initTri2);
  const size_t nRect = 4;
  const size_t nVtcs = (nTri1 + nTri2) * nRect;
  float vertices[nVtcs];
  
  float increment = 0.0f;
  for (size_t j = 0, k = 0; j < nRect; ++j) {
    for (size_t i = 2; i < nTri1; i += 3) {
      vertices[k++] = initTri1[i - 2] + increment;
      vertices[k++] = initTri1[i - 1];
      vertices[k++] = initTri1[i - 0];
    }
    for (size_t i = 2; i < nTri2; i += 3) {
      vertices[k++] = initTri2[i - 2] + increment;
      vertices[k++] = initTri2[i - 1];
      vertices[k++] = initTri2[i - 0];
    }
    increment += 0.5f;
  }
  
  for (size_t k = 0; k < nVtcs; ++k) {
    if (k % (nTri1 + nTri2) == 0) std::cout << '\n';
    if (k % 3 == 0) {
      std::cout << "vertices[" << k << "]: ";
    }
    std::cout << vertices[k];
    std::cout << (k % 3 < 2 ? ", " : "\n");
  }
}

输出:

vertices[0]: -1.5, 0.5, 0
vertices[3]: -1.5, 0, 0
vertices[6]: -1, 0, 0
vertices[9]: -1.5, 0.5, 0
vertices[12]: -1, 0, 0
vertices[15]: -1, 0.5, 0

vertices[18]: -1, 0.5, 0
vertices[21]: -1, 0, 0
vertices[24]: -0.5, 0, 0
vertices[27]: -1, 0.5, 0
vertices[30]: -0.5, 0, 0
vertices[33]: -0.5, 0.5, 0

vertices[36]: -0.5, 0.5, 0
vertices[39]: -0.5, 0, 0
vertices[42]: 0, 0, 0
vertices[45]: -0.5, 0.5, 0
vertices[48]: 0, 0, 0
vertices[51]: 0, 0.5, 0

vertices[54]: 0, 0.5, 0
vertices[57]: 0, 0, 0
vertices[60]: 0.5, 0, 0
vertices[63]: 0, 0.5, 0
vertices[66]: 0.5, 0, 0
vertices[69]: 0.5, 0.5, 0

关于大肠杆菌的演示

这个故事的主旨:

  • 更简单的代码编写起来更快。
  • 更简单的代码运行得更快。
  • 更简单的代码易于维护。
  • 分析它,您可能会惊讶于更简单的代码可能更快。

推荐阅读