Dictionary 多维数据集映射/帧缓冲区问题

Dictionary 多维数据集映射/帧缓冲区问题,dictionary,opengl,cube,Dictionary,Opengl,Cube,所以。。。我正在尝试为BRDF着色器过滤环境贴图,如下所述:。但是,我无法正确存储过滤结果(加载时,我会得到一个充满瑕疵的黑色纹理) 我想这一定与帧缓冲区有关,因为glCheckFramebufferStatus()在LOD/sides循环中不断返回0,但我花了几个小时试图理解为什么。。。我看不出有什么问题。glGetError()返回0,我确保在循环开始之前生成帧缓冲区/渲染/缓冲区,此时一切似乎都完成了。程序的其余部分运行良好,编译我使用的着色器时没有错误 我对openGL还很陌生,有什么明

所以。。。我正在尝试为BRDF着色器过滤环境贴图,如下所述:。但是,我无法正确存储过滤结果(加载时,我会得到一个充满瑕疵的黑色纹理)

我想这一定与帧缓冲区有关,因为glCheckFramebufferStatus()在LOD/sides循环中不断返回0,但我花了几个小时试图理解为什么。。。我看不出有什么问题。glGetError()返回0,我确保在循环开始之前生成帧缓冲区/渲染/缓冲区,此时一切似乎都完成了。程序的其余部分运行良好,编译我使用的着色器时没有错误

我对openGL还很陌生,有什么明显的地方我遗漏了吗?我假设问题一定在这一部分。。。但它看起来应该起作用吗?可能是我在别的地方做错了什么吗

代码如下:

if (cubeMapGenerated == false){
    //Frame Buffer:
    glGenFramebuffers(1, &frameBuffer);
    glGenRenderbuffers(1, &renderBuffer);
    glGenTextures(1, &genCubeMap);

    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
    glBindTexture(GL_TEXTURE_CUBE_MAP, genCubeMap);

    for (unsigned int i = 0; i < 6; ++i)
    {glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA16F, 128, 128, 0, GL_RGB, GL_FLOAT, nullptr);}
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //params
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glGenerateMipmap(GL_TEXTURE_CUBE_MAP); //generate mipmaps

    glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width_, height_);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
       std::cout << "Framebuffer is not complete at gen. Staus: " << glCheckFramebufferStatus(GL_FRAMEBUFFER) << std::endl;

    GLuint projection_location, view_location, model_location, normal_matrix_location,
        specular_map_location, roughness_location;

    cubeMapGen_program_->bind(); //bind irradiance sahder
    projection_location = cubeMapGen_program_->uniformLocation("projection");
    view_location = cubeMapGen_program_->uniformLocation("view");
    model_location = cubeMapGen_program_->uniformLocation("model");
    normal_matrix_location = cubeMapGen_program_->uniformLocation("normal_matrix");
    specular_map_location = cubeMapGen_program_->uniformLocation("specular_map");
    roughness_location =brdf_program_->uniformLocation("roughness");

    glUniformMatrix4fv(projection_location, 1, GL_FALSE, e_captureProjection.data());
    glUniformMatrix4fv(model_location, 1, GL_FALSE, model.data());
    glUniformMatrix3fv(normal_matrix_location, 1, GL_FALSE, normal.data());

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_CUBE_MAP, specular_map_);
    glUniform1i(specular_map_location, 0);

    for (unsigned int mip = 0; mip < maxMipLevels; ++mip){//render each mip
        // resize framebuffer according to mip-level size.
        unsigned int mipWidth  = 128 * std::pow(0.5, mip);
        unsigned int mipHeight = 128 * std::pow(0.5, mip);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, mipWidth, mipHeight);
        std::cout << "width: " << mipWidth << " height: " << mipHeight << std::endl;

        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
        glViewport(0, 0, mipWidth, mipHeight);

        float mproughness = (float) mip / (float)(maxMipLevels - 1);
        glUniform1f (roughness_location, mproughness);

        for (unsigned int i = 0; i < 6; ++i)//render each side
        {
            glUniformMatrix4fv(view_location, 1, GL_FALSE, e_captureViews[i].data());
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, genCubeMap, mip);

            if(i == 0 && glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            {std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete! Map: " << mip << std::endl;}

            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glBegin(GL_TRIANGLES);
            glVertex3f(2, -2, -2); glVertex3f(2, -2, 2); glVertex3f(2, 2, 2); //Right
            glVertex3f(2, -2, -2); glVertex3f(2, 2, 2); glVertex3f(2, 2, -2);
            glVertex3f(-2, -2, -2); glVertex3f(-2, 2, 2); glVertex3f(-2, -2, 2); //Left
            glVertex3f(-2, -2, -2); glVertex3f(-2, 2, -2); glVertex3f(-2, 2, 2);
            glVertex3f(-2, -2, 2); glVertex3f(-2, 2, 2); glVertex3f(2, 2, 2); //Front
            glVertex3f(-2, -2, 2); glVertex3f(2, 2, 2); glVertex3f(2, -2, 2);
            glVertex3f(-2, -2, -2); glVertex3f(2, 2, -2); glVertex3f(-2, 2, -2); //Back
            glVertex3f(-2, -2, -2); glVertex3f(2, -2, -2); glVertex3f(2, 2, -2);
            glVertex3f(-2, 2, -2); glVertex3f(2, 2, -2); glVertex3f(2, 2, 2);   //Top
            glVertex3f(-2, 2, -2); glVertex3f(2, 2, 2); glVertex3f(-2, 2, 2);
            glVertex3f(-2, -2, -2); glVertex3f(2, -2, 2); glVertex3f(2, -2, -2); //Bottom
            glVertex3f(-2, -2, -2); glVertex3f(-2, -2, 2); glVertex3f(2, -2, 2);
        }
    //std::cout << glGetError() << ", " << glCheckFramebufferStatus(GL_FRAMEBUFFER) << std::endl;
    }
    std::cout<<"New pre filtered map generated"<<std::endl;
    cubeMapGenerated = true;
    }//cubemapgen
    glEnd();
