ちょっと、私はstd :: vectorに問題があり、あなたの助けが必要です。 現在、新しいvulkan apiを使用してレンダリングエンジンをプログラミングしています。異なるメッシュの異なる頂点レイアウトをサポートしたいと考えています。 問題は、std :: vector :: data()が必要な生データを返さないということです。ここに私の頂点の構造体です:C++ std :: vectorサブクラスから生データを取得しない
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()関数は "実データ"を返しません。私はどのようにstd :: vectorで継承を使って "サブクラスからの生データ"を得ることができるのかわかりません。 あなたは私を助けることを願っています! ありがとう
EDIT:メモリをチェックして、VertexColor(..)データを置くstd :: vectorのメモリにデータを設定しませんでした。それは "Vertex"構造体にメンバーがないためですか?
メッシュには2つのベクトルを取るコンストラクタがありますか? –
はい、もちろんです。これは私が望むコンストラクタです:Mesh(const std :: vector&vertices、const std :: vector &indices);最初のバージョン(memcpy)では、最初のstd :: vectorの代わりにポインタを持つ別のコンストラクタとバイト単位のサイズを持っています。 –
メッシュコンストラクタを表示してください。プロトタイプ、少なくとも。 – kfsone