OpenGL ES 2.0, рисование с использованием нескольких буферов вершин - PullRequest
1 голос
/ 07 января 2012

Я не могу найти много информации о том, поддерживается ли рисование из нескольких буферов вершин в OpenGLES 2.0 (т. Е. Используется один буфер вершин для данных о положении и другой для нормалей, цветов и т. Д.). Эта страница http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html и, в частности, листинг 9.4, подразумевают, что вы должны это сделать, но я не могу заставить его работать в моей программе. Код для оскорбительного розыгрыша:

glBindBuffer(GL_ARRAY_BUFFER, mPositionBuffer->openglID);
glVertexAttribPointer(0, 4, GL_FLOAT, 0, 16, NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, mTexCoordBuffer->openglID);
glVertexAttribPointer(1, 2, GL_FLOAT, 0, 76, NULL);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->openglID);
glDrawElements(GL_TRIANGLES, 10788, GL_UNSIGNED_SHORT, NULL);

Этот вызов отрисовки будет остановлен или завершится с EXC_BAD_ACCESS на симуляторе и даст очень странное поведение на устройстве (opengl рисует случайные треугольники или представляет ранее визуализированные кадры). Ни один вызов opengl никогда не возвращает ошибку, и я тщательно проверял буферы вершин и уверен, что они имеют правильные размеры и данные.

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

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Нарушения доступа обычно означают, что вы пытаетесь нарисовать больше треугольников, чем выделено в буфере. То, как вы настроили буферы, прекрасно и должно работать, я бы проверил, правильно ли установлены ваши параметры:

http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

Я думаю, что ваша проблема либо в том, что вы переключили смещение и шаг в своих glVertexAttribPointer вызовах, либо вы неправильно подсчитали количество используемых вами индексов

1 голос
/ 08 января 2012

Да, вы можете использовать несколько объектов буфера вершин (VBO) для одного рисования. OpenGL ES 2.0 spec говорит об этом в разделе 2.9.1.

У вас действительно есть все эти жестко запрограммированные константы в вашем коде?Откуда взялись эти 76?

Если вам нужна помощь в отладке, вам нужно опубликовать код, который инициализирует ваши буферы (код, который вызывает glGenBuffers и glBufferData).Вам также следует опубликовать трассировку стека EXC_BAD_ACCESS.

Также было бы легче отлаживать, если вы нарисовали что-то более простое, например, один треугольник, вместо 3596 треугольников.

...