Считывание значения глубины прозрачной плоскости с помощью glReadPixels и gluUnProject - PullRequest
2 голосов
/ 03 мая 2011

Я пытаюсь создать симулятор бильярда и использую glReadPixels вместе с gluUnProject для проецирования указателя мыши на сцену.

Это прекрасно работает, если мышь указывает на объект в сцене (например, на таблицу), но когда она указывает на фон, она портит gluUnProject из-за вызова glReadPixels, возвращающего 1.0.

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

Если я рисую прозрачный четырехугольник без glAlphaFunc (GL_GREATER, 0.01f); он отобразит квадратик белым цветом, и тестирование глубины будет работать так, как я планировал, но когда я добавлю вызов alphaFunc для обеспечения прозрачности квада, глубина вернется к тому, что было раньше. Из того, что я видел, glReadPixels считывает пиксели из буфера кадров, так что это имеет смысл, мне просто интересно, как я могу обойти это.

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

Короче говоря, как я могу получить glReadPixels, чтобы получить его компонент глубины от объекта без рисования этого объекта на экране?

Вот вызовы glReadPixels и gluUnProject:

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels(x, (int) winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);    
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

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

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

Если вы нарисуете что-то после этого, оно все равно будет проверено на глубину (если оно включено), а его значения глубины все равно будут записаны в буфер глубины (если оно включено), но ни один из его фрагментов не будет виден в цветной буфер.

0 голосов
/ 04 мая 2011

Это потому, что при альфа-тестировании полностью отбрасываются пиксели, которые не проходят тест.

Однако gluUnProject не должен подавлять значение буфера глубины 1,0;то, что вы должны получить в качестве значения для буфера глубины, равным 1,0, является расстоянием до дальней плоскости отсечения.

...