VMWare 中的 JOGL - 未看到纹理更新
JOGL inside VMWare - texture updates not seen
我有一段代码在 Windows 7 native 或 Ubuntu 16.04 native 下运行良好,但是在带有 vmwgfx 的 VMPlayer 6 中使用 Ubuntu 16.04 它不会更新,除非你移动 window。在所有 3 种情况下完全相同的代码。
节点这是旧的 JOGL 1
- http://jogamp.org/deployment/archive/master/gluegen-old-1.0b6/gluegen-rt-natives-linux-amd64.jar
- http://jogamp.org/deployment/archive/master/gluegen-old-1.0b6/gluegen-rt.jar
- http://jogamp.org/deployment/archive/master/jogl-old-1.1.1/jogl.jar
- http://jogamp.org/deployment/archive/master/jogl-old-1.1.1/jogl-natives-linux-amd64.jar
代码
public class JoglTest2 {
public static class JoglPanel extends GLJPanel {
public JoglPanel() {
addGLEventListener(new EventListener());
new FPSAnimator(this, 10).start();
}
}
public static class EventListener implements GLEventListener {
private int textureData;
int width = 100;
int height = 200;
private int clock;
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
gl.glClearColor(0.5f, 0, 0.5f, 1);
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, this.textureData);
int[] data = new int[width];
for (int x = 0; x < width; x++) {
int red = (x + clock) % 255;
int green = 0;
int blue = 127;
data[x] = 255 | (blue << 8) | (green << 16) | (red << 24);
}
clock++;
IntBuffer dataBuffer = IntBuffer.wrap(data);
gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, (clock % height), width, 1, GL.GL_RGBA,
GL.GL_UNSIGNED_INT_8_8_8_8, dataBuffer);
gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2f(0f, 0f);
gl.glVertex2f(-1.0f, -1.0f);
gl.glTexCoord2f(0f, 1.0f);
gl.glVertex2f(-1.0f, 1.0f);
gl.glTexCoord2f(1.0f, 1.0f);
gl.glVertex2f(1.0f, 1.0f);
gl.glTexCoord2f(1.0f, 0);
gl.glVertex2f(1.f, -1.0f);
gl.glEnd();
}
@Override
public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
}
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
final int[] tmp = new int[1];
gl.glGenTextures(1, tmp, 0);
textureData = tmp[0];
int[] data = new int[width * height];
IntBuffer dataBuffer = IntBuffer.wrap(data);
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glBindTexture(GL.GL_TEXTURE_2D, this.textureData);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_INT_8_8_8_8,
dataBuffer);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S,
GL.GL_CLAMP_TO_EDGE);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T,
GL.GL_CLAMP_TO_EDGE);
int shaderId = gl.glCreateShader(GL.GL_FRAGMENT_SHADER);
final String[] strs = { "uniform sampler2D inputTexture;\n"+
"void main(void) {\n" +
" gl_FragColor = texture2D(inputTexture, gl_TexCoord[0].st);\n" +
"}\n"
};
gl.glShaderSource(shaderId, strs.length, strs, (int[]) null, 0);
gl.glCompileShader(shaderId);
int progId = gl.glCreateProgram();
gl.glAttachShader(progId, shaderId);
gl.glLinkProgram(progId);
int uniformInputTexture = gl.glGetUniformLocation(progId, "inputTexture");
gl.glUseProgram(progId);
gl.glUniform1i(uniformInputTexture, 0);
}
@Override
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JoglPanel());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
Windows
Ubuntu VMWare 中的 16.04
我花了很多时间查看有关如何执行此操作的指南,但在 Linux 中找不到导致它失败的问题。其他 OpenGL 应用程序、glxgears 等工作正常...
glxinfo | grep -i opengl
OpenGL vendor string: VMware, Inc.
OpenGL renderer string: Gallium 0.4 on SVGA3D; build: RELEASE; LLVM;
OpenGL version string: 2.1 Mesa 11.2.0
OpenGL shading language version string: 1.20
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 2.0 Mesa 11.2.0
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16
OpenGL ES profile extensions:
唯一的转发方式是将现有代码迁移到JOGL2。在这种情况下,它在 VMWare 中按预期执行。移植到 JOGL2 相当简单。
我有一段代码在 Windows 7 native 或 Ubuntu 16.04 native 下运行良好,但是在带有 vmwgfx 的 VMPlayer 6 中使用 Ubuntu 16.04 它不会更新,除非你移动 window。在所有 3 种情况下完全相同的代码。
节点这是旧的 JOGL 1
- http://jogamp.org/deployment/archive/master/gluegen-old-1.0b6/gluegen-rt-natives-linux-amd64.jar
- http://jogamp.org/deployment/archive/master/gluegen-old-1.0b6/gluegen-rt.jar
- http://jogamp.org/deployment/archive/master/jogl-old-1.1.1/jogl.jar
- http://jogamp.org/deployment/archive/master/jogl-old-1.1.1/jogl-natives-linux-amd64.jar
代码
public class JoglTest2 {
public static class JoglPanel extends GLJPanel {
public JoglPanel() {
addGLEventListener(new EventListener());
new FPSAnimator(this, 10).start();
}
}
public static class EventListener implements GLEventListener {
private int textureData;
int width = 100;
int height = 200;
private int clock;
@Override
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
gl.glClearColor(0.5f, 0, 0.5f, 1);
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, this.textureData);
int[] data = new int[width];
for (int x = 0; x < width; x++) {
int red = (x + clock) % 255;
int green = 0;
int blue = 127;
data[x] = 255 | (blue << 8) | (green << 16) | (red << 24);
}
clock++;
IntBuffer dataBuffer = IntBuffer.wrap(data);
gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, (clock % height), width, 1, GL.GL_RGBA,
GL.GL_UNSIGNED_INT_8_8_8_8, dataBuffer);
gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2f(0f, 0f);
gl.glVertex2f(-1.0f, -1.0f);
gl.glTexCoord2f(0f, 1.0f);
gl.glVertex2f(-1.0f, 1.0f);
gl.glTexCoord2f(1.0f, 1.0f);
gl.glVertex2f(1.0f, 1.0f);
gl.glTexCoord2f(1.0f, 0);
gl.glVertex2f(1.f, -1.0f);
gl.glEnd();
}
@Override
public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
}
@Override
public void init(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
final int[] tmp = new int[1];
gl.glGenTextures(1, tmp, 0);
textureData = tmp[0];
int[] data = new int[width * height];
IntBuffer dataBuffer = IntBuffer.wrap(data);
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glBindTexture(GL.GL_TEXTURE_2D, this.textureData);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_INT_8_8_8_8,
dataBuffer);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,
GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,
GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S,
GL.GL_CLAMP_TO_EDGE);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T,
GL.GL_CLAMP_TO_EDGE);
int shaderId = gl.glCreateShader(GL.GL_FRAGMENT_SHADER);
final String[] strs = { "uniform sampler2D inputTexture;\n"+
"void main(void) {\n" +
" gl_FragColor = texture2D(inputTexture, gl_TexCoord[0].st);\n" +
"}\n"
};
gl.glShaderSource(shaderId, strs.length, strs, (int[]) null, 0);
gl.glCompileShader(shaderId);
int progId = gl.glCreateProgram();
gl.glAttachShader(progId, shaderId);
gl.glLinkProgram(progId);
int uniformInputTexture = gl.glGetUniformLocation(progId, "inputTexture");
gl.glUseProgram(progId);
gl.glUniform1i(uniformInputTexture, 0);
}
@Override
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JoglPanel());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
Windows
Ubuntu VMWare 中的 16.04
我花了很多时间查看有关如何执行此操作的指南,但在 Linux 中找不到导致它失败的问题。其他 OpenGL 应用程序、glxgears 等工作正常...
glxinfo | grep -i opengl
OpenGL vendor string: VMware, Inc.
OpenGL renderer string: Gallium 0.4 on SVGA3D; build: RELEASE; LLVM;
OpenGL version string: 2.1 Mesa 11.2.0
OpenGL shading language version string: 1.20
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 2.0 Mesa 11.2.0
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16
OpenGL ES profile extensions:
唯一的转发方式是将现有代码迁移到JOGL2。在这种情况下,它在 VMWare 中按预期执行。移植到 JOGL2 相当简单。