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没有任何成员?答案 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
)。