使用 DirectX 11 制作椭圆

Make Ellipse by using DirectX 11

if(shapeType == ELLIPSE)
    {
        Vertex* v = new Vertex[31];
        v[0] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
        float theta;

        for(int i = 1; i < 30; ++i)
        {
            theta = (MATH::TWO_PI * i) / static_cast<float>(30);
            v[i] = { cos(theta * i), sin(theta * i), 1.0f, 0.0f, 0.0f };
        }


        HRESULT hr = this->vertexBuffer.Initialize(this->device, v,31);
        if (FAILED(hr))
        {
            ErrorLogger::Log(hr, "Failed to create vertex buffer.");
            return false;
        }

        DWORD* indices = new DWORD[90];

        int indiceHelperNum1 = 1;
        int indiceHelperNum2 = 2;

        for(int i = 0; i < 87; i += 3)
        {
            indices[i] = 0;
            indices[i + 1] = indiceHelperNum1;
            indices[i + 2] = indiceHelperNum2;

            indiceHelperNum1++;
            indiceHelperNum2++;
        }

        indices[84] = 0;
        indices[85] = 29;
        indices[86] = 1;

        hr = this->indexBuffer.Initialize(this->device, indices, 90);
        if (FAILED(hr))
        {
            ErrorLogger::Log(hr, "Failed to create indices buffer.");
            return false;
        }

        delete[] v;
        delete[] indices;
    }

这是我的代码,我认为这里除了内存分配没有问题。但是,当我尝试此代码时,它不起作用。我想制作一个半径为 one 的圆,其中心为原点。我使用顶点选取点,使用索引制作三角形。如果我的代码有问题,请告诉我。

这段代码有几个问题。

主要问题在下面一行

v[i] = { cos(theta * i), sin(theta * i), 1.0f, 0.0f, 0.0f };

没有理由将 theta 乘以 i

解决该问题后,您应该会看到类似这样的内容。

注意图像右侧勾勒出的问题区域。

为了缩小差距,需要修改最后 3 个索引。 替换

indices[84] = 0;
indices[85] = 29;
indices[86] = 1;

indices[87] = 0;
indices[88] = 30;
indices[89] = 1;

最后一件事,填充顶点的 for 循环没有填充索引 30 处的最后一个顶点。像这样调整 for 循环范围

for (int i = 1; i < 31; ++i)
{
    theta = (MATH::TWO_PI * i) / static_cast<float>(30);
    v[i] = { cos(theta ), sin(theta ), 1.0f, 0.0f, 0.0f };
}

最后,你应该看到这样的东西。