GlReadPixel始终从深度缓冲区0中获取
GlReadPixels always takes from the depth buffer 0
情况是,有许多相交的表面,不需要鼠标单击来确定光标位置的实际坐标,如果它指向什么或表面,为此我想使用glReadPixels
,在着色器上绘制所有着色器,最终glReadPixels
给我当前像素的深度总是等于0
, 因为这可能是什么,并且可能具有较新版本opengl
替代品的任何功能,在论坛上寻找信息,但发现我可以提供帮助,提前感谢。
据我理解的问题,你想找到一些物体的插入坐标。正确?
你不能用glReadPixels做任何这些,因为这个函数返回像素的颜色。像素是平坦的(就像您的计算机屏幕一样),因此没有深度写入。它只是从屏幕上的结果图像中获取信息。
这是很好的报价:"OpenGL不是一个场景管理库。它只是一个绘图API,可以将内容绘制到屏幕上,然后忘记它们。
所以我的猜测是,你必须在你的代码中做一些技巧,并根据你的代码的工作方式,用你自己的函数计算所有内容。
我正在使用openGl在Qt中编写3D小部件,它显示各种对象。如果光标分别指向古柯对象,则必须在光标下找到该点的坐标(当然将在现场)。所有渲染都通过着色器。我想在给定像素中获取深度缓冲区的深度值,其中很多都显示了如何做到这一点,我也这样做,但是glReadPixel总是告诉我任何像素的深度都是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);
相关文章:
- 使用 strcat 获取缓冲区溢出错误
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- 让 iaxClient 将音频发送到缓冲区而不是音频设备/从缓冲区获取音频
- CSV文件未从缓冲区获取数据
- 从 CImage AtlImage 获取缓冲区数组
- 如何在运行时从平面缓冲区获取数据值和数据类型
- 无法获取索引缓冲区以在 OpenGL 中绘制正方形
- 从交换链获取多个屏幕缓冲区
- 从索引缓冲区中获取索引
- 如何使用 std::istringstream 获取正确的缓冲区大小以进行数据解析
- 获取 vscode c++ 插件以查找协议缓冲区标头
- GlReadPixel始终从深度缓冲区0中获取
- 获取当前目录,我可以在不知道最大缓冲区大小的情况下进行
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 如何从窗口中获取像素数据像素缓冲区并提取RGB
- 在堆栈和堆上使用较低级别的方法获取缓冲区的长度
- 了解 DXGI DirectX 11 桌面复制以获取缓冲区或阵列的问题
- 如何在c++中从Imagemagick图像中获取缓冲区
- 获取缓冲区内容,将其存储在struct中,获取新的缓冲区内容,看看是否在struct中相等