Выбор Opengl не работает

Я следую руководству по выбору в 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) действительно меняет режим рендеринга. Для этого я создал еще один вопрос,


person Sahar Rabinoviz    schedule 24.02.2015    source источник
comment
Судя по тому, что вы устанавливаете форму, похоже, что вы используете шейдер. Использует ли ваш шейдер матрицу проекции с фиксированной функцией? Потому что это то, что вы устанавливаете с помощью gluPickMatrix() и gluProjection().   -  person Reto Koradi    schedule 24.02.2015
comment
@RetoKoradi Я отредактировал вопрос, включив в него код шейдера. Да, мой шейдер использует матрицу проекции, из-за этого мне не нужно использовать gluPickMatrix()?   -  person Sahar Rabinoviz    schedule 24.02.2015
comment
Как указывает @RetoKoradi, gluPickMatrix применяет преобразование к в настоящее время активная матрица с фиксированной функцией, но, похоже, вы ее не используете. Вы можете извлечь матрицу GL_PROJECTION_MATRIX, построить ее самостоятельно без gluPickMatrix или вернуться к старые шейдеры GL и используйте встроенный gl_ProjectionMatrix.   -  person jozxyqk    schedule 24.02.2015
comment
@jozxyqk Итак, что мне нужно сделать, это извлечь GL_PROJECTION_MATRIX, а затем передать эту матрицу вместе с матрицей модели в шейдер.   -  person Sahar Rabinoviz    schedule 24.02.2015
comment
да, но если вы уже работаете со своими собственными матрицами, создание собственных на основе этого может быть чище. также будьте осторожны с тем, какая матрица активна (в вашем коде glMatrixMode(GL_PROJECTION) отсутствует перед glPushMatrix().   -  person jozxyqk    schedule 24.02.2015
comment
У меня все еще возникают проблемы с тем, что я должен был сгенерировать свою матрицу области просмотра, я проверил, что она движется к изменению области просмотра, но перерисовывается при нажатии, но по какой-то причине это не регистрируется как попадание.   -  person Sahar Rabinoviz    schedule 25.02.2015