if(cubeMapGenerated==false){
//帧缓冲区:
GLGEN帧缓冲区(1和帧缓冲区);
glGenRenderbuffers(1,&renderBuffer);
glGenTextures(1和genCubeMap);
glBindFramebuffer(GL_FRAMEBUFFER,FRAMEBUFFER);
glBindTexture(GL_纹理_立方体_贴图,genCubeMap);
for(无符号整数i=0;i<6;++i)
{glTexImage2D(GL_纹理_立方体_贴图_正X+i,0,GL_RGBA16F,128,128,0,GL_RGB,GL_FLOAT,nullptr);}
glTexParameteri(GL_纹理_立方体_贴图、GL_纹理_包裹、GL_夹紧_到_边);//参数
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ T、GL_夹紧\ U到\ U边);
glTexParameteri(GL_纹理\立方体\贴图、GL_纹理\包裹\ R、GL_夹紧\至\边缘);
glTexParameteri(GL\u纹理\u立方体\u贴图、GL\u纹理\u最小\u过滤器、GL\u线性\u MIPMAP\u线性);
glTexParameteri(GL_纹理\立方体\贴图,GL_纹理\贴图过滤器,GL_线性);
glGenerateMipmap(GL_纹理_立方体_贴图);//生成mipmap
glBindRenderbuffer(GL_RENDERBUFFER,RENDERBUFFER);
GLrenderBuffer存储(GL_RENDERBUFFER、GL_深度分量、宽度分量、高度分量);
glFramebufferRenderbuffer(GL_帧缓冲区、GL_深度附件、GL_RENDERBUFFER、RENDERBUFFER);
如果(glCheckFramebufferStatus(GL\U FRAMEBUFFER)!=GL\U FRAMEBUFFER\U COMPLETE)
标准::cout统一位置(“视图”);
模型位置=立方体编程->统一位置(“模型”);
法线矩阵位置=立方体编程->统一位置(“法线矩阵”);
镜面贴图位置=立方体贴图程序->统一位置(“镜面贴图”);
粗糙度位置=brdf\U程序->统一位置(“粗糙度”);
glUniformMatrix4fv(投影位置,1,GL_假,e_captureProjection.data());
glUniformMatrix4fv(model_location,1,GL_FALSE,model.data());
glUniformMatrix3fv(正常矩阵位置,1,GL_假,正常.data());
玻璃纹理(GL_纹理0);
glBindTexture(GLU纹理、立方体贴图、镜面贴图);
glUniform1i(镜面反射贴图位置,0);
对于(unsigned int mip=0;mip
但是,如果以不推荐的样式绘制对象,则几何对象将通过在对之间封闭一系列顶点坐标来绘制

在更改或操作帧缓冲区之前,必须通过
glEnd
完成绘图序列

在内部循环中移动
glEnd
指令,代码应该可以工作

for (unsigned int mip = 0; mip < maxMipLevels; ++mip)
{

    .....

    for (unsigned int i = 0; i < 6; ++i)//render each side
    {
         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, genCubeMap, mip);

         glBegin(GL_TRIANGLES);
         glVertex3f(2, -2, -2); glVertex3f(2, -2, 2); glVertex3f(2, 2, 2);

         .....

         glVertex3f(-2, -2, -2); glVertex3f(-2, -2, 2); glVertex3f(2, -2, 2);
         glEnd(); // <---- "end" the draw sequence 
    }
}
for(unsigned int mip=0;mip格伦();//是的,就是这样。谢谢!