質問: 提示コードですが構造体の頂点属性構造体を用意してそこから頂点、UV座標というように属性を取り出して設定したいのですがストライドというのはどのように設定したらいいのでしょうか?glVertexAtrribPointer();関数 公式リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml ``` //頂点属性 struct VertexAttribute { GLfloat Position[3]; //頂点座標 GLfloat uv[2]; //UV座標 }; //VAO glGenVertexArrays(1, &vao); glBindVertexArray(vao); //VBO glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, std::size(vertex) * sizeof(Game::VertexAttribute), std::data(vertex) ,GL_STATIC_DRAW); //頂点座標 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), std::data(vertex.at(0).Position)); glEnableVertexAttribArray(0); //UV座標 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Game::VertexAttribute), std::data(vertex.at(0).uv)); glEnableVertexAttribArray(1); //IBO glGenBuffers(1, &ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::size(index) * sizeof(unsigned int),std::data(index),GL_STATIC_DRAW); ```
回答: > > ストライド > > > 使ったことないですが, 手持ちのデータが ``` | X1 | Y1 | Z1 | U1 | V1 | X2 | Y2 | Z2 | U2 | V2 | X3 | Y3 | Z3 | U3 | V3 | ... ``` みたいな形の並びになっているときに, glVertexAttribPointer()で頂点座標を突っ込みたいときには, ``` | X1 | Y1 | Z1 | 無視 | 無視 | X2 | Y2 | Z2 | 無視 | 無視 | X3 | Y3 | Z3 | 無視 | 無視 | ... ``` という形でXYZの部分だけを採用して欲しい(余計な部分は無視して欲しい)ので, X1←→X2←→X3←→... の「←→」の部分がどれだけ離れているのかをbyte単位で指定するための物でしょう. で,元のデータがstructの配列だと,アライメントだのパディングだのいう話(もしもご存じなければ検索等してみてください)を考慮した値を設定しないとまずそうに思えますが, その結果というのは`sizeof(VertexAttribute)`になるのか......な? この例の場合,UVを突っ込みたいときは,U1の箇所から見てほしい(先頭のX1,Y1,Z1は無視して欲しい)ので, 最後の引数にoffset量も指定する必要があるかな.(offsetofあたりを使って指定することになるかと)