2

頂点ごとに独自の色で頂点の束をレンダリングしようとしています。頂点の数は約 1 ミリオンなので、頂点配列オブジェクトを使用してレンダリングします。ポイントをレンダリングしても問題ありませんが、データ配列に色を追加すると、ポイントはまだ白くレンダリングされます。見つけたさまざまなチュートリアルを試しましたが、すべてうまくいきませんでした(tut1tut2またはthisなど)。

私は VCVCVC を含む 1 つの配列にデータを持っています...頂点位置に 3 つの浮動小数点数、色に 4 つの浮動小数点数。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

unsigned VAO_ID;
glGenVertexArrays(1, &VAO_ID);
glBindVertexArray(VAO_ID);

unsigned VBO_ID;
glGenBuffers(1, &VBO_ID);

glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
glBufferData(GL_ARRAY_BUFFER, vertex_count*7*4, vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7*4, 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7*4, (char*)NULL + 3);
glEnableVertexAttribArray(1);

glVertexPointer(3, GL_FLOAT, 7*4, &vertices[0]);
glColorPointer(4, GL_FLOAT, 7*4, &vertices[3]);

glDrawArrays(GL_POINTS, 0, vertex_count);

私は OpenGL を初めて使用するので、見えない愚かな間違いを犯した可能性があります。

ところで:配列内の色があっても、頂点の位置はまだ正しいです

4

2 に答える 2

3

頂点の送信方法を1つだけ選択します。

  1. 頂点配列 (VA):

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    glVertexPointer(3, GL_FLOAT, 7*4, &vertices[0]);
    glColorPointer(4, GL_FLOAT, 7*4, &vertices[3]);
    
    glDrawArrays(GL_POINTS, 0, vertex_count);
    
  2. 頂点バッファ オブジェクト (VBO):

    unsigned VBO_ID;
    glGenBuffers(1, &VBO_ID);
    glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
    glBufferData(GL_ARRAY_BUFFER, vertex_count*7*4, vertices, GL_STATIC_DRAW);
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    
    glVertexPointer(3, GL_FLOAT, 7*4, 0);
    glColorPointer(4, GL_FLOAT, 7*4, (char*)NULL + 3);
    
    glDrawArrays(GL_POINTS, 0, vertex_count);
    
  3. 頂点配列オブジェクト (VAO) + VBO (対応するシェーダーが必要):

    unsigned VAO_ID;
    glGenVertexArrays(1, &VAO_ID);
    glBindVertexArray(VAO_ID);
    
    unsigned VBO_ID;
    glGenBuffers(1, &VBO_ID);
    glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
    glBufferData(GL_ARRAY_BUFFER, vertex_count*7*4, vertices, GL_STATIC_DRAW);
    
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7*4, 0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7*4, (char*)NULL + 3);
    glEnableVertexAttribArray(1);
    
于 2014-03-06T16:13:42.687 に答える