70836


提示コードですが。提示コードが多すぎるのでほとんど省略しています。本来コンストラクタでは出来ません。  
提示コードの///描画部ですが。vertex変数を構造体ではなくstd::vecotr<>型で頂点属性を設定すると表示がおかしくなります。構造体型の配列で行うと正常に描画されるので、std::vecter<>型を使う場合glbufferData();関数の第三引数をどうやって渡したらいいでしょうか？  
[![画像の説明をここに入力](https://i.stack.imgur.com/cnNrh.png)](https://i.stack.imgur.com/cnNrh.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/de48F.png)](https://i.stack.imgur.com/de48F.png)

描画を別のクラスで作る場合コンストラクタで頂点情報を送りたいのですが、その場合数が毎回異なるためstd::vecotr<>型を利用したです。

[code]

    //コンストラクタ
    Game::Game()
    {
    
    
        mIsRunLoop = true;
        keyMode = KeyState::Rotate;
     //   getchar();
        //回転
        move_rotate.x = 0;
        move_rotate.y = 0;
        move_rotate.z = 0;
    
        //平行移動
        move_transform.x = 0;
        move_transform.y = 0;
        move_transform.z = -2;
    
    
        
        //頂点属性を設定
        
    
        //頂点属性を設定
            //頂点バッファー
    //  Game::VertexAttribute vertex[8];
        std::vector<Game::VertexAttribute> vertex;
    
        vertex.push_back(VertexAttribute{ -1,1,0 });
        vertex.push_back(VertexAttribute{ -1,-1,0 });
        vertex.push_back(VertexAttribute{ 1,-1,0 });
        vertex.push_back(VertexAttribute{ 1,1,0 });
    
    
        vertex.push_back(VertexAttribute{ -1,1,-2 });
        vertex.push_back(VertexAttribute{ -1,-1,-2 });
        vertex.push_back(VertexAttribute{ 1,-1,-2 });
        vertex.push_back(VertexAttribute{ 1,1,-2 });
        
    
        /*
        vertex[0].Position[0] = -1;
        vertex[0].Position[1] = 1;
        vertex[0].Position[2] = 0;
        
        vertex[1].Position[0] = -1;
        vertex[1].Position[1] = -1;
        vertex[1].Position[2] = 0;
        
        vertex[2].Position[0] = 1;
        vertex[2].Position[1] = -1;
        vertex[2].Position[2] = 0;
        
        vertex[3].Position[0] = 1;
        vertex[3].Position[1] = 1;
        vertex[3].Position[2] = 0;
    
    ///////////////////////////////////////////////  
        vertex[4].Position[0] = -1;
        vertex[4].Position[1] = 1;
        vertex[4].Position[2] = -2;
    
        vertex[5].Position[0] = -1;
        vertex[5].Position[1] = -1;
        vertex[5].Position[2] = -2;
    
        vertex[6].Position[0] = 1;
        vertex[6].Position[1] = -1;
        vertex[6].Position[2] = -2;
    
        vertex[7].Position[0] = 1;
        vertex[7].Position[1] = 1;
        vertex[7].Position[2] = -2;
        */
    
        ///////////描画
        //glBufferData(GL_ARRAY_BUFFER, 8 * 3 * sizeof(GLfloat), vertex, GL_STATIC_DRAW);
        //glBufferData(GL_ARRAY_BUFFER, 8 * 3 * sizeof(GLfloat), &vertex, GL_STATIC_DRAW);
        //////////
    
      //  draw = new DrawVertex(this,"sample.png",vertex,index);
    
       camera_pos = glm::vec3(0,0,0);
    }
    
[/code]


CC BY-SA 4.0
2020-09-30T06:04:29.897
70831
2020-09-30T21:59:28.907
2020-09-30T08:06:01.997
9515
question
c++ opengl
glBufferData();の第三引数にstd::vector<>型を正常に渡す方法が知りたい。


OpenGLのことはさっぱり知りませんが、配列を要求している関数に`std::vector`のデータを渡すには、

[code]

    glBufferData(GL_ARRAY_BUFFER, vertex.size() * 3 * sizeof(GLfloat),
                 vertex.data(), GL_STATIC_DRAW);
    
[/code]

のように `data()`メンバ関数を使います。

`Game::VertexAttribute`の定義によってはこれでも動かない可能性があります。


CC BY-SA 4.0
2020-09-30T08:06:57.703
70835
2020-09-30T21:59:28.907
2020-09-30T21:59:28.907
3475
3475
70831
answer

[code]

    void glBufferData(
        GLenum target,
        GLsizeiptr size,
        const void * data,
        GLenum usage);
    
[/code]

[`glBufferData`](https://www.khronos.org/registry/OpenGL-
Refpages/gl4/html/glBufferData.xhtml)は任意のデータ型を受け取るため`const
void*`となっており、C++言語で期待されるような型チェックが機能しません。正しい引数を与える必要があります。

> Specifies a pointer to data that will be copied into the data store for
> initialization, or NULL if no data is to be copied.

とのことですので、
[`.data()`メンバー関数](https://ja.cppreference.com/w/cpp/container/vector/data)でpointer
to
dataが得られます。[`std::data()`関数](https://ja.cppreference.com/w/cpp/iterator/data)を使用すると`std::vector`でも配列でも同様に扱うことができます。

[code]

    glBufferData(GL_ARRAY_BUFFER, 8 * 3 * sizeof(GLfloat), std::data(vertex), GL_STATIC_DRAW);
    
[/code]


CC BY-SA 4.0
2020-09-30T08:07:42.420
70836
2020-09-30T21:36:59.140
2020-09-30T21:36:59.140
4236
4236
70831
answer