Место возникновения ошибки opengl (VBO)

Версия Minecraft
1.11.2
1,015
9
102
У меня майн начал флудить вот этим:
Код:
########## GL ERROR ##########
@ Post render
1282: Invalid operation

Это, кончено, очень информативно, но можно ли как-нибудь более подробнее узнать об ошибке? Например, откуда она исходит? У меня код довольно большой, и поэтому просматривать и тестить каждую строку желания нет
 
1,015
9
102
RE: Место возникновения ошибки opengl

WhiteWarrior написал(а):
Может это вообще не твоя ошибка. В майне, при нажатии на ESC иногда проскакивает пост рендер...

Не, это происходит без нажатия на ESC. Эт я чёт с VBO намутил. Через дебаг режим я промотал свой рендер, и ошибка не выскочила. Я наверн "что-то не то "вызвал" и всё сломалось"
 
1,015
9
102
RE: Место возникновения ошибки opengl

Так, я вырезал вот этот кусок, и ошибка исчезла. Что тут не так?
Код:
           int[] vertices = getVertices();
            IntBuffer buffer = BufferUtils.createIntBuffer(vertices.length);
            buffer.put(vertices).flip();
            glBindVertexArray(vaoID);
            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW);
            glVertexAttribIPointer(0, 3, GL_INT, 0, 0);
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glBindVertexArray(0);
 
476
9
39
RE: Место возникновения ошибки opengl

Я сейчас скажу очень информативную вещь. Сорри за это. При порте с 1.7.10 одного чужого мода я видел в openGL сей эффект 1282, в новый версиях его можно вызвать только через static final переменную openGL'a, хотя скорее всего в движке можно найти. В новом GLStateManager'e не помню для чего она использовалась, но вроде в гуишке какого-то блока печки что ли. Ну хз. Надеюсь поможет.
 
1,990
18
105
RE: Место возникновения ошибки opengl

Забыл glEnableVertexAttribArray?
--
Без вызова кода отрисовки, ошибка, наверное, вылезать не должна. Но если ты потом что-то рисуешь, используя эту вбошку - то это наверняка оно.

Да, и, насколько я себе представляю, анбиндить буфер надо после выключения vao.
 
1,015
9
102
RE: Место возникновения ошибки opengl

Oldestkon написал(а):
Забыл glEnableVertexAttribArray?
Его вроде же при отрисовки надо врубать. Вот как я делаю. Сначала 1 раз генерирую vao и vbo
Код:
        vaoID = glGenVertexArrays();
        vboID = glGenBuffers();

Потом через определенный период времени обновляю их вот таким способом
Код:
            int[] vertices = getVertices();
            size = vertices.length;
            IntBuffer buffer = BufferUtils.createIntBuffer(vertices.length);
            buffer.put(vertices).flip();
            glBindVertexArray(vaoID);
            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW);
            glVertexAttribIPointer(0, 3, GL_INT, 0, 0);
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glBindVertexArray(0);

И далее отрисовываю каждый кадр
Код:
            glBindVertexArray(vaoID);
            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glEnableVertexAttribArray(0);
            glDrawArrays(GL_QUADS, 0, size);
            glDisableVertexAttribArray(0);
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glBindVertexArray(0);

Мне кажется, что я что-то не так делаю
 
1,990
18
105
RE: Место возникновения ошибки opengl

1) Сначала заставь это работать без VAO
2) Во время отрисовки надо вызывать если ты не используешь VAO, vao же запоминает этот стейт и автоматически применяет его когда биндится, и точно так же запоминает забинденный буфер, поэтому тебе не надо его снова биндить перед отрисовкой, в случае использования vao
3) В качестве size надо передавать количество отрисовываемых _вершин_, а ты, как я понимаю, передаешь размер данных в интах.

P.S. Если ты делаешь VBO ради отрисовки той карты в худе из соседней темы, я бы на твоем месте просто использовал дисплейлисты - они неплохо работают и очень легко встраиваются в код, пока ты не делаешь это из другого контекста, а преимуществ VBO на таком малом количестве данных не будет никаких.
---
Чуть подкорректировал сообщение, а то ляпнул кое-что неаккуратно
 
1,015
9
102
RE: Место возникновения ошибки opengl

