Вызов 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 является буфером чтения по умолчанию для поверхности визуализации с двойной буферизацией по умолчанию.

Другие вопросы по тегам