当前位置: 首页 > 知识库问答 >
问题:

VMWare内的JOGL-没有看到纹理更新

陆绪
2023-03-14

我有一段代码可以在Windows7本机或Ubuntu16.04本机下正常工作,但是在VMPlayer6中使用Ubuntu16.04和vmwgfx,除非移动窗口,否则它不会更新。三种情况下的代码完全相同。

节点这是旧的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);
    }
}

我花了很多时间研究如何做到这一点的指南,但找不到导致它在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:

共有1个答案

殳俊
2023-03-14

前进的唯一方法是将现有代码迁移到JOGL2。在本例中,它在VMware中的表现与预期一致。到JOGL2的端口相当简单。

 类似资料:
  • 最近我发现了一个OpenGL示例,它应用纹理而没有指定纹理图像单元并且没有将相应的单元整数均匀发送到着色器中,是否可以在不使用纹理单元的情况下应用纹理??或者它只是为活动纹理单元及其着色器采样器值使用默认值。 我的代码块(纹理相关): 我的片段着色器:

  • 问题内容: 我使用jQuery通过json请求从数据库检索内容。然后,它将HTML中的通配符(如%title%)替换为实际内容。这很好用,这样我就可以在数据库中维护多语言文本,但是Googlebot只看到通配符,而不是实际内容。我知道Googlebot可以看到没有javascript的页面,但是有没有办法解决这个问题?谢谢! 问题答案: 您应该在Google上仔细阅读本文档。 它讨论了如何使Goo

  • 问题内容: 我正在为GlassFish 2.1.1(据我所知JavaEE 5,JPA 1.0)编写一些应用程序。我的servlet中有以下代码(我主要从Internet上的某些示例借来的): 包含以下内容: 问题是,em看不到另一个外部事务中所做的更改。大致来说,我从Web浏览器向Servlet发出请求,查看数据,在SQL控制台中执行一些DML,重新加载Servlet页面- 它没有显示任何更改。我

  • 也许,我搜索了所有的互联网,但我一定错过了什么。 我根据文档配置Log4j2和Commons日志。我添加了,但其配置对应用程序输出没有影响。我看Log4j没有读这个文件。这是我的配置: pom.xml \src\main\资源\log4j2.xml 在任何类中-例如A类 应用程序具有函数,因此可以由IDE或mvn exec:java运行。 问题: 日志记录正在工作-但使用默认方式。 正如您在文件中

  • 当我使用Git Bash(在Windows上)时,我不能在不指定其完整路径的情况下运行任何可执行文件,尽管它位于我的PATH变量中的文件夹中。看来巴什不认识它。为什么啊?我能修好它吗?