Фоны параллакса в OpenGL ES на iPhone - PullRequest
1 голос
/ 20 апреля 2010

У меня есть в основном двумерная игра на 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);

Немного о массиве float моего переднего плана ... оно чередуется. Для моего переднего плана это вершина х, вершина у, текстура х, текстура у, повтор. Все это прекрасно работает.

Это мой предварительный рендеринг:

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 просто для удовольствия, но безуспешно). Пожалуйста, помогите, я чувствую, что это всего лишь одна глупость. Я опубликую больше кода при необходимости.

Ответы [ 3 ]

0 голосов
/ 21 апреля 2010

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

См. здесь

0 голосов
/ 22 апреля 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

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

0 голосов
/ 20 апреля 2010

Снято в темноте ...

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

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


    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);

...