簡體   English   中英

GlReadPixels始終取自深度緩沖區0

[英]GlReadPixels always takes from the depth buffer 0

情況是,有許多相交的表面,並且無需單擊鼠標即可確定光標位置的實際坐標(如果它指向的是什么或表面),為此,我想使用glReadPixels ,在整個着色器上繪制,最終glReadPixels給我當前像素的深度始終等於0 ,因為這可能是這樣,並且可能具有新版opengl的替代功能中的任何功能,在論壇上尋找信息,但是發現我可以幫助,在此先感謝。

據我了解的問題,您想找到某些對象的相交坐標。 正確?

使用glReadPixels不能執行任何這些操作,因為此功能會返回像素的顏色。 像素是平坦的(就像您的計算機屏幕一樣),因此沒有書寫深度。 它只是從屏幕上的結果圖像中獲取信息。

這是一個很好的報價:“ OpenGL並不是場景管理庫。它只是一個繪圖API,將事物繪制到屏幕上,然后將其忽略。”

所以我的猜測是,您將不得不在代碼中做一些技巧,並根據代碼的工作方式使用自己的函數計算所有內容。

我正在使用OpenGl在Qt中編寫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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM