0

情况是,有许多相交的表面,不需要鼠标单击来确定光标位置的实际坐标,如果它指向什么或表面,我想使用这个glReadPixels,在着色器上绘制,并且最终glReadPixels给我的当前像素的深度总是等于0,因为这可能是什么,并且可能有新版本的替代品的任何功能,opengl在论坛上寻找信息,但发现我可以提供帮助,谢谢提前。

4

2 回答 2

0

我正在使用 openGl 在 Qt 中编写一个 3D 小部件,它显示各种对象。如果光标分别指向 coca-object,则需要找到光标下的点(当然会在现场)的坐标。所有渲染都通过着色器。我想获取给定像素中深度缓冲区的深度值,其中很多都显示了如何做到这一点,我也是这样做的,但是 glReadPixels 总是告诉我任何像素的深度都是 0。

enter code here

initializeOpenGLFunctions();

glEnable(GL_TEXTURE_2D);

//корректное отображение перспективы
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

// включение обновление буфера глубины
glEnable(GL_DEPTH_TEST);

// очистка буфера
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GLint viewport[4];
GLdouble modelview[16];
GLdouble projectionmtr[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

viewport[0] = 0;
viewport[1] = 0;
viewport[2] = geometry().width();
viewport[3] = geometry().height();
QMatrix4x4 mtr =  mCameraMatr * mObjectMatr * mScale * mCentrTr * translate;

int k = 0;
for(int i = 0; i<4; ++i)
{
    for(int j = 0; j<4; ++j)
    {
        modelview[k] = mtr(j,i);
        ++k;
    }
}

k = 0;
for(int i = 0; i<4; ++i)
{
    for(int j = 0; j<4; ++j)
    {
        projectionmtr[k] = projection(j,i);
        ++k;
    }

winX = x;
winY = viewport[3] - y;

glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );// Here is always written in the variable winZ 0

gluUnProject( winX, winY, winZ, modelview, projectionmtr, viewport, &posX, &posY, &posZ);

return QVector3D(posX, posY, posZ);
于 2017-01-13T09:05:34.037 回答
0

据我理解的问题,你想找到一些物体的相交坐标。正确的?

你不能用 glReadPixels 做任何这些,因为这个函数返回像素的颜色。像素是平的(就像你的电脑屏幕一样),所以没有写深度。它只是从屏幕上的结果图像中获取信息。

这是一个很好的引用:“OpenGL 不是一个场景管理库。它只是一个绘图 API,可以将事物绘制到屏幕上然后忘记它们。”

所以我的猜测是你必须在你的代码中做一些技巧,并根据你的代码的工作方式用你自己的函数计算一切。

于 2017-01-13T08:53:01.647 回答