2017-01-11 2 views
0

Ситуация в том, что есть много поверхностей, которые пересекаются, и нет необходимости щелчком мыши определять фактические координаты положения курсора, если это указывает на то, что или поверхность, для этого Я хотел использовать glReadPixels, рисовать все шейдеры, и в конечном итоге glReadPixels дает мне глубину текущего пикселя всегда равна 0, из-за чего это может быть и может иметь любую из альтернатив для более новых версий opengl, ища информацию на форуме, но обнаружил, что могу помочь, спасибо заранее.GlReadPixels всегда берет из буфера глубины 0

ответ

0

Насколько я понял вопрос, вы хотите найти координаты пересечения некоторых объектов. Верный?

Вы не можете использовать ни один из них с glReadPixels, потому что этот fuction возвращает цвет пикселя. Пиксели плоские (как экран вашего компьютера), поэтому нет глубины. Он просто получает информацию из изображения результата на экране.

Вот хорошая цитата: «OpenGL - это не библиотека управления сценой. Это просто API-интерфейс рисования, который рисует вещи на экране, а затем забывает о них».

Итак, я предполагаю, что вам нужно будет сделать некоторые трюки в своем коде и рассчитать все своими функциями в соответствии с тем, как работает ваш код.

+0

Я пишу в Qt используя openGl 3D-виджет, который отображает множество объектов. Необходимо найти координаты точки (которая, конечно, будет на месте) под курсором, если она указывает на кока-объект соответственно. Все рендеринг проходит через шейдеры. Я хочу получить значение глубины буфера глубины в заданном пикселе, многие из которых показывают, как это сделать, и я делаю то же самое, но glReadPixels всегда говорит мне, что глубина любого пикселя равна 0. – ygarnui

+0

QVector3D iGLView :: GetRealPos (int x, int y) { GLint viewport [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); // Здесь всегда записываются в переменных УИНЗАХ 0 gluUnProject (Winx, винный, УИНЗЫ, вид модели, projectionmtr, окно просмотра, и PosX, и Позите, &posZ); возвращения QVector3D (PosX, Позите, posZ); } – ygarnui

+0

вы могли бы поиск обнаружения конфликтов. Это не сделано в opengl, хотя – Ferdi

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); 
0

вы не правы, функция gglReadPixels имеет возможность получить компонент глубины, если присмотреться к документации, но я не работаю, тема по-прежнему актуальна