2017-01-11 145 views
0

的情况是,有相交的很多面,也没有必要的鼠标点击来确定光标位置的实际坐标,如果它指向什么或表面,此我想用glReadPixels,画遍着色器,并最终glReadPixels给我当前像素的深度总是等于0,因为什么,这可能是,也可以有任何的替代品的功能为opengl新版本,在论坛上寻找信息,但发现我可以提前帮助,谢谢。GlReadPixels总是从深度缓冲取0

回答

0

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

你不能做任何这些与glReadPixels,因为这个机能的研究返回像素的颜色。像素是平的(因为您的电脑屏幕是),所以没有写入深度。 它只是从屏幕上的结果图像获取信息。

这里是不错的报价: “OpenGL是不是一个场景管理库这仅仅是一个绘图API绘制的东西到屏幕上,然后忘掉他们。”

所以我的猜测是,你将不得不在你的代码中做一些技巧,并根据你的代码的工作原理用你自己的函数来计算一切。

+0

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

+0

QVector3D iGLView :: GetRealPos(INT的x,int y)对 { 闪烁视[4]; GLDouble modelview [16]; GLdouble projectionmtr [16]; GLFloat winX,winY,winZ; GLdouble posX,posY,posZ; glReadPixels(x,int(winY),1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&winZ); //这里总是写在变量winZ 0 gluUnProject(WINX,酒味,winZ,模型视图,projectionmtr,视,及POSX,和波西,&posZ); 回报QVector3D(POSX,波西,posZ); } – ygarnui

+0

你可以搜索碰撞检测,但这并没有在opengl中完成 – Ferdi

0

我使用OpenGL三维插件,里面陈列着各种物体中的Qt编写。如果分别指向可口可乐对象,则需要在光标下找到该点的坐标(当然这将在现场)。所有渲染都通过着色器。 我想在一个给定的像素深度缓冲区的深度值,其中很多展示了如何做到这一点,和我做同样的,但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); 
0

你是错的,功能gglReadPixels有机会获得深度的一个组成部分,如果你把在文档仔细一看,但我不工作,话题仍然是相关