C++ 使用多个颜色附件将深度缓冲区渲染到纹理

C++ 使用多个颜色附件将深度缓冲区渲染到纹理,c++,opengl,glsl,C++,Opengl,Glsl,我正在尝试将深度缓冲区写入纹理,以便在另一个渲染过程中使用它。我的片段着色器有多个输出 #version 330 layout (location=0) out float weight; layout (location=1) out float mask; in float faceArea; in vec2 vTexCoords; uniform sampler2D triangleArea; void main() { weight = texture( triangleA

我正在尝试将深度缓冲区写入纹理,以便在另一个渲染过程中使用它。我的片段着色器有多个输出

#version 330

layout (location=0) out float weight;
layout (location=1) out float mask;

in float faceArea;
in vec2 vTexCoords;

uniform sampler2D triangleArea;

void main()
{
   weight = texture( triangleArea , vTexCoords  ).x / faceArea;

   mask = 1.0;
}
以下是纹理和帧缓冲区初始化代码:

    GL_CHECK( glBindTexture( GL_TEXTURE_2D , mPerPixelWeightTextures[ 0 ] ) ) ;
    GL_CHECK( glTexImage2D( GL_TEXTURE_2D , 0 , GL_R32F , mWidth , mHeight , 0 , GL_RED , GL_FLOAT , 0 ) ); //mask

    GL_CHECK( glBindTexture( GL_TEXTURE_2D , mPerPixelWeightTextures[ 1 ] ) ) ;
    GL_CHECK( glTexImage2D( GL_TEXTURE_2D , 0 , GL_R32F , mWidth , mHeight , 0 , GL_RED , GL_FLOAT , 0 ) ); //weight

    GL_CHECK( glBindTexture( GL_TEXTURE_2D , mPerPixelWeightTextures[ 2 ] ) ) ;
    GL_CHECK( glTexImage2D( GL_TEXTURE_2D , 0 , GL_DEPTH_COMPONENT , mWidth , mHeight , 0 , GL_DEPTH_COMPONENT , GL_FLOAT , 0 ) ); //depth buffer
。。。。。。。。。。

    GL_CHECK( glBindFramebuffer( GL_DRAW_FRAMEBUFFER , mFBO[ 1 ] ) );

    GL_CHECK( glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER , GL_COLOR_ATTACHMENT0 , GL_TEXTURE_2D , mPerPixelWeightTextures[ 0 ] , 0 ) );
    GL_CHECK( glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER , GL_COLOR_ATTACHMENT1 , GL_TEXTURE_2D , mPerPixelWeightTextures[ 1 ] , 0 ) );
    GL_CHECK( glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER , GL_DEPTH_ATTACHMENT , GL_TEXTURE_2D , mPerPixelWeightTextures[ 2 ] , 0 ) );
以下是最终渲染调用:

            GLenum buffers[] = { GL_COLOR_ATTACHMENT0 , GL_COLOR_ATTACHMENT1  };

            GL_CHECK( glDrawBuffers(2, buffers) );

            GL_CHECK( glDrawElements( GL_TRIANGLES , mIndices.size() , GL_UNSIGNED_INT , 0 ) ); 

            GL_CHECK( glBindTexture( GL_TEXTURE_2D , mPerPixelWeightTextures[ 2 ] ) );

            GL_CHECK( glGetTexImage( GL_TEXTURE_2D, 0 , GL_DEPTH_COMPONENT , GL_FLOAT , mUsedPixelFlag.data ) );
            cv::Mat depthMap( mHeight , mWidth , CV_8UC1 );

        depthMap.setTo(cv::Scalar(255));

        for( int rr = 0; rr < mHeight ; rr++ )
         for( int cc = 0; cc < mWidth ; cc++ )
         {
                depthMap.at< uchar >(rr, cc) = ( 255 * mUsedPixelFlag.at< float >( rr , cc ) );

         }

        cv::imwrite( "depthmap.jpg" , mask);
当我访问深度缓冲区对应的纹理值时,结果是0。还要注意,片段着色器很好,我已经测试了颜色附着的值,它们很好


我在这里犯了一些概念上的错误吗?…我希望深度缓冲区会自动写入GL_depth_附件。将深度缓冲区写入纹理的正确方法是什么?

是否启用了深度测试?是的,我已启用。