С помощью 2D-приложения iPhone OpenGL ES 1.1, как заставить мой буфер глубины работать для текстур? - PullRequest
0 голосов
/ 22 ноября 2011

Я делаю 2D видеоигру.Сейчас у меня не так много спрайтов и одна текстура без буфера глубины работает нормально.Но когда я расширяюсь до нескольких текстур, я хочу использовать буфер глубины, чтобы мне не приходилось делать несколько проходов по одной и той же текстуре и чтобы мне не приходилось организовывать свои текстуры с учетом каких-либо ограничений глубины.

Когда я пытаюсь заставить работать буфер глубины, я могу получить только пустой экран с правильным чистым цветом.Я собираюсь объяснить свою рабочую настройку без буфера глубины и перечислю вопросы, которые у меня есть для обновления до буфера глубины:

  • Сейчас мои вершины имеют только позицию (x, y) икоординаты текстуры (x, y).Больше ничего нет.Нет освещения, нет нормалей, нет цвета и т. Д. Правильно ли, что единственное обновление, которое я должен сделать здесь, это добавить координаты az к моей позиции?

  • Сейчас я использую:

glOrthof(-2, 2, -3, 3, -1, 1);

это работает без буфера глубины.Но когда я добавляю буфер глубины, я думаю, что мне нужно изменить ближние и дальние значения.Что я должен изменить их?

  • Прямо сейчас для моего glTexImage2D () я использую:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

когда я добавляю буфер глубины, я должен изменитьлюбой из этих аргументов?

  • При моем вызове glClearDepthf();, я должен использовать одно из ближайших или дальних значений, которые я использую в своем вызове glOrthof ()?какой?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Поскольку вы работаете с 2D и орто, я обнаружил, что это помогает иметь видовой экран с координатами, которые соответствуют вашему разрешению, так что это сделает вещи более читабельными:

CGRect rect = self.view.bounds;
if (ORTHO) {
    if (highRes && (retina == 1)) {
        glOrthof(0.0, rect.size.width/2, 0.0 ,  rect.size.height/2, -1, 1000.0);
    } else {
        glOrthof(0.0, rect.size.width, 0.0 ,  rect.size.height, -1, 1000.0);    
    }
    glViewport(0, 0, rect.size.width*retina, rect.size.height*retina);
} 

Обратите внимание, что я всегда использую координаты 320x480даже на сетчатке я могу использовать одни и те же координаты для обоих res, и .5 даст мне идеальный пиксель на сетчатке, но вы можете пойти другим путем.

Что касается глубины, я использую -1 для1000 глубины, так что я могу нарисовать до -1000 Z.

Убедитесь, что вы правильно связываете буфер глубины, что-то вроде этого:

    // Need a depth buffer
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,  framebufferWidth, framebufferHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

Или ваша проблема может быть настолько простойиспользуя глубину, которая находится позади вашей камеры и освещается или больше, чем ваш буфер, попробуйте использовать глубину от 0 до -1 (-0,5 для примера), с моим glOrthof вы можете подняться до -1000;

РЕДАКТИРОВАТЬ

Значения в glOrthof для ближнего и дальнего указывают количество (расстояние), а не координаты, это может сбивать с толку при указании значений глубины.Когда вы указываете 1000 для дальнего параметра, мы на самом деле говорим, что дальняя плоскость отсечения находится на расстоянии 1000 единиц от наблюдателя, то же самое с ближним полем, к сожалению, указание плоскости отсечения позади зрителя будет принимать отрицательные значения, что способствуетдо путаницы.

Так что, когда приходит время рисования, у нас есть отсеченная плоскость, которая находится в 1000 единицах от зрителя впереди (далеко или в экран), с точки зрения координат Z отрицательно, когда ниже плоскости просмотра (на экран)На самом деле наш мир рисования находится между Z = 1 и Z = -1000, что составляет -1000 - самое дальнее, что мы можем пройти с этими параметрами.

0 голосов
/ 22 ноября 2011

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

  • Порядок, чтобы они были добавлены на экран
  • Значение Z, настроенное пользователем, чтобы вы могли менять их при необходимости
...