2017-01-11 91 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有機會獲得深度的一個組成部分,如果你把在文檔仔細一看,但我不工作,話題仍然是相關

相關問題