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