Java OpenGL绘制纹理
我可以在com.jogamp.opengl.awt.GLCanvas上绘制一个纹理,但我想在BuffereImage更改时更新纹理。我编写了如下显示方法: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
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您在提供的代码中从未绘制任何内容。我建议您打开一个新问题并显示相关的呈现代码,因为在这里发布它很可能会使此答案无效。