Вызов glReadPixels в пределах display() JOGL
Я пытаюсь осуществить выбор объекта. У меня есть код для отображения объектов в виде сплошных, неосвещенных цветов, затем я читаю пиксели в буфере экрана. Я интерпретирую показания glReadPixels()
определить, на каком объекте находится курсор в данный момент. Наконец, я перерисовываю все освещенным, текстурированным и раскрашенным.
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
//Picking render goes here...
gl.glPopMatrix();
//The following code reads the current pixel color at the center of the screen
FloatBuffer buffer = FloatBuffer.allocate(4);
gl.glReadBuffer(GL_FRONT);
gl.glReadPixels(drawable.getWidth() / 2, drawable.getHeight() / 2, 1, 1, GL_RGBA, GL_FLOAT, buffer);
float[] pixels = new float[3];
pixels = buffer.array();
float red = pixels[0];
float green = pixels[1];
float blue = pixels[2];
System.out.println(red + ", " + green + ", " + blue);
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
//Final render goes here...
gl.glPopMatrix();
Проблема в том, что призыв к glReadPixels()
возвращает мне пиксельный цвет финального рендера, а не рендеринга рендеринга. Я был бы признателен за объяснение того, как читать пиксели рендеринга комплектации.
Я знаю, что могу использовать стек имен OpenGL, но, честно говоря, я нахожу это неудобным и нелепым.
1 ответ
Проблема в том, что вы рендеритесь в задний буфер, но ваш glReadPixels()
вызов читает из переднего буфера. Если вы визуализируете на поверхность с двойной буферизацией (что почти всегда требуется при использовании OpenGL), ваш рендеринг по умолчанию переходит в задний буфер. У вас есть этот вызов в вашем коде:
gl.glReadBuffer(GL_FRONT);
Это говорит о следующем glReadPixels()
вызовите чтение из переднего буфера, который является буфером, к которому вы не рисуете.
Вы должны быть в состоянии просто удалить glReadBuffer()
позвони, как GL_BACK
является буфером чтения по умолчанию для поверхности визуализации с двойной буферизацией по умолчанию.