рендеринг буфера глубины в текстуру с использованием кадрового буфера

Я использую JOGL, но этот вопрос относится к OpenGL в целом. Похоже, что подобные вопросы лежат вокруг, но они либо направлены на код GLSL, либо связаны с копированием содержимого буфера кадров, либо являются общим советом — используйте объекты буфера кадров вместо glCopyTexSubImage2D,

Вопрос

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

Можете ли вы опубликовать блок кода, который инициализирует текстуру и объект буфера кадра, а также код, который инициализирует все перед рендерингом сцены?

В настоящее время я использую glCopyTexSubImage2D, Я инициализирую текстуру так:

glGenTextures(1, &textureNo)
glBindTexture(GL_TEXTURE_2D, textureNo)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL)
glTexParameterf(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY)
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 2048, 2048, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, null)

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

glBindTexture(GL_TEXTURE_2D, textureNo)
glClear(GL_DEPTH_BUFFER_BIT)
drawScene()
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2048, 2048)

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

Что мне нужно изменить выше, чтобы визуализировать непосредственно в текстуру, вместо этого используя объект буфера кадра?

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

Вот что я попробовал. Сначала я инициализировал объект буфера кадра:

glGenFramebuffers(1, &fbo)

Затем я сделал так:

glBindFramebuffer(GL_FRAMEBUFFER, fbo)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureNo, 0)
glBindTexture(GL_TEXTURE_2D, textureNo)
drawScene()

Я подтвердил, что вышеупомянутое работает для текстур типа GL_RGB а также GL_COLOR_ATTACHMENT0, но это не похоже на работу для GL_DEPTH_COMPONENT введите текстуры и GL_DEPTH_ATTACHMENT — канал глубины не визуализируется в текстуру textureNo выше.

2

Решение

Предполагая, что это весь код установки FBO, я не вижу той части, где вы звоните glCheckFramebufferStatus. Вы знаете, функция, которая сказала бы вам, что ваш Объект Framebuffer был неполным, и, следовательно, рендеринг к нему потерпит неудачу.

В частности, это дало бы вам GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER​потому что вы не установили правильный буфер рисования. Если вы не используете цветное вложение, вам нужно использовать glDrawBuffer установить все записи в буфер цвета GL_NONE,

Это обычная ошибка FBO; ты не будешь первым, кто этого не видел. Но именно поэтому жизненно важно всегда проверять glCheckFramebufferStatus после того, как вы измените свой FBO.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]