Рендеринг в 3D-текстуру с помощью OpenGL на OSX (вложение многослойного фреймбуфера)

У меня есть контекст OpenGL 3.2 CORE на OSX 10.7.5, настроенный и пытающийся визуализировать 3D-текстуру, используя подход многоуровневого рендеринга. Функция геометрического шейдера "gl_layer" поддерживается, но я не могу привязать GL_TEXTURE_3D к своему прикрепленному буферу кадра. Он возвращает GL_FRAMEBUFFER_UNSUPPORTED.

Это версия карты и драйвера в моем MBP:

AMD Radeon HD 6770M 1024 МБ — OpenGL 3.2 CORE (ATI-7.32.12)

Эта функция не имеет прямого отношения к конкретному расширению AFAIK. Кто-нибудь знает, как выяснить, не поддерживается ли это драйвером или оборудованием? Огромное спасибо.

Ниже код для восстановления. Я использую glfw для настройки контекста:

// Initialize GLFW
if (!glfwInit())
    throw "Failed to initialize GLFW";

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

// Open a window and create its OpenGL context
if (!glfwOpenWindow(720, 480, 8, 8, 8, 8, 24, 8, GLFW_WINDOW))
    throw "Failed to open GLFW window";

//
// ...
//

GLuint framebuffer, texture;
GLenum status;
glGenFramebuffers(1, &framebuffer);
// Set up the FBO with one texture attachment
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 256, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);
status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
    throw status;
//
// status is GL_FRAMEBUFFER_UNSUPPORTED here !!!
//

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDeleteTextures(1, &texture);
glDeleteFramebuffers(1, &framebuffer);
exit(1);

person FHoenig    schedule 28.10.2012    source источник


Ответы (1)


Кто-нибудь знает, как выяснить, не поддерживается ли это драйвером или оборудованием?

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

Когда это происходит, вы мало что можете сделать, кроме как попробовать другие вещи. Возможно, рендеринг в текстуру 2D-массива.

person Nicol Bolas    schedule 28.10.2012
comment
Похоже, ни TEXTURE_2D_ARRAY, ни кубическая карта не работают. только 2D текстуры. Это кажется странным, потому что многоуровневый рендеринг поддерживается расширением шейдера геометрии, которое является частью 3.2 CORE. Какая тогда останется многоуровневая цель рендеринга? - person FHoenig; 28.10.2012
comment
@FHoenig: Кубические карты. В конечном счете, реализация может наложить вето на все, что ей не нравится по произвольным причинам. Эти вещи работают в Windows и Linux (конечно, это не совсем полезно для вас), так что это не аппаратная проблема. - person Nicol Bolas; 28.10.2012
comment
@FHoenig: Ничего. Как я уже сказал, реализация не обязана позволять вам использовать что-либо, что ей не хочется. Вот для чего нужен GL_FRAMEBUFFER_UNSUPPORTED. Конечно, его не предполагается использовать таким образом, но спецификация OpenGL это позволяет. При этом вы уверены, что получаете отказ от поддержки, а не какой-то другой счетчик? - person Nicol Bolas; 28.10.2012
comment
Я получаю неподдерживаемый :-/ OpenCL также не имеет cl_khr_3d_image_writes для этого драйвера. Пришло время попробовать Windows на этом Mac. - person FHoenig; 28.10.2012