Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL绘制纹理_Java_Opengl_Jogl_Glcanvas - Fatal编程技术网

Java OpenGL绘制纹理

Java OpenGL绘制纹理,java,opengl,jogl,glcanvas,Java,Opengl,Jogl,Glcanvas,我可以在com.jogamp.opengl.awt.GLCanvas上绘制一个纹理,但我想在BuffereImage更改时更新纹理。我编写了如下显示方法: public void display(GLAutoDrawable glAutoDrawable) { try { if (gl2 == null) { gl2 = glAutoDrawable.getGL().getGL2(); // get the Ope

我可以在com.jogamp.opengl.awt.GLCanvas上绘制一个纹理,但我想在BuffereImage更改时更新纹理。我编写了如下显示方法:

    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();
        }
    }
公共空白显示(GLAutoDrawable GLAutoDrawable){
试一试{
如果(gl2==null){
gl2=glAutoDrawable.getGL().getGL2();//获取OpenGL 2图形上下文
}
gl2.glClear(gl2.GL_COLOR_BUFFER_BIT | gl2.GL_DEPTH_BUFFER_BIT);//清除颜色和深度缓冲区
gl2.glLoadIdentity();//重置模型视图矩阵
如果(图像!=null){
如果(图像!=null){
int[]pixels_raw=新int[this.camPanel.width*this.camPanel.height];
pixels_raw=image.getRGB(0,0,this.camPanel.width,this.camPanel.height,null,0,this.camPanel.width);
像素。倒带();
对于(int j=this.camPanel.height-1;j>=0;j--){
for(int i=0;i>16)&0xFF));//红色
像素。放置((字节)((像素>>8)&0xFF));//绿色
pixels.put((字节)((像素>>0)&0xFF));//蓝色
pixels.put((字节)((像素>>24)&0xFF));//ALPHA
}
}
pixels.flip();
//gl2.glBindTexture(gl2.GL_TEXTURE_2D,1);
//gl2.glTexParameterf(gl2.GL_纹理_2D、gl2.GL_纹理_包裹、gl2.GL_重复);
//gl2.glTexParameterf(gl2.GL\u纹理\u 2D,gl2.GL\u纹理\u包裹,gl2.GL\u重复);
//gl2.glTexParameterf(gl2.GL\u纹理\u 2D,gl2.GL\u纹理\u最小\u过滤器,gl2.GL\u最近);
//gl2.glTexParameterf(gl2.GL_纹理_2D,gl2.GL_纹理_贴图过滤器,gl2.GL_最近);
gl2.glTexImage2D(gl2.GL_纹理_2D,0,gl2.GL_RGBA,this.camPanel.width,this.camPanel.height,0,gl2.GL_RGBA,gl2.GL_无符号_字节,像素);
//gl2.glFlush();
System.out.println(“Error”+gl2.glGetError());
像素。清除();
}
gl2.glEnd();
}
}捕获(例外e){
e、 printStackTrace();
}
}
当图像更改时,我调用display metod,但始终存在黑屏并给出错误: “JAWTWindow:曲面更改0x17011262->0x7e011c18”
“Error 1282”

调用
glEnd()
会引发错误。各国:

如果执行glEnd之前没有glBegin,则生成GLENU INVALID_操作


由于代码只包含一个
glEnd()
,但没有
glBegin
,因此此调用无效。

调用
glEnd()
会引发错误。各国:

如果执行glEnd之前没有glBegin,则生成GLENU INVALID_操作


由于代码只包含
glEnd()
但不包含
glBegin
,因此此调用无效。

哪一行给出了
GL\u invalid\u操作
错误?我在代码中没有看到任何draw命令,所以屏幕保持黑色也就不足为奇了。您的源代码实现得很差。你不尊重这些准则。您不能将GL实例存储在类字段中,因为当它们变得无效或在错误的线程上,或者当OpenGL上下文不是当前上下文时,您可能会试图使用它们。此外,您可以使用AWTTextureIO从BufferedImage中获取纹理数据。当然,也许有一个更有效的解决方案,这取决于您的用例。我不确定你是否应该在这里使用glTexImage2D。请发布SSCCE。使用动画师。您不必直接调用display(GLAutoDrawable)。哪一行给出了
GL\u INVALID\u操作
错误?我在代码中没有看到任何draw命令,所以屏幕保持黑色也就不足为奇了。您的源代码实现得很差。你不尊重这些准则。您不能将GL实例存储在类字段中,因为当它们变得无效或在错误的线程上,或者当OpenGL上下文不是当前上下文时,您可能会试图使用它们。此外,您可以使用AWTTextureIO从BufferedImage中获取纹理数据。当然,也许有一个更有效的解决方案,这取决于您的用例。我不确定你是否应该在这里使用glTexImage2D。请发布SSCCE。使用动画师。您不必直接调用display(GLAutoDrawable),这是事实。我更改了代码,没有GL_无效_操作错误。但黑屏问题仍然存在,是否与JAWTWindow:surface change 0x7c011681->0x57011dea有关。@Erkan您在提供的代码中从未绘制任何内容。我建议你打开一个新问题并显示相关的呈现代码,因为在这里发布它很可能会使这个答案无效。这是真的。我更改了代码,没有GL_无效_操作错误。但黑屏问题仍然存在,是否与JAWTWindow:surface change 0x7c011681->0x57011dea有关。@Erkan您在提供的代码中从未绘制任何内容。我建议您打开一个新问题并显示相关的呈现代码,因为在这里发布它很可能会使此答案无效。