Передача указателя на массив в glGenBuffers - PullRequest
2 голосов
/ 30 апреля 2010

В настоящее время я передаю массив функции, а затем пытаюсь использовать glGenBuffers с массивом, который передается функции. Я не могу найти способ заставить glGenBuffers работать с массивом, который я передал. Я достаточно хорошо понимаю основы указателей, но это за мной.

Буферы создаются (и удаляются) в другом месте. Я могу сделать все, если я исправлю это, но это делает его более гибким. Текущая проблема - "& renderArray [0]". Если я перемещу это (все в функцию) так, чтобы оно было в основном коде рисования, это работает. У меня также есть кое-что очень похожее, которое также использует постоянный массив.

Это в основном то, как работает код рендеринга. Это немного сложнее (цвета, использующие ту же идею массива, также не работают), но основная идея заключается в следующем:

void drawFoo(const GLfloat *renderArray, GLuint verticeBuffer) {
    glBindBuffer(GL_ARRAY_BUFFER, verticeBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(renderArray)*sizeof(GLfloat), &renderArray[0], GL_STATIC_DRAW);
    glVertexPointer(2, GL_FLOAT, 0, 0);

    glEnableClientState(GL_VERTEX_BUFFER);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 45);
    glDisableClientState(GL_VERTEX_BUFFEr);
}

Заранее спасибо за помощь

1 Ответ

3 голосов
/ 30 апреля 2010

Если вы передадите массив в качестве указателя, вы потеряете информацию о его связанном типе:

GLfloat array[N];
GLfloat* pointer = array;
sizeof(array  ); // => sizeof(GLfloat) * N
sizeof(pointer); // => sizeof(GLfloat*);

sizeof - это оператор времени компиляции, который дает вам размер типа его операнда, который в вашем случае равен GLfloat*.

Вам необходимо передать размер массива в качестве дополнительного параметра:

void drawFoo(const GLfloat* renderArray, size_t nFloats, GLuint verticeBuffer) {
    // ...
    glBufferData(GL_ARRAY_BUFFER, nFloats * sizeof(GLFloat), 
                 renderArray, GL_STATIC_DRAW);

Также обратите внимание, что синтаксис &array[0] является избыточным, renderArray уже является указателем. Даже с массивами такое выражение не требуется, поскольку массивы могут неявно затухать до указателя на их первый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...