GlBufferSubData для одного треугольника не работает ⇐ C++
-
Гость
GlBufferSubData для одного треугольника не работает
Я пытаюсь провести рефакторинг простой программы, которая рисует треугольник, используя координаты вершин и цвета вершин, помещенные в два отдельных буфера, чтобы использовать один буфер и два вызова glBufferSubData.
Экран пуст, и единственная ошибка в журнале отладки OpenGL:
GL CALLBACK: ** GL ERROR ** тип = 0x824c, серьезность = 0x9146, сообщение = GL_INVALID_OPERATION в glDrawArrays Я бегло просмотрел документацию glDrawArrays и соответствующую ошибку, но не понял, почему у меня все еще «сопоставлено хранилище данных моего буферного объекта» (я не использую геометрические шейдеры и другие возможные причины для эта ошибка вообще)
Вот основной фрагмент моей программы (есть также оболочка, которую я использую для создания шейдеров и тому подобного, она работала, когда я использовал два отдельных буфера, и представляет собой простой шаблонный код, поэтому я не включил ее, чтобы не перегрузить вопрос текстом, но могу это сделать, если попросить создать минимальную рабочую программу):
GLuint GeneralBufferObject; программа GLuint; ГЛуинт вао; /* Определить позиции вершин в однородных координатах */ GLfloat vertexPositions[] = { 0,75ф, 0,75ф, 0,0ф, 1,0ф, 0,75f, -0,75f, 0,0f, 1,0f, -0,75f, -0,75f, 0,0f, 1,0f, }; /* Определить массив цветов */ GLfloat vertexColours[] = { 1.0ф, 0.0ф, 0.0ф, 1.0ф, 0.0ф, 1.0ф, 0.0ф, 1.0ф, 0.0ф, 0.0ф, 1.0ф, 1.0ф, }; использование пространства имен std; void init(GLWrapper* glw) { // Генерируем индекс (имя) для одного объекта массива вершин glGenVertexArrays(1, &vao); // Создаем объект массива вершин и делаем его текущим glBindVertexArray (вао); // Генерируем имя для объекта буфера вершин glGenBuffers(1, &generalBufferObject); glBindBuffer (GL_ARRAY_BUFFER, GeneralBufferObject); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions) + sizeof(vertexColours), NULL, GL_DYNAMIC_DRAW); // Заполняем буфер { xyzxyzxyz rgbrgbrgb } glBufferSubData (GL_ARRAY_BUFFER, 0, sizeof (vertexPositions), вершинные позиции); glBufferSubData (GL_ARRAY_BUFFER, sizeof (vertexPositions), sizeof(vertexColours), vertexColours); // Сообщаем шейдерам, где искать координаты и цвета вершин glEnableVertexAttribArray (0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray (1); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)sizeof(vertexPositions)); glDisableVertexAttribArray (0); glDisableVertexAttribArray (1); // Отвязываем VBO и VAO glBindBuffer (GL_ARRAY_BUFFER, 0); glBindVertexArray (0); пытаться { // вызов оболочки программа = glw->LoadShader("vert_attrib.vert", "vert_attrib.frag"); } catch (исключение& e) { cout
Я пытаюсь провести рефакторинг простой программы, которая рисует треугольник, используя координаты вершин и цвета вершин, помещенные в два отдельных буфера, чтобы использовать один буфер и два вызова glBufferSubData.
Экран пуст, и единственная ошибка в журнале отладки OpenGL:
GL CALLBACK: ** GL ERROR ** тип = 0x824c, серьезность = 0x9146, сообщение = GL_INVALID_OPERATION в glDrawArrays Я бегло просмотрел документацию glDrawArrays и соответствующую ошибку, но не понял, почему у меня все еще «сопоставлено хранилище данных моего буферного объекта» (я не использую геометрические шейдеры и другие возможные причины для эта ошибка вообще)
Вот основной фрагмент моей программы (есть также оболочка, которую я использую для создания шейдеров и тому подобного, она работала, когда я использовал два отдельных буфера, и представляет собой простой шаблонный код, поэтому я не включил ее, чтобы не перегрузить вопрос текстом, но могу это сделать, если попросить создать минимальную рабочую программу):
GLuint GeneralBufferObject; программа GLuint; ГЛуинт вао; /* Определить позиции вершин в однородных координатах */ GLfloat vertexPositions[] = { 0,75ф, 0,75ф, 0,0ф, 1,0ф, 0,75f, -0,75f, 0,0f, 1,0f, -0,75f, -0,75f, 0,0f, 1,0f, }; /* Определить массив цветов */ GLfloat vertexColours[] = { 1.0ф, 0.0ф, 0.0ф, 1.0ф, 0.0ф, 1.0ф, 0.0ф, 1.0ф, 0.0ф, 0.0ф, 1.0ф, 1.0ф, }; использование пространства имен std; void init(GLWrapper* glw) { // Генерируем индекс (имя) для одного объекта массива вершин glGenVertexArrays(1, &vao); // Создаем объект массива вершин и делаем его текущим glBindVertexArray (вао); // Генерируем имя для объекта буфера вершин glGenBuffers(1, &generalBufferObject); glBindBuffer (GL_ARRAY_BUFFER, GeneralBufferObject); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions) + sizeof(vertexColours), NULL, GL_DYNAMIC_DRAW); // Заполняем буфер { xyzxyzxyz rgbrgbrgb } glBufferSubData (GL_ARRAY_BUFFER, 0, sizeof (vertexPositions), вершинные позиции); glBufferSubData (GL_ARRAY_BUFFER, sizeof (vertexPositions), sizeof(vertexColours), vertexColours); // Сообщаем шейдерам, где искать координаты и цвета вершин glEnableVertexAttribArray (0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray (1); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)sizeof(vertexPositions)); glDisableVertexAttribArray (0); glDisableVertexAttribArray (1); // Отвязываем VBO и VAO glBindBuffer (GL_ARRAY_BUFFER, 0); glBindVertexArray (0); пытаться { // вызов оболочки программа = glw->LoadShader("vert_attrib.vert", "vert_attrib.frag"); } catch (исключение& e) { cout
Мобильная версия