Как использовать параметр шага в VBO? - PullRequest
1 голос
/ 10 июля 2011

У меня проблемы с пониманием того, как использовать один буфер с 3 различными данными, у меня есть следующая структура для моих данных vert, text, color:

struct xyzf {
    float x, y, z;
};
struct xyf {
    float x, y;
};

struct vertype {
    xyzf points[4];
};
struct textype {
    xyf points[4];
};
struct coltype {
    GLuint points[4];
};

struct buftype {
    vertype vertex;
    textype texcoord;
    coltype color;
};

Затем я (пытаюсь) использовать егоследующим образом (что для меня наиболее разумно):

glBindBufferARB(GL_ARRAY_BUFFER, mybufid);
glVertexPointer(3, GL_FLOAT, sizeof(buftype), 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(buftype), (GLvoid *)sizeof(vertype));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(buftype), (GLvoid *)(sizeof(vertype)+sizeof(textype)));

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_QUADS, 0, indices);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

glBindBufferARB(GL_ARRAY_BUFFER, 0); // unbind

Но он терпит неудачу, и его рендеринг отличается от того, что я получил, установив шаг и указатели, чтобы обнулить все.Когда я это делаю, мои данные вершин отображаются правильно, но текст / цвет по-прежнему неверны.

Я не могу использовать & data [0] .vertex для последнего параметра в glVertexPointer () и т. Д., Потому что я не могуУ меня больше нет данных, так как я использую VBO, этот метод работает только с массивами вершин.

Также я не уверен, как работает значение count для glDrawArrays (), я читаю документы, которые говорят, что этоиндексы, так что четырехугольник будет иметь 4, верно?Но когда я умножаю количество четырехугольников на 4, это только дает ПОЛОВИНУ моих вершин, что там происходит?(он будет отображать их все, если я умножу на 8 ...)

1 Ответ

2 голосов
/ 10 июля 2011

Кажется, вы чередуете свои данные для каждого квадратора, но вам лучше чередовать их для каждой вершины (по крайней мере, это то, что обычно делается).

Ваш код должен быть правильным, если вы измените расположение вершин на это:

xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba

Вместо

xyzxyzxyzxyz
uvuvuvuv
rgbargbargbargba
...