Я использую 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
выше.
Предполагая, что это весь код установки FBO, я не вижу той части, где вы звоните glCheckFramebufferStatus
. Вы знаете, функция, которая сказала бы вам, что ваш Объект Framebuffer был неполным, и, следовательно, рендеринг к нему потерпит неудачу.
В частности, это дало бы вам GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
потому что вы не установили правильный буфер рисования. Если вы не используете цветное вложение, вам нужно использовать glDrawBuffer
установить все записи в буфер цвета GL_NONE
,
Это обычная ошибка FBO; ты не будешь первым, кто этого не видел. Но именно поэтому жизненно важно всегда проверять glCheckFramebufferStatus
после того, как вы измените свой FBO.
Других решений пока нет …