Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算zBuffer接受错误的值_C++_Opengl_3d_Zbuffer - Fatal编程技术网

C++ 计算zBuffer接受错误的值

C++ 计算zBuffer接受错误的值,c++,opengl,3d,zbuffer,C++,Opengl,3d,Zbuffer,计算zBuffer接受错误的值 我试图计算我的zBuffer,但我接受了错误的值。我正在加载的模型必须具有不同的Zbuffer值,但我不接受它们。我的值定义为ZFear 1.0f ZFAR 1500.0f我的代码为: //calculate the zBuffer GLfloat get_gl_depth() { Pipeline p; int w = glutGet( GLUT_WINDOW_WIDTH ); int h = glutGet( GLUT_WINDOW_H

计算zBuffer接受错误的值

我试图计算我的zBuffer,但我接受了错误的值。我正在加载的模型必须具有不同的Zbuffer值,但我不接受它们。我的值定义为ZFear 1.0f ZFAR 1500.0f我的代码为:

//calculate the zBuffer
GLfloat get_gl_depth()
{
    Pipeline p;
    int w = glutGet( GLUT_WINDOW_WIDTH );
    int h = glutGet( GLUT_WINDOW_HEIGHT );
    glBindBuffer( GL_PIXEL_PACK_BUFFER, pbo );
    glBufferData( GL_PIXEL_PACK_BUFFER, w * h * sizeof( GLfloat ), 0, GL_STREAM_READ );
    glReadPixels( 0, 0, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, 0 );
    GLfloat* ptr = (GLfloat*)glMapBuffer( GL_PIXEL_PACK_BUFFER, GL_READ_ONLY );

    unsigned short* buffer=new unsigned short[w*h];
    unsigned short* current = buffer;
    if (ptr != nullptr)
    {
        for (int i=0;i<w*h;i++)
        {
            GLfloat distance =ZNEAR+(GLfloat(ptr[i])*(ZFAR-ZNEAR));
            *current++ = unsigned short(distance + 0.5);
        }
    }

    glUnmapBuffer( GL_PIXEL_PACK_BUFFER );
    glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 );

    delete[] buffer;

    return 0;
}
矢量3F位置(0.0f,0.0f,-700.0f)


可能不相关,但在使用透视投影时,深度缓冲区中的深度值是非线性的,因此根据您对距离计算的期望,您可能会失望:)您能给我们展示一下您获得的值的示例吗?还需要指出的是,当您的顶点转换为NDC时,它不再使用右手坐标系,但z实际上是翻转的。我只接受数组ptr值中的1.0000000浮点值,没有任何更改,当我希望接受不同的值,因为我的模型中有一些包含不同高度的建筑时,你说的“转换为NDC”是什么意思?Thanks@user3436304NDC(标准化设备坐标),投影后缩放为[-1,1],z翻转。
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable( GL_DEPTH_TEST );
    glDepthMask(GL_TRUE);

    const float lightZ =  (sinf(m_scale) + 1.0f) / 2.0f;
    PointLight pl[10];
    int numLights = 0;

    pl[numLights++] = CreateLight(0, 0, 0, 255.0f, 0.0f, 0.0f);
    pl[numLights++] = CreateLight(0, 0, 100, 0.0f, 255.0f, 0.0f);
    pl[numLights++] = CreateLight(100, 0, 100, 0.0f, 0.0f, 255.0f);

    m_pEffect->SetPointLights(numLights, pl);


    m_pEffect->SetPointLights(3, pl);

    Pipeline p;

    Vector3f cameraUp = CameraUpVector();
    p.SetCamera(m_cameraPosition, m_cameraTarget, cameraUp);

    p.SetPerspectiveProj(60.0f, WINDOW_WIDTH, WINDOW_HEIGHT, ZNEAR, ZFAR);
    m_pEffect->SetWVP(p.GetWVPTrans());
    m_pEffect->SetWorldMatrix(p.GetWorldTrans());
    m_pEffect->SetDirectionalLight(m_directionalLight);
    m_pEffect->SetEyeWorldPos(m_cameraPosition);
    m_pEffect->SetMatSpecularIntensity(0.0f);
    m_pEffect->SetMatSpecularPower(0);

    m_pMesh->Render();
    get_gl_depth(/*WINDOW_WIDTH, WINDOW_HEIGHT*/);
    glutSwapBuffers();

This is the func that initlize the first values:
    Vector3f Target(0.0f, 0.0f, 0.00001f);
    Vector3f Up(0.0, 1.0f, 0.0f);

    m_cameraPosition = Pos;

    m_cameraTarget = Target;