Текстуры рисования Java OpenGL

Я могу нарисовать одну текстуру на com.jogamp.opengl.awt.GLCanvas, но я хочу обновить текстуру при изменении буферизованного изображения. Я написал метод отображения следующим образом:

    public void display(GLAutoDrawable glAutoDrawable) {
        try {
            if (gl2 == null) {
                gl2 = glAutoDrawable.getGL().getGL2();  // get the OpenGL 2 graphics context
            }
            gl2.glClear(gl2.GL_COLOR_BUFFER_BIT | gl2.GL_DEPTH_BUFFER_BIT); // clear color and depth buffers
            gl2.glLoadIdentity();  // reset the model-view matrix


            if (image != null) {

                if (image != null) {
                    int[] pixels_raw = new int[this.camPanel.width * this.camPanel.height];
                    pixels_raw = image.getRGB(0, 0, this.camPanel.width, this.camPanel.height, null, 0, this.camPanel.width);

                    pixels.rewind();
                    for (int j = this.camPanel.height - 1; j >= 0; j--) {
                        for (int i = 0; i < this.camPanel.width; i++) {
                            int pixel = pixels_raw[j * this.camPanel.width + i];
                            pixels.put((byte) ((pixel >> 16) & 0xFF));//RED
                            pixels.put((byte) ((pixel >> 8) & 0xFF));//GREEN
                            pixels.put((byte) ((pixel >> 0) & 0xFF));//BLUE
                            pixels.put((byte) ((pixel >> 24) & 0xFF));//ALPHA
                        }
                    }

                    pixels.flip();

//                    gl2.glBindTexture(gl2.GL_TEXTURE_2D, 1);
//                    gl2.glTexParameterf(gl2.GL_TEXTURE_2D, gl2.GL_TEXTURE_WRAP_S, gl2.GL_REPEAT);
//                    gl2.glTexParameterf(gl2.GL_TEXTURE_2D, gl2.GL_TEXTURE_WRAP_T, gl2.GL_REPEAT);
//                    gl2.glTexParameterf(gl2.GL_TEXTURE_2D, gl2.GL_TEXTURE_MIN_FILTER, gl2.GL_NEAREST);
//                    gl2.glTexParameterf(gl2.GL_TEXTURE_2D, gl2.GL_TEXTURE_MAG_FILTER, gl2.GL_NEAREST);
                    gl2.glTexImage2D(gl2.GL_TEXTURE_2D, 0, gl2.GL_RGBA, this.camPanel.width, this.camPanel.height, 0, gl2.GL_RGBA, gl2.GL_UNSIGNED_BYTE, pixels);
//                    gl2.glFlush();
                    System.out.println("Error " + gl2.glGetError());

                    pixels.clear();
                }
                gl2.glEnd();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Когда изображение изменилось, я вызываю метод отображения, но всегда черный экран и выдает ошибку: «JAWTWindow: изменение поверхности 0x17011262 -> 0x7e011c18» «Ошибка 1282»


person Erkan    schedule 19.03.2018    source источник
comment
Какая строка выдает ошибку GL_INVALID_OPERATION? И я не вижу в коде команды рисования, поэтому неудивительно, что экраны остаются черными.   -  person BDL    schedule 19.03.2018
comment
Ваш исходный код плохо реализован. Вы не соблюдаете руководящие принципы. Вы НЕ должны хранить экземпляры GL в полях класса, так как у вас может возникнуть соблазн использовать их, когда они стали недействительными или в неправильном потоке, или когда контекст OpenGL не является текущим. Более того, вы можете использовать AWTTextureIO для получения TextureData из вашего BufferedImage. Конечно, возможно, есть гораздо более эффективное решение, это зависит от вашего варианта использования. Я не уверен, что здесь следует использовать glTexImage2D.   -  person gouessej    schedule 20.03.2018
comment
Пожалуйста, опубликуйте SSCCE. Воспользуйтесь аниматором. Вам не нужно напрямую вызывать display(GLAutoDrawable).   -  person gouessej    schedule 20.03.2018


Ответы (1)


Ошибка возникает при вызове glEnd(). В документах указано:

GL_INVALID_OPERATION генерируется, если glEnd выполняется без предшествующего glBegin.

Поскольку код содержит только glEnd(), но не содержит glBegin, этот вызов недействителен.

person BDL    schedule 19.03.2018
comment
Это правда. Я изменил код, и ошибки GL_INVALID_OPERATION нет. Но проблема с черным экраном продолжается, может ли это быть связано с JAWTWindow: изменение поверхности 0x7c011681 -> 0x57011dea. - person Erkan; 19.03.2018
comment
@Erkan Вы никогда ничего не рисуете в предоставленном вами коде. Я бы посоветовал вам открыть новый вопрос и показать соответствующий код рендеринга, поскольку его размещение здесь, скорее всего, сделает этот ответ недействительным. - person BDL; 20.03.2018