情况是,有许多曲面相交,没有鼠标点击确定光标位置的实际坐标,如果它指向什么或表面,为此我想使用{{1} },绘制所有着色器,最终glReadPixels
给我的当前像素的深度始终等于0
,因为这可能是什么,并且可能具有更新的替代功能版本opengl
,在论坛上查找信息,但发现我可以提前帮助,谢谢。
答案 0 :(得分:0)
据我了解这个问题,你想找到一些物体的间隔坐标。正确?
您无法使用glReadPixels执行任何操作,因为此功能会返回像素的颜色。像素是平的(就像你的电脑屏幕一样),所以没有写入深度。 它只是从屏幕上的结果图像中获取信息。
这是一个很好的引用: " OpenGL不是场景管理库。它只是一个绘图API,可以将内容绘制到屏幕上,然后忘记它们。"
所以我的猜测是你必须在你的代码中做一些技巧,并根据代码的工作方式用自己的函数计算所有内容。
答案 1 :(得分:0)
我在Qt中使用openGl编写了一个3D小部件,它可以显示各种对象。如果它分别指向可卡物,则必须找到光标下的点的坐标(当然将在现场)。所有渲染都通过着色器进行。 我想在给定像素中获取深度缓冲区的深度值,其中很多都显示了如何做到这一点,我也这样做,但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);