Oldestkon написал(а):
P.S. Если ты делаешь VBO ради отрисовки той карты в худе из соседней темы, я бы на твоем месте просто использовал дисплейлисты - они неплохо работают и очень легко встраиваются в код, пока ты не делаешь это из другого контекста, а преимуществ VBO на таком малом количестве данных не будет никаких.

Когда я юзал дисплей листы, а резал ту карту на куски по Y. Т.е. если бы радиус был бы 10, то кусков было бы 20 и они бы компилились каждый в своем кадре. Когда я это тестил, то фризов не было. FPS скакал как синусоида, а когда я ставил обновление карты 1 раз в 5 тиков, и выставлял большой радиус, то он был почти такой же, как и с тесселятором. VBO я хочу сделать, ибо можно будет создать новый поток и им заполнять буффер вершин.

Кстати я убрал VAO, начал передавать кол-во вершин, вместо кол-во интов в массиве и еще понял, что если я врублю перед рендером glEnableVertexAttribArray(0), то майн на этом месте и крашнится. Ошибок нет, но ничего не рендрится

Обновление
Код:
            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW);
            glBindBuffer(GL_ARRAY_BUFFER, 0);

Рендер
Код:
            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glEnableClientState( GL_VERTEX_ARRAY );
            glVertexPointer(3, GL_INT, 0, 0);
            glDrawArrays(GL_QUADS, 0, size);
            glDisableClientState(GL_VERTEX_ARRAY);
            glBindBuffer(GL_ARRAY_BUFFER, 0);
 
1,990
18
105
RE: Место возникновения ошибки opengl

Хм, прочитал, что glEnableVertexAttribArray требует наличия забинженного VAO. У меня работало и так :v
Попробуй отключать GL_TEXTURE_2D перед отрисовкой, если ошибок нет. Не вижу, чтобы ты передавал текстурные координаты.
Насчет фризов: странно, майн много версий "отлично" жил со сборкой чанков в дисплейлисты. Разве что у тебя очень много данных, если не отсекаешь ненужные фейсы, как майн.
 
1,990
18
105
RE: Место возникновения ошибки opengl

Например, закинуть все uv'шки в ту же VBO.
Тебе нужно менять формат данных. Варианта два:
1) Можно сделать interleaved VBO, где данные будут чередоваться каждую вершину:
VVVCCCUUUVVVCCCUUU (позиция, цвет, если нужен, uv)
2) Либо закинуть сначала все позиции, потом все данные цвета, потом uv, получается VVVV..CCCC..UUUU.
На самом деле, для твоей задачи, имхо, не суть.
Выбирай какой тебе удобнее. Придется менять то, что указываешь в glVertex/Texture/ColorPointer, думаю, разберешься.
Ну, и, соотв-но нужно включать нужный client state перед отрисовкой.
Вариант с разными VBO не рассматриваю, т.к. пользы мало, у тебя все равно все данные меняются каждый раз.

Для примера можешь глянуть Tessellator, в майне был написан код для VBO.
Ну и гугл, всемогущий гугл хранит в себе много полезного.
 
2,505
81
397
RE: Место возникновения ошибки opengl

Oldestkon написал(а):
а преимуществ VBO на таком малом количестве данных не будет никаких.
А как же ассинхронное обновление через glMapBuffer?
 
1,015
9
102
RE: Место возникновения ошибки opengl

Dahaka написал(а):
Oldestkon написал(а):
а преимуществ VBO на таком малом количестве данных не будет никаких.
А как же ассинхронное обновление через glMapBuffer?

Ради этого и делаю VBO
 
1,990
18
105
RE: Место возникновения ошибки opengl

Dahaka написал(а):
Oldestkon написал(а):
а преимуществ VBO на таком малом количестве данных не будет никаких.
А как же ассинхронное обновление через glMapBuffer?

В соседней теме автор сказал что не будет это делать, вот я и решил, что о другом потоке речь не идет)
И я правда не понимаю, что за проблемы там возникают с дисплейлистами. Не верю, что на таком куске карты много данных.
 
1,990
18
105
Можно закидывать байтом и нормализовать (в glVertexAttribPointer есть параметр normalize). Тип - GL_UNSIGNED_BYTE.
Насчет RGB\RGBA - не знаю, но, наверное, если указать как кол-во элементов 3, то оно воспримет это как RGB.
По-хорошему - надо писать свой шейдер, который ты точно знаешь как работает и воспринимает переданные тобой данные.
 
Сверху