2016-07-05 2 views
0

У меня есть кусок кода, который отлично работает под Windows 7 native или Ubuntu 16.04 native, однако с Ubuntu 16.04 внутри VMPlayer 6 с vmwgfx он не обновляется, если вы не перемещаете окно , Точно такой же код во всех трех случаях.JOGL внутри VMWare - обновление текстур не видно

Node это со взрослыми JOGL 1

Код

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 7

Ubuntu 16,04 внутри VMWare

Ubuntu 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: 
+0

Почему бы не использовать обновленные библиотеки? – elect

+0

Это устаревший проект, никто не захочет рисковать миграцией. – Adam

+1

Ребята из JOGL, по сути, не одобряли JOGL 1, потому что новые аппаратные всплывающие ошибки, которые не могли быть исправлены без новых функций, которые вошли в более поздние версии JOGL. Вы почти наверняка сталкиваетесь с одним из этих ошибок. Существует не путь вперед, чтобы найти ошибку самостоятельно и ее исправление. – Gene

ответ

1

Единственный способ передать это перенести существующий код на JOGL2. В этом случае он работает как ожидается в VMWare. Порт для JOGL2 довольно прост.

Смежные вопросы