Я смущен о VBO и современном openGL. В конце этого поста есть прямой вопрос, затем на пути есть пучок. Если у вас есть какой-либо смысл в этом, я был бы благодарен за ответ. И если вы ответите, пожалуйста, рассматривайте меня как завершающего идиота, без какого бы то ни было знания.OpenGl> v3, 2d эффективный рендеринг игры
Итак, моя история такова:
У меня есть игра, которая сверху вниз 2d игры. Я использовал режим immideate для рендеринга 2d спрайтов. Фактические координаты текстуры моих атласов текстуры были статичными и предопределены в отдельном классе. Квадратные координаты были определены в каждом объекте и обновлены по мере продвижения игры. Когда я создавал, я просто привязывал определенную текстуру, называемую glBegin (треугольники), а затем вызывал каждый метод визуализации видимых объектов. Это, в свою очередь, отправило координаты quad и texure в мой класс Renderer, что вызвало вызовы openGl. Затем я очистил текстуру, которая вызывает только glEnd().
Я сделал это для всех разных атласов и в порядке, чтобы получить необходимую глубину.
Но времена действительно меняются. Я хочу перейти к использованию VBO и шейдеров. Я несколько раз пробовал в прошлом, но провалился с ошибкой. Есть всего несколько вещей, которые я не могу найти в google, чтобы дать мне полное представление об этом, и как я могу использовать его для ускорения моей игры.
Я знаю основы. Вместо того, чтобы отправлять всю информацию по шине в gpu каждый вызов рендеринга, я могу просто сохранить все, что мне нужно на этапе инициализации, а затем использовать шейдеры для вычисления конечного результата. Но ...
У меня есть идея для координат текстуры. Они будут статичными, поскольку они никогда не изменятся. Это обеспечило бы сохранение их на графическом процессоре. Но как узнать, какие координаты соответствуют каждому QUAD/TRIANGLE. Я думаю, что вместо четырех поплавков каждый рендерируемый объект в игре может иметь какой-то индекс, который он передает как атрибут вершинному шейдеру. вершинный шейдер использует индекс для поиска четырех координат текстуры в VBO. Является ли это приемлемым решением? Как бы вы реализовали что-то подобное?
Но что касается четырех вершин, я потерян. Они будут постоянно перемещаться. Они будут видимыми, затем исчезнут и т. Д. Это означает, что мой квадратный VBO изменится при каждом вызове рендеринга, а код, который я видел, обновляет VBO довольно уродливо. Я видел что-то вроде:
- хранить 4 квадратных координаты в массиве.
- создать флоатбуфер, положить их туда
- управлять буфером.
- отправить буфер в VBO
Выглядит довольно дорого для меня. И я не понимаю, как я могу удалить определенную запись (если объект выходит из экрана и т. Д.), И как я могу манипулировать определенной записью (объект перемещается). И если мне нужно обновить VBO таким образом, что каждый вызов рендеринга, какой прирост производительности? Выглядит больше как потеря для меня ...
Также, как я могу отслеживать «глубину» полученного изображения. Я делаю 2d, но с «глубиной» я подразумеваю порядок рендеринга, например. убедившись, что object2 отображается поверх объекта1. Возможно, другой VBO для каждой глубины? Или я должен использовать z-координату для этого и энтузиастов глубины. Неужели последний не даст ударный удар?
Также есть 2-й коэффициент.Я очень уважаю 3d, но я хочу использовать 2d и воспользоваться тем, что теоретически это должно обеспечить лучшую производительность. Однако, из того, что я собрал, это, похоже, не так. В opengl 3+ Кажется, что для того, чтобы я мог сделать 2d, мне нужно сначала перенести его в 3d, так как это то, что происходит в harware. Кажется странным для меня, так как конечный результат на экране 2d. Есть ли способ обойти это, и сохранить GPU работу 2d -> 3d -> 2d?
Другими словами, как я могу изменить эффективности оборудования:
class main{
void main(){
while(true){
Renderer.bind();
//call render in all gameObjects
Renderer.flush();
}
}
}
class GameObject{
private float X1, X2, Y1, Y2;
private TexureCoordinate tex;
render(float dt){
//update X1, X2...
Renderer.render(tex.getX1(), tex.getX2()... X1, X2 ...);
}
}
class Renderer{
//called once
void bind(Texture texture){
texture.bind();
glBegin(GL_TRIANGLES)
}
//called "nr of visable objects" times
void render(texX1, texX2, texY1, texY2, quadX1, quadX2, quadY1, quadY2){
glTexCoo2d(texX1, texY1)
....
etc.
....
}
void flush(){
glEnd();
}
}
В то, что использует современный OpenGL?
Это очень хорошее разъяснение, спасибо. Просто некоторые последующие вопросы: – Jake
Как эффективно изменить свой VBO. Полагаю, мне следует использовать GL_STREAM_DRAW? Если я использую glBufferSubData, как узнать, какие Vertecies заменены, а какие нет? Как стереть весь shabang и загрузить совершенно новый контент? – Jake
И, как насчет глубины. Будут ли рисовать четвероны в том же порядке, что и я, помещаю их в VBO? – Jake