Ситуация такова, что есть много поверхностей, которые пересекаются, и нет необходимости в щелчке мыши, чтобы определить фактические координаты положения курсора, если он указывает на какую или поверхность, для этого я хотел бы использовать glReadPixels
закрасьте все шейдеры glReadPixels
дает мне глубину текущего пикселя всегда равна 0
из-за того, что это может быть, и может иметь какие-либо функции альтернатив для более новых версий opengl
, искал информацию на форуме, но обнаружил, что могу помочь, заранее спасибо.
Насколько я понял вопрос, вы хотите найти координаты пересечения некоторых объектов. Правильный?
Вы не можете делать ничего из этого с glReadPixels, потому что эта функция возвращает цвет пикселя. Пиксели плоские (как на экране вашего компьютера), поэтому глубина не написана.
Он просто получает информацию из результирующего изображения на экране.
Вот хорошая цитата:
«OpenGL — это не библиотека управления сценами. Это просто API рисования, который рисует вещи на экране, а потом забывает о них».
Поэтому я предполагаю, что вам придется выполнить некоторые трюки в коде и вычислить все с помощью собственных функций в соответствии с тем, как работает ваш код.
Я пишу в Qt, используя openGl 3D-виджет, который отображает различные объекты. Необходимо найти координаты точки (которая, конечно, будет на месте) под курсором, если он указывает на объект Coca соответственно. Весь рендеринг проходит через шейдеры.
Я хочу получить значение глубины буфера глубины в данном пикселе, многие из которых показывают, как это сделать, и я делаю то же самое, но 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);