在不带着色器的OpenGL中渲染深度缓冲区 我有以下C++ C++ OpenGL代码,渲染场景中像素的RGB值: glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, _windowWidth, _windowHeight); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); float aspectRatio = float(_windowWidth) / float(_windowHeight); gluPerspective(60.0f, aspectRatio, 0.1f, 1000.0f); glMatrixMode(GL_MODELVIEW); _camera.Update(); glLoadMatrixf(_camera.Matrix()[0]); _scene.Render(); glutSwapBuffers();

在不带着色器的OpenGL中渲染深度缓冲区 我有以下C++ C++ OpenGL代码,渲染场景中像素的RGB值: glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, _windowWidth, _windowHeight); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); float aspectRatio = float(_windowWidth) / float(_windowHeight); gluPerspective(60.0f, aspectRatio, 0.1f, 1000.0f); glMatrixMode(GL_MODELVIEW); _camera.Update(); glLoadMatrixf(_camera.Matrix()[0]); _scene.Render(); glutSwapBuffers();,c++,opengl,depth-buffer,C++,Opengl,Depth Buffer,但是,我想改为渲染场景的深度缓冲区,即,使每个像素值都是摄影机前面的z距离 也就是说,我当前正在获取顶部图像,但我需要底部图像(图像来源): 我该怎么做?我不认为我正在使用着色器(是吗?)——并且给出的建议似乎表明,这可能只适用于着色器 还有,尽管看起来它也在使用着色器。修改我的代码以使用着色器有多困难?您可以通过glReadPixels()和GL\u DEPTH\u组件将depthbuffer拖到主机内存中,并将缓冲区作为GL\u亮度纹理重新上载: #包括 #包括 #包括 使用名称空间s

但是,我想改为渲染场景的深度缓冲区,即,使每个像素值都是摄影机前面的z距离

也就是说,我当前正在获取顶部图像,但我需要底部图像(图像来源):

我该怎么做?我不认为我正在使用着色器(是吗?)——并且给出的建议似乎表明,这可能只适用于着色器


还有,尽管看起来它也在使用着色器。修改我的代码以使用着色器有多困难?

您可以通过
glReadPixels()
GL\u DEPTH\u组件
将depthbuffer拖到主机内存中,并将缓冲区作为
GL\u亮度
纹理重新上载:


#包括
#包括
#包括
使用名称空间std;
无效显示()
{
int w=glutGet(GLUT\u窗口\u宽度);
int h=glutGet(GLUT\U窗口\U高度);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
双ar=w/静态铸造(h);
常数浮点数zNear=0.1;
常数浮点zFar=10.0;
glu(60,ar,zNear,zFar);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glTranslatef(0,0,-4);
静态浮动角度=0;
角度+=3;
glPushMatrix();
glRotatef(角度,0.1,0.5,0.3);
glColor3ub(255,0,0);
茶壶(1);
glPopMatrix();
向量深度(w*h,0);
glReadPixels(0、0、w、h、GL_深度分量、GL_浮点和深度[0]);
//线性化深度
// http://www.geeks3d.com/20091216/geexlab-how-to-visualize-the-depth-buffer-in-glsl/
对于(size_t i=0;i0)
gldelete纹理(1和tex);
glGenTextures(1和tex);
glBindTexture(GL_TEXTURE_2D,tex);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexImage2D(GL_纹理2D,0,GL_亮度,w,h,0,GL_亮度,GL_浮动和深度[0]);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,w,0,h,-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glEnable(GL_纹理_2D);
glColor3ub(255、255、255);
glScalef(0.3,0.3,1);
glBegin(GL_QUADS);
glTexCoord2i(0,0);
glVertex2i(0,0);
glTexCoord2i(1,0);
glVertex2i(w,0);
glTexCoord2i(1,1);
glVertex2i(w,h);
glTexCoord2i(0,1);
glVertex2i(0,h);
格伦德();
glDisable(GL_纹理_2D);
glutSwapBuffers();
}
无效计时器(int值)
{
再发现();
glutTimerFunc(16,定时器,0);
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_深度| GLUT_双精度);
glutInitWindowSize(600600);
GLUT(GLUT);
glewInit();
glutDisplayFunc(显示器);
glutTimerFunc(0,定时器,0);
glEnable(GLU深度试验);
glutMainLoop();
返回0;
}
CPU的往返速度不是很快(尤其是在主机端线性化的情况下)。您可以使用使其成为GPU到GPU的传输,但会丢失线性化。

您可以使用将深度值渲染到纹理中。然后在第二个渲染过程中,在整个视口上绘制一个四边形,并在其上应用深度纹理

或者您可以编写一个片段着色器,该着色器将根据片段的深度输出片段颜色,这可以在一次过程中进行渲染


见一些例子。你可以找到更多关于“fbo”的搜索。

我不是一个图形专家,但那个球看起来像是一个phong blinn,可能还有猴子和立方体。。我相信您使用的是着色器,但要点是:没有代码,我们如何提供帮助?
#include <GL/glew.h>
#include <GL/glut.h>

#include <vector>
using namespace std;

void display()
{
    int w = glutGet( GLUT_WINDOW_WIDTH );
    int h = glutGet( GLUT_WINDOW_HEIGHT );

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double ar = w / static_cast< double >( h );
    const float zNear = 0.1;
    const float zFar = 10.0;
    gluPerspective( 60, ar, zNear, zFar );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glTranslatef( 0, 0, -4 );

    static float angle = 0;
    angle += 3;

    glPushMatrix();
    glRotatef( angle, 0.1, 0.5, 0.3 );
    glColor3ub( 255, 0, 0 );
    glutSolidTeapot( 1 );
    glPopMatrix();

    vector< GLfloat > depth( w * h, 0 );
    glReadPixels( 0, 0, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, &depth[0] ); 

    // linearize depth
    // http://www.geeks3d.com/20091216/geexlab-how-to-visualize-the-depth-buffer-in-glsl/
    for( size_t i = 0; i < depth.size(); ++i )
    {
        depth[i] = ( 2.0 * zNear ) / ( zFar + zNear - depth[i] * ( zFar - zNear ) );
    }

    static GLuint tex = 0;
    if( tex > 0 )
        glDeleteTextures( 1, &tex );
    glGenTextures(1, &tex);
    glBindTexture( GL_TEXTURE_2D, tex);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_FLOAT, &depth[0] );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, w, 0, h, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glEnable( GL_TEXTURE_2D );
    glColor3ub( 255, 255, 255 );
    glScalef( 0.3, 0.3, 1 );
    glBegin( GL_QUADS );
    glTexCoord2i( 0, 0 );
    glVertex2i( 0, 0 );
    glTexCoord2i( 1, 0 );
    glVertex2i( w, 0 );
    glTexCoord2i( 1, 1 );
    glVertex2i( w, h);
    glTexCoord2i( 0, 1 );
    glVertex2i( 0, h );
    glEnd();
    glDisable( GL_TEXTURE_2D );

    glutSwapBuffers();
}

void timer( int value )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 600, 600 );
    glutCreateWindow( "GLUT" );
    glewInit();
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glEnable( GL_DEPTH_TEST );
    glutMainLoop();
    return 0;
}