iPhone Dev: Render Depth Buffer to Texture приводит к черной текстуре - PullRequest
0 голосов
/ 12 сентября 2011

РЕДАКТИРОВАТЬ: я взял FBO из уравнения, чтобы убедиться, что проблема не возникнет, поэтому сейчас я просто делаю следующее:

настройка текстуры:

GLuint FB0Texture;
glGenTextures(1, &FB0Texture);
glBindTexture(GL_TEXTURE_2D, FB0Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, size.width, size.height, 
                 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);

а затем отрендерить:

[self drawScene];

[(EAGLView *)self.view bindFB0];

glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 320, 480);

[self drawFullScreenQuad]; (it's actually not full screen so I can see both the 3d scene and the resulting texture)

и я получу те же результаты!Черная текстура, если я устанавливаю FB0Texture как текстуру "DEPTH_COMPONENT", но обычную сцену, если я устанавливаю FB0Texture как обычную текстуру GL_RGBA ...

Так что я полагаю, что я либо неправильно настраиваю текстуру глубины, либоВозможно, я делаю что-то неправильно при рендеринге, что приводит к тому, что текстура RGBA выглядит нормально, но текстура глубины прикручивается?GL_DEPTH_TEST включен и работает нормально (модели выглядят правильно), так что я думаю, что нет ничего плохого в реальном рендеринге, но на данный момент я отчаянно нуждаюсь в подсказках ...

Пожалуйста, помогите!

// КОНЕЦ РЕДАКТИРОВАНИЯ

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

Итак, что я делаю:

  • настройка буфера кадров по умолчанию, присоединение буфера рендеринга цвета и буфера рендеринга глубины
  • настройкановый кадровый буфер (назовите его FB0), прикрепите текстуру к компоненту глубины

Затем, когда я рендерим:

  • отрисовываем сцену с переключателем FB0
  • по умолчанию кадровый буфер
  • рисует полноэкранный четырехугольник, используя FB0 в качестве текстуры

И я получаю ... ничего!(хорошо, я получаю полностью белую текстуру)

Если я присоединяю текстуру к цветному компоненту FB0 вместо компонента глубины, все работает нормально, как в случае рисования сцены в FB0, затем использую FB0 в качестветекстуры, чтобы нарисовать четырехэкранный полноэкранный режим, и я вижу именно то, что увидел бы, если бы рисовал непосредственно в кадровый буфер по умолчанию.

Однако, когда я присоединяю текстуру к компоненту глубины, все, что я получаю, это белый экран / текстура.

Некоторый код:

буферы настройки:

// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);

// Create depth render buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 320, 480); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);


// Create Depth Map Frame Buffer

glGenFramebuffers(1, &FB0);
glBindFramebuffer(GL_FRAMEBUFFER, FB0);

// Attach texture to depth component        

glGenTextures(1, &FB0Texture);
glBindTexture(GL_TEXTURE_2D, FB0Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.width, size.height, 
                 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, 
                       GL_DEPTH_ATTACHMENT, 
                       GL_TEXTURE_2D, 
                       FB0Texture, 
                       0);

Если после этого я проверяю состояние кадровых буферов, я не получаю сообщений об ошибках, поэтому я предполагаю, что буферы созданы правильно.

Затем при рендеринге:

[(EAGLView *)self.view setFB0]; (just binds the framebuffer)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[self drawScene];

[(EAGLView *)self.view setFramebuffer]; (binds back the default frame buffer)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[(EAGLView *)self.view bindFB0Texture];

[self drawFullScreenQuad];

[(EAGLView *)self.view presentFramebuffer];

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

Опять же, если я прикреплю FB0Texture к GL_COLOR_ATTACHMENT0 вместо GL_DEPTH_ATTACHMENTвсе работает как положено, моя сцена корректно отображается на текстуре.Так что я думаю, проблема в том, как я прикрепляю текстуру, или, может быть, в порядке, в котором я делаю вещи?

1 Ответ

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

Ваша проблема может заключаться в том, что вы ТОЛЬКО присоединяете текстуру глубины к рендеру к текстурному FBO, а также не присоединяете цветовой буфер.

Если это не сработает, Apple предлагает в своей технической документации использовать GL_OES_depth_texture , но я не смог сделать это самостоятельно с точки зрения Глубина рендеринга в текстуру, хотя ее использование, по-видимому, значительно улучшает точность проверки глубины для цветного изображения рендеринга в текстуру, которое я получаю.

Редактировать: Упс, это то, что вы уже делаете. Извините, я должен прочитать вопрос более внимательно.

В настоящее время я тоже испытываю эту проблему, поэтому, если бы она была решена, мне бы хотелось узнать, как!

РЕДАКТИРОВАТЬ # 2: Я решил проблему в моей собственной ситуации. Буфер глубины хранит глубины в нелинейном пространстве, поэтому необходимо преобразовать глубины обратно в линейное пространство, чтобы правильно их визуализировать (это может быть достигнуто с помощью информации о проекции ближней и дальней плоскости). Проблема, с которой я столкнулся, заключалась в том, что большая часть информации о моей глубине хранилась в диапазоне от 0,995 до 1,0, что означало, что на мой взгляд это была полностью белая текстура. Это может быть проблема, с которой вы сталкиваетесь, когда получаете белую текстуру.

В качестве примечания, великолепная функция снимка OpenGL ES в Xcode 4.2 помогла мне решить проблему. Это позволяет вам визуализировать всю текстуру и визуализировать буферные объекты в вашем контексте, и даже изменяет цвет для вас, если данные нелинейны. Это, как вы можете догадаться, это то, как я понял это.

...