2

頂点バッファと要素バッファを使用しています。

次の関数は、頂点と要素のデータを配列として受け取り、そこからバッファを作成します。私の実際の実装はもっと複雑で、もちろん後で使用するためにIDを保存しますが、それはこの質問とは関係ありません。

void Create(const float Vertices[], const int Elements[])
{
    GLuint VertexBuffer, ElementBuffer; // ids

    glGenBuffers(1, VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

    glGenBuffers(1, ElementBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Elements), Elements, GL_STATIC_DRAW);
}

Create()別の関数では、立方体を表す2つの配列を渡すことを呼び出します。しかし、何も起こりません。ウィンドウが開き、キューブのないコーンフラワーブルーの背景が表示されます。

float VERTICES[] = {-1.f,-1.f,1.f,1.f,0.f,0.f,.8f,1.f,-1.f,1.f,0.f,1.f,0.f,.8f,1.f,1.f,1.f,0.f,0.f,1.f,.8f,-1.f,1.f,1.f,1.f,1.f,1.f,.8f,-1.f,-1.f,-1.f,0.f,0.f,1.f,.8f,1.f,-1.f,-1.f,1.f,1.f,1.f,.8f,1.f,1.f,-1.f,1.f,0.f,0.f,.8f,-1.f,1.f,-1.f,0.f,1.f,0.f,.8f};
int   ELEMENTS[] = {0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3};

Create(VERTICES, ELEMENTS);

関数内で頂点と要素のデータを移動するとCreate()、すべてが正常に機能し、立方体が正しくレンダリングされます。

void Create()
{
    GLuint VertexBuffer, ElementBuffer;

    float VERTICES[] = {-1.f,-1.f,1.f,1.f,0.f,0.f,.8f,1.f,-1.f,1.f,0.f,1.f,0.f,.8f,1.f,1.f,1.f,0.f,0.f,1.f,.8f,-1.f,1.f,1.f,1.f,1.f,1.f,.8f,-1.f,-1.f,-1.f,0.f,0.f,1.f,.8f,1.f,-1.f,-1.f,1.f,1.f,1.f,.8f,1.f,1.f,-1.f,1.f,0.f,0.f,.8f,-1.f,1.f,-1.f,0.f,1.f,0.f,.8f};
    int   ELEMENTS[] = {0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3};

    glGenBuffers(1, VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);

    glGenBuffers(1, ElementBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(ELEMENTS), ELEMENTS, GL_STATIC_DRAW);
}

Create()したがって、配列を関数に渡すときに問題が発生すると思います。コンパイラのエラーや警告は表示されません。ここで何が問題になっていますか?

4

2 に答える 2

4

タイプのパラメータconst float Vertices[]は実際にはと同じconst float Vertices*です。つまりsizeof、ポインタのサイズを返すだけです。

代わりに、テンプレートを使用して配列への参照を使用してください。

template<std::size_t VerticesN, std::size_t ElementsN>
void Create(const float (&Vertices)[VerticesN], const int (&Elements)[ElementsN])
{
// ...
}

// Usage is the same since template argument deduction

float VERTICES[] = {-1.f,-1.f,1.f,1.f,0.f,0.f,.8f,1.f,-1.f,1.f,0.f,1.f,0.f,.8f,1.f,1.f,1.f,0.f,0.f,1.f,.8f,-1.f,1.f,1.f,1.f,1.f,1.f,.8f,-1.f,-1.f,-1.f,0.f,0.f,1.f,.8f,1.f,-1.f,-1.f,1.f,1.f,1.f,.8f,1.f,1.f,-1.f,1.f,0.f,0.f,.8f,-1.f,1.f,-1.f,0.f,1.f,0.f,.8f};
int   ELEMENTS[] = {0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3};

Create(VERTICES, ELEMENTS);
于 2012-12-19T10:16:32.860 に答える
3

ここでの問題はsizeof(VERTICES)sizeof(ELEMENTS)です。メソッドで使用される場合Create()、配列のサイズは既知ですが、配列をパラメーターとして渡す場合(配列のようにCreate(const float Vertices[], const int Elements[])、配列はポインターに劣化し、はポインターsizeofのサイズを返すように縮小されます。

簡単な解決策の1つは、配列とともにサイズを渡すことです。したがって、関数は次のようになります。

void Create(const float Vertices[], size_t VertSize, const int Elements[], size_t ElemSize) {
  ...
}

しかし、私は次の機能を持つ新しいstd::arrayを使用するソリューションを好むと思います。size()

void Create(const std::array<float>& vertices, std::array<int>& elements) {
  ...
}

c ++ 11を使用する機会がない場合、ブーストライブラリはc++11の動作を反映するboost::arrayを提供します。

于 2012-12-19T10:17:32.320 に答える