Я следую руководству по выбору в opengl. Это моя функция для выбора,
int size = 25;
GLuint buffer[size];
glSelectBuffer(size, buffer);
glRenderMode(GL_SELECT);
glPushMatrix();
glLoadIdentity();
glGetIntegerv(GL_VIEWPORT, viewport);
gluPickMatrix(x, viewport[3] - y, 1000, 1000, viewport);
gluPerspective(60, ratio, 0.001, 1000);
glMatrixMode(GL_MODELVIEW);
glInitNames();
//give dummy name
glPushName(0);
draw_scene(scene_root, true);
glPopName();
//stop picking
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glFlush();
GLint hits = glRenderMode(GL_RENDER);
Я использую 1000 1000 для gluPickMatrix
просто чтобы получить хит
draw_scene сводится к
glLoadName(1);
mProgram.setUniformValue(mMvpMatrixLocation, getCameraMatrix() * transform);
glDrawArrays(GL_TRIANGLES, 40, 40 + v->sphereSize/3);
Get getCameraMatrix()
возвращает QMatrix4x4
, представляющий проекцию моей камеры, а transform
— это QMatrix4x4`, представляющий координаты моей модели.
Мой shaper.vert выглядит так
in vec3 vert;
uniform mat4 mvpMatrix;
void main()
{
gl_Position = mvpMatrix * vec4(vert, 1.0);
}
Примечание mvpMatrix
это getCameraMatrix() * transform
Я загружаю «1» временно, так как у меня есть только один объект.
Моя проблема в том, что он не генерирует никаких обращений, несмотря на то, что окно просмотра составляет 1000x1000.
редактировать: проблема заключается в том, что glRendmode(GL_SELECT)
действительно меняет режим рендеринга. Для этого я создал еще один вопрос,
gluPickMatrix()
иgluProjection()
. - person Reto Koradi   schedule 24.02.2015gluPickMatrix()
? - person Sahar Rabinoviz   schedule 24.02.2015GL_PROJECTION_MATRIX
, построить ее самостоятельно без gluPickMatrix или вернуться к старые шейдеры GL и используйте встроенныйgl_ProjectionMatrix
. - person jozxyqk   schedule 24.02.2015glMatrixMode(GL_PROJECTION)
отсутствует передglPushMatrix()
. - person jozxyqk   schedule 24.02.2015