在“introduction to 3d game programming with directx 11”一书的示例代码中

欧文
void GeometryGenerator::Subdivide(MeshData& meshData)
{
    // Save a copy of the input geometry.
    MeshData inputCopy = meshData;


    meshData.Vertices.resize(0);
    meshData.Indices.resize(0);

    //       v1
    //       *
    //      / \
    //     /   \
    //  m0*-----*m1
    //   / \   / \
    //  /   \ /   \
    // *-----*-----*
    // v0    m2     v2

    UINT numTris = inputCopy.Indices.size()/3;
    for(UINT i = 0; i < numTris; ++i)
    {
        Vertex v0 = inputCopy.Vertices[ inputCopy.Indices[i*3+0] ];
        Vertex v1 = inputCopy.Vertices[ inputCopy.Indices[i*3+1] ];
        Vertex v2 = inputCopy.Vertices[ inputCopy.Indices[i*3+2] ];

        //
        // Generate the midpoints.
        //

        Vertex m0, m1, m2;

        // For subdivision, we just care about the position component.  We 
        // derive the other
        // vertex components in CreateGeosphere.

        m0.Position = XMFLOAT3(
            0.5f*(v0.Position.x + v1.Position.x),
            0.5f*(v0.Position.y + v1.Position.y),
            0.5f*(v0.Position.z + v1.Position.z));

        m1.Position = XMFLOAT3(
            0.5f*(v1.Position.x + v2.Position.x),
            0.5f*(v1.Position.y + v2.Position.y),
            0.5f*(v1.Position.z + v2.Position.z));

        m2.Position = XMFLOAT3(
            0.5f*(v0.Position.x + v2.Position.x),
            0.5f*(v0.Position.y + v2.Position.y),
            0.5f*(v0.Position.z + v2.Position.z));

        //
        // Add new geometry.
        //

        meshData.Vertices.push_back(v0); // 0
        meshData.Vertices.push_back(v1); // 1
        meshData.Vertices.push_back(v2); // 2
        meshData.Vertices.push_back(m0); // 3
        meshData.Vertices.push_back(m1); // 4
        meshData.Vertices.push_back(m2); // 5

        meshData.Indices.push_back(i*6+0);
        meshData.Indices.push_back(i*6+3);
        meshData.Indices.push_back(i*6+5);

        meshData.Indices.push_back(i*6+3);
        meshData.Indices.push_back(i*6+4);
        meshData.Indices.push_back(i*6+5);

        meshData.Indices.push_back(i*6+5);
        meshData.Indices.push_back(i*6+4);
        meshData.Indices.push_back(i*6+2);

        meshData.Indices.push_back(i*6+3);
        meshData.Indices.push_back(i*6+1);
        meshData.Indices.push_back(i*6+4);
    }
}

此函数位于“GeometryGenerator.cpp”文件中,并细分网格。在调用这个函数之前,会创建一个二十面体并将其作为参数 meshData 传输。MeshData 的成员 Vertices 和 Indices 是 STL 的向量。

在我看来,这个函数调用了这一系列函数后,meshData.Vertices.push_back,在循环的下一次迭代中,一些顶点可能会被重复存储。

任何人都可以回答

  • 不管我错了,
  • 为什么作者把代码弄成这样,
  • 或者如果我的想法是正确的,是否有更有效的方法。

感谢所有阅读我拙劣英语的人。

阿空加瓜

我是否错了

我很确定你是对的,尤其是关于重复的顶点!

为什么作者制作这样的代码

除了作者本人,没有人可以回答这个问题。他/她只是监督了重复问题......

或者如果我的想法是正确的,是否有更有效的方法。

只要算法不正确,我就不会关心效率

首先,我们需要避免顶点重复。我只是将现有的顶点保留原样(因此只有clear索引)并在末尾附加新的顶点为此,我会将存储在临时 std::map 中,将一对索引(边)映射到新创建的索引(始终首先使用较小的索引以避免(10,12)vs.出现问题(12,10),它标识相同的边。) .)

然后对于 v0、v1、v2,我会使用索引,而不是顶点本身。m0, m1, m2 首先在地图中查找,如果找到,则使用,否则,创建一个新顶点,将其添加到顶点向量并在我们的地图中添加一个条目。

UINT v0 = copiedIndices[i*3+0];
// ...

UINT m0;
auto key = std::make_pair(v0, v1); // TODO: order indices!!!
auto entry = myMap.find(key); 
if(entry != myMap.end())
{
    m0 = entry->second;
}
else
{
    meshData.Vertices.push_back(newVertex);
    m0 = meshData.Vertices.size() - 1;
    myMap.insert(key, m0);
}

然后你将添加你的新三角形,只需按原样使用索引:

meshdata.indices.pushback(v0); // one of the original indices
meshdata.indices.pushback(m0); // one of the new ones
meshdata.indices.pushback(m2);

// ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C ++ 11在DirectX 11.2应用程序中测量3D模型的体积

来自分类Dev

是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?

来自分类Dev

如何在DirectX中绘制3D对象周围的2D几何图形?(D3D9)

来自分类Dev

找不到任何Directx3D 12示例

来自分类Dev

DirectX 3D围绕lookAt旋转eyePt

来自分类Dev

在 3D 骨架系统 DirectX 之间转换

来自分类Dev

Libgdx rendering floor for 3D game

来自分类Dev

《 Programming Pearls》一书中的“ pmalloc”代码

来自分类Dev

《 Programming Pearls》一书中的“ pmalloc”代码

来自分类Dev

在Visual Studio中安装Directx和Direct3D

来自分类Dev

DirectX / C ++ 3D Engine编程:立即学习还是等待DirectX 12?

来自分类Dev

在DirectX 11中渲染

来自分类Dev

尝试渲染3D三角形会使Nvidia驱动程序崩溃!为什么?[C ++ && DirectX11 SDK]

来自分类Dev

DirectX D3D11CreateDeviceAndSwapChain返回E_INVALIDARG

来自分类Dev

DirectX 11领域

来自分类Dev

Directx 11内存管理

来自分类Dev

DirectX 11效果

来自分类Dev

DirectX 11视频播放

来自分类Dev

DirectX 11骨骼动画

来自分类Dev

DirectX 11访问冲突

来自分类Dev

DirectX 11效果

来自分类Dev

“编程实体框架代码第一书”中的示例未创建数据库

来自分类Dev

DirectX中的色度键

来自分类Dev

使用DirectX9和NVAPI调用的GeForce上的Nvidia 3D视觉

来自分类Dev

使用DirectX9和NVAPI调用的GeForce上的Nvidia 3D视觉

来自分类Dev

DirectX 9的游戏无法与DirectX 11一起使用

来自分类Dev

JavaFX 3d示例

来自分类Dev

JavaFX 3d示例

来自分类Dev

如何尽可能快地在DirectX 9中使用D3DXSprite绘制D3DXFont?