Неполное FBO при подключении RBO - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь прикрепить объект RenderBuffer к объекту FrameBuffer, и glCheckFramebufferStatus(GL_FRAMEBUFFER) продолжает возвращать мне код ошибки: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

(я пытаюсь прикрепить DepthBuffer)

Вот мой код (упрощенно):

// Create and bind the new FBO (1920x1080)

GLuint gBuffer; 
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);


// Create, initialize, bind and attach the new RBO (purpose : depth buffering)

GLuint rbo;
glGenRenderbuffers(1, &rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);


// Create, bind, and initialize, and attach a texture (the FBO's Color Buffer)

GLuint idMap;
glGenTextures(1, &idMap);
glBindTexture(GL_TEXTURE_2D, idMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, idMap, 0);

std::cout << std::to_string(glCheckFramebufferStatus(GL_FRAMEBUFFER)) << std::endl; // Gives me 36054 ( incomplete ???)


// Re-binding orignal FBO and RBO

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

Что я делаю не так?


Вещи, которые я заметил

Я случайно написал

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_COMPONENT16, GL_RENDERBUFFER, rbo);

Вместо

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);

... И ошибки не было, но проверка глубины не работала вообще.

РЕДАКТИРОВАТЬ: Это просто потому, что GL_DEPTH_ATTACHMENT необходимо присоединить буфер. Это было только из кадрового буфера ...

При рендеринге в FBO я делаю:

glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); // Use secondary FBO
glBindRenderbuffer(GL_RENDERBUFFER, rbo);   // Use secondary DepthBuffer
glDepthMask(GL_TRUE);                       // Allow depth writing
glEnable(GL_DEPTH_TEST);                    // Enable Depth testing
glDepthFunc(GL_LESS);                       // Pass if fragment is nearer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear color and depth buffers

Render(); 

glBindFramebuffer(GL_FRAMEBUFFER, 0);       // Go back to original FBO  
glBindRenderbuffer(GL_RENDERBUFFER, 0);     // to original Depth Buffer

1 Ответ

0 голосов
/ 20 июня 2019

Решено

Я пошагово следовал этому руководству: http://www.opengl -tutorial.org / fr / промежуточный-учебник / tutorial-14-render-to-texture/

Ошибка возникает при отсутствии этого блока кода:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Это параметры текстуры (цветовой буфер).В частности, только вторая строка необходима, чтобы избежать ошибки GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT.

Кажется, что добавление буфера глубины без установки некоторых параметров фильтрации текстуры не будет работать.(Тем не менее, это работает, когда есть только цветовой буфер, удивительно)

...