РЕДАКТИРОВАТЬ: я взял 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все работает как положено, моя сцена корректно отображается на текстуре.Так что я думаю, проблема в том, как я прикрепляю текстуру, или, может быть, в порядке, в котором я делаю вещи?