2013-06-06 4 views
1

Я пытался следовать Copying depth render buffer to the depth buffer, но это не работает для меня. Вот мой полный пример:Неверная операция OpenGL: буфер глубины визуализации глубины для буфера глубины по умолчанию

#include <GL/glew.h> 
#include <GL/glfw.h> 
#include <GL/glu.h> 
#include <iostream> 

typedef unsigned int uint; 

int main() 
{ 
    if (glfwInit() != 1) 
    { 
     return 1; 
    } 

    const uint width = 256; 
    const uint height = 256; 

    if (glfwOpenWindow(width, height, 8, 8, 8, 0, 24, 0, GLFW_WINDOW) != 1) 
    { 
     return 1; 
    } 

    GLenum err = glewInit(); 
    if (GLEW_OK != err) 
    { 
     std::cerr << glewGetErrorString(err) << std::endl; 
     return 1; 
    } 

    GLuint r; 
    glGenRenderbuffers(1, &r); 
    glBindRenderbuffer(GL_RENDERBUFFER, r); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); 
    glBindRenderbuffer(GL_RENDERBUFFER, 0); 

    GLuint r2; 
    glGenRenderbuffers(1, &r2); 
    glBindRenderbuffer(GL_RENDERBUFFER, r2); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, width, height); 
    glBindRenderbuffer(GL_RENDERBUFFER, 0); 

    GLuint f; 
    glGenFramebuffers(1, &f); 
    glBindFramebuffer(GL_FRAMEBUFFER, f); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, r); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, r2); 
    std::cout << (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) << std::endl; 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

    std::cout << gluErrorString(glGetError()) << std::endl; 

    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
    glBindFramebuffer(GL_READ_FRAMEBUFFER, f); 
    glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); 

    std::cout << gluErrorString(glGetError()) << std::endl; 

    return 0; 
} 

выход я получаю:

1 
no error 
invalid operation 

24 в glfwOpenWindow это количество глубины битов. Что я делаю не так?

+0

Почему вы добавляете цветной рендеринг, когда используете только буфер глубины? –

+0

Я хотел, чтобы фреймбуфер был полным, так как я не уверен, имеет ли это какое-либо влияние. – tauran

+1

Код не дает мне недействительную операцию. Вы можете попробовать с 8-битным трафаретом (например, GL_DEPTH24_STENCIL8). – ThomasD

ответ

0

As ThomasD предложил в комментариях GL_DEPTH24_STENCIL8 работал.

+0

Это все хорошо и хорошо, но поскольку исходный код отлично работал на его машине, важнее, чтобы люди стали смотреть на этот вопрос в будущем, чтобы понять, почему он потерпел неудачу на вашей машине и преуспел в его работе. Тем более, что кто-то другой, работающий с разными драйверами/оборудованием, может оказаться не в состоянии найти успех, просто изменив формат трафарета таким же образом. – Jherico

2

Параметры для glfwOpenWindow указывают требуемые значения. Тем не менее, вполне возможно, что ваш драйвер не поддерживает точный формат, который вы запрашиваете (24-битный цвет, 24-битная глубина, отсутствие альфы, отсутствие трафарета). GLFW попытается найти лучший матч, соблюдая ваши минимумы.

В этом случае это, вероятно, дает вам самый стандартный формат цвета RGBA (32 бит) и 24/8 бит глубины/трафарета, или он может создавать 32-битный буфер глубины. Вам действительно нужно позвонить glfwGetWindowParam, чтобы запросить биты глубины и трафарета для фреймбуфера по умолчанию, а затем построить ваши рендерингбуферы в соответствии с этим.

Смежные вопросы