c ++ std :: vector不从子类获取原始数据

时间:2016-05-02 00:45:05

标签: c++11 vector

嘿家伙我有std :: vector的问题,我需要你的帮助。 我目前正在使用新的vulkan api编写渲染引擎,我想支持不同网格的不同顶点布局。 问题是std :: vector :: data()不返回我需要的原始数据。这是我的顶点结构:

struct Vertex 
{
};
struct VertexColor : public Vertex
{
public:
    VertexColor(Vec3f pos, Vec3f col) : position(pos), color(col) {}
    Vec3f position;
    Vec3f color;
};

这就是我实际拥有和工作的东西:

     std::vector<VertexColor> cubeVertexBuffer = {
        VertexColor{ Vec3f( -1.0f, -1.0f, 1.0f ), Vec3f( 0.0f, 0.0f, 0.0f ) },
        VertexColor{ Vec3f( 1.0f, -1.0f, 1.0f  ), Vec3f( 1.0f, 0.0f, 0.0f ) },
        VertexColor{ Vec3f( 1.0f, 1.0f, 1.0f   ), Vec3f( 1.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( -1.0f, 1.0f, 1.0f  ), Vec3f( 0.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( -1.0f, -1.0f, -1.0f), Vec3f( 0.0f, 0.0f, 1.0f ) },
        VertexColor{ Vec3f( 1.0f, -1.0f, -1.0f ), Vec3f( 0.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( 1.0f, 1.0f, -1.0f  ), Vec3f( 1.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( -1.0f, 1.0f, -1.0f ), Vec3f( 1.0f, 0.0f, 0.0f ) }
};

uint32_t size = 8 * sizeof(VertexColor);
Vertex* vertices = (Vertex*)malloc(size);
memcpy(vertices, cubeVertexBuffer.data(), size);

std::vector<uint32_t> cubeIndexBuffer = { 1,2,0,  2,3,0,
                                          0,3,4,  3,7,4,
                                          5,1,4,  1,0,4,
                                          2,6,3,  6,7,3,
                                          5,6,1,  6,2,1,
                                          6,5,7,  5,4,7 };

Cube::cubeMesh = new Mesh(vertices, size, cubeIndexBuffer);

我想要的是什么:

    std::vector<Vertex> cubeVertexBuffer = {
        VertexColor{ Vec3f( -1.0f, -1.0f, 1.0f ), Vec3f( 0.0f, 0.0f, 0.0f ) },
        VertexColor{ Vec3f( 1.0f, -1.0f, 1.0f  ), Vec3f( 1.0f, 0.0f, 0.0f ) },
        VertexColor{ Vec3f( 1.0f, 1.0f, 1.0f   ), Vec3f( 1.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( -1.0f, 1.0f, 1.0f  ), Vec3f( 0.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( -1.0f, -1.0f, -1.0f), Vec3f( 0.0f, 0.0f, 1.0f ) },
        VertexColor{ Vec3f( 1.0f, -1.0f, -1.0f ), Vec3f( 0.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( 1.0f, 1.0f, -1.0f  ), Vec3f( 1.0f, 1.0f, 0.0f ) },
        VertexColor{ Vec3f( -1.0f, 1.0f, -1.0f ), Vec3f( 1.0f, 0.0f, 0.0f ) }
};

std::vector<uint32_t> cubeIndexBuffer = { 1,2,0,  2,3,0,
                                          0,3,4,  3,7,4,
                                          5,1,4,  1,0,4,
                                          2,6,3,  6,7,3,
                                          5,6,1,  6,2,1,
                                          6,5,7,  5,4,7 };

Cube::cubeMesh = new Mesh(cubeVertexBuffer, cubeIndexBuffer);

正如我所提到的,我需要原始格式的整个顶点数据在内存中有条理地映射到gpu,但带有std :: vector的.data()函数不会返回&#34;真实数据&#34; 。我不知道如何使用std :: vector继承来从子类中获取&#34;原始数据&#34;在里面。 希望你能帮我! 感谢

编辑:我检查了内存和std :: vector,我将VertexColor(..)数据放入其中,它不在内存中设置任何数据。是因为&#34; Vertex&#34; struct没有任何成员?

2 个答案:

答案 0 :(得分:0)

首先,永远不要从std :: vector继承。不推荐也可能是不好的做法。

另外看看Vec3f。它有任何虚拟方法或析构函数吗?您可能会在课程中使用的数据多于您定义的成员。您使用的结构应该是普通的旧c ++对象,没有任何多态属性(即普通的c风格结构)。

另外,检查您的成员字节对齐方式。您可以使用以下命令从结构中删除所有填充:

    #pragma pack(push)
    #pragma pack(1)
    struct ...
    {
        ...
    }
    #pragma pack(pop)

如果你明白了,请告诉我。

此外,vector<Vertex>vector<VertexColor>无法比较,因为各个元素的大小不同。根据我的经验,3D API希望数据采用非常特定的格式,如果API尚未为您提供格式,则无法一般地执行此操作。

正如Jens所说,切片也可能发生。

答案 1 :(得分:0)

您遇到的事情称为切片。当您声明vector<Vertex>时,它将保存Vertex的实例。每个“单元格”都足以容纳Vertex中的数据。由于Vertex是VertexColor的基类,因此可以将VertexColor对象指定给Vertex,但这只会复制Vertex中的数据成员。 Vertex没有成员,那么您期望成为vector<Vertex>的内容是什么?

在这种情况下,继承是错误的设计方法。从我看到的情况来看,Mesh应该是模板类template<typename V> class Mesh<V>,以支持不同的顶点类型,仅限于标准布局类型(使用enable_if<is_standard_layout<V>::value, V, V>::type)。