Параллакс-фоны в OpenGL ES на iPhone

У меня в основном 2d-игра на iPhone, и я пытаюсь настроить несколько фонов, которые прокручиваются с разной скоростью (известные как фоны параллакса).

Поэтому я подумал, что нужно просто прикрепить фон ЗА ПРЕДЕЛАМИ переднего плана, используя разные плоскости с координатами z, и просто сделать их больше, чем передний план (по размеру), чтобы их можно было разместить, чтобы все это можно было прокручивать (только с другой скоростью).

И (насколько мне известно) я в основном это реализовал. Единственная проблема в том, что он, кажется, полностью игнорирует любое значение z, которое я ему даю, или, скорее, просто обнуляет их все. Я вижу фон (до сих пор я тестировал только ОДИН фон, чтобы было проще ... так что пока у меня есть только передний план, и я хочу, чтобы один фон прокручивался с другой скоростью), но он прокручивает 1: 1 с моим на переднем плане, поэтому он явно не выглядит правильным, и большая его часть обрезана (потому что он больше). И я пробовал разные z-значения для фона и различные ближние / дальние плоскости отсечения ... всегда одно и то же. Я, наверное, просто делаю одну простую вещь неправильно, но не могу этого понять. Мне интересно, связано ли это с тем, что я использую только 2 координаты в glVertexPointer для переднего плана? (Конечно, для фона я прохожу в 3)

Я отправлю код:

Это некоторая начальная настройка:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

//transparency
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

Немного о моем массиве с плавающей запятой на переднем плане ... он чередуется. Для моего переднего плана это вершина x, вершина y, текстура x, текстура y, повтор. Все это прекрасно работает.

Это мой FOREGROUND-рендеринг:

glVertexPointer(2, GL_FLOAT, 4*sizeof(GLfloat), texes); <br>
glTexCoordPointer(2, GL_FLOAT, 4*sizeof(GLfloat), (GLvoid*)texes + 2*sizeof(GLfloat)); <br>
glDrawArrays(GL_TRIANGLES, 0, indexCount / 4);

ФОНОВЫЙ рендеринг:

То же упражнение здесь, за исключением того, что на этот раз идет вершина x, вершина y, вершина z, текстура x, текстура y, повторение. Обратите внимание на значение z на этот раз. Я убедился, что данные в этом массиве верны во время отладки (получение правильных значений z). И снова оно появляется ... просто не уходит далеко-далеко, как должно.

glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), b1Texes);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), (GLvoid*)b1Texes + 3*sizeof(GLfloat));
glDrawArrays(GL_TRIANGLES, 0, b1IndexCount / 5);

И чтобы переместить камеру, я просто делаю простой glTranslatef (x, y, 0.0f);

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


person Community    schedule 20.04.2010    source источник
comment
Вы включили depthBuffering?   -  person Till    schedule 20.04.2010
comment
Для добавления буфера глубины см. Здесь memention.com/blog/2009/ 10 августа / Think-deep.html   -  person epatel    schedule 20.04.2010


Ответы (3)


Выстрел в темноте...

Возможно, вам придется забыть настроить буферизацию глубины в инициализаторе фреймбуфера.

Скопируйте и вставьте из старых шаблонов Apple EAGLView:


    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

person Till    schedule 20.04.2010
comment
Я действительно использую этот шаблон. Я тестирую iPhone OS 2.2.1, и у меня есть SDK 3.0 или что-то в этом роде. Написанный вами код встроен в оператор if (USE_DEPTH_BUFFER), и у меня есть USE_DEPTH_BUFFER # define'd как 1. Я также отлаживал и удостоверился, что этот код вызывается. Все еще в тупике, но спасибо за предложение. Я что-то забыл? - person ; 20.04.2010

Если вы зависите от смешивания, вы должны рисовать в порядке глубины, то есть сначала рисовать самый дальний (самый глубокий) слой. В противном случае они будут покрыты слоем сверху, поскольку значение z-буфера записывается, даже если область прозрачна на 100%.

См. здесь

person epatel    schedule 21.04.2010

Я понял, что использую ортогональные проекции, которые не могут отображать объекты, находящиеся дальше (пожалуйста, поправьте меня, если я ошибаюсь). Когда я пробовал glFrustum ранее (как я уже говорил в своем вопросе), я делал что-то не так с его настройкой. Я использовал отрицательное значение для значения, близкого к отсечению, и в основном у меня возникла проблема с прокруткой 1: 1, такая же, как и при орфографической. Но я изменил это значение на 0,01, и, наконец, он начал правильно отображаться (фон отображается дальше).

Моя проблема решена, но теперь мне интересно, могу ли я смешать орфографию и перспективу в одном кадре и что для этого потребуется. Потому что я бы предпочел, чтобы передний план был очень простым и ортогональным (2d), но я хочу, чтобы мой фон отображался с глубиной перспективы.

Моя идея была примерно такой:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f);

//render foreground

glLoadIdentity();
glFrustum(-1.0f, 1.0f, -1.5f, 1.5f, 0.01f, 1000.0f);

//render backgrounds

Я поэкспериментирую с этим и прокомментирую свои результаты, если кому-то будет интересно. Мы будем благодарны за обратную связь по этому поводу, хотя технически у меня больше нет насущной необходимости в этом вопросе (с этого момента это будет просто обсуждение идеи).

person Community    schedule 22.04.2010