Объекты Android OpenGL ES Framebuffer – отображение глубины-буфера текстуры

Я использую Android-устройство под управлением Froyo, поддерживающее OpenGL ES 1.1 и OpenGL ES 2.0

Я хочу сделать буфер глубины текстурой. Увидев ряд примеров OpenGL, OpenGL ES на других платформах (включая iPhone), я попробовал несколько конфигураций FBO.

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

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

Есть ли простой пример настройки OpenGL ES FBO на Android для отображения глубины текстуры? Кроме того, есть ли документ, описывающий, что есть и не поддерживается?


Спасибо за комментарии – я специально нуждался в решении для ES 1.1, если его можно было найти и работать на Android. Я также хочу взглянуть на ES 2 – я не уверен, что понимаю идею упаковки информации о глубине в цветовой буфер. У вас есть ссылка, на которую я могу взглянуть, чтобы лучше понять идею?

Что касается кода – мой источник практически не отличается от ссылки, опубликованной выше. Статус Framebuffer заключается в том, что он не является полным.


Спасибо за предложение шейдера фрагмента – я понял эту идею сейчас. Посмотрите на это, если я не смогу заставить другое решение работать. Мой идеал состоит в том, чтобы одновременно получать глубину и цвет – на самом деле не хотите отдельно выделять цвет и глубину, если я могу помочь.

Solutions Collecting From Web of "Объекты Android OpenGL ES Framebuffer – отображение глубины-буфера текстуры"

Хорошо, ответ. Получил это, чтобы работать на Android 2.2 с OpenGL ES 2:

// Create a frame buffer glGenFramebuffers( 1, &(frame_buffer ) ); // Generate a texture to hold the colour buffer glGenTextures(1, &(colour_texture) ); glBindTexture(GL_TEXTURE_2D, colour_texture); // Width and height do not have to be a power of two glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixelWidth, pixelHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Probably just paranoia glBindTexture(GL_TEXTURE_2D, 0); // Create a texture to hold the depth buffer glGenTextures(1, &(depth_texture) ); glBindTexture(GL_TEXTURE_2D, depth_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, pixelWidth, pixelHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer); // Associate the textures with the FBO. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colour_texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0); // Check FBO status. GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if ( status == GL_FRAMEBUFFER_COMPLETE ) { // Success } 

Довольно тривиально, следуйте руководству OpenGL ES2 и делайте все в правильном порядке.

Пробовал это с помощью OpenGL ES 1.1, добавляя OES к требуемым вызовам функций и _OES для констант, поскольку объекты буфера кадра являются расширением. Любая попытка прикрепить текстуру глубины к буфере кадра приводит к получению незавершенного объекта буфера кадра.

Поэтому на данный момент я пришел к выводу, что это не работает с OpenGL ES 1.1 на Android, но он явно работает с ES 2.2.

Если у кого-то есть решение для ES 1.1, было бы интересно это увидеть.

Рендеринг текстуры глубины не поддерживается на многих устройствах. Вам нужно будет приложить буффер для буфера глубины.