使用 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 };
}
最后,你应该看到这样的东西。
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 };
}
最后,你应该看到这样的东西。