【问题标题】:JOGL glDrawArrays doesn't work after calling glClear(GL_COLOR_BUFFER_BIT)调用 glClear(GL_COLOR_BUFFER_BIT) 后 JOGL glDrawArrays 不起作用
【发布时间】:2021-05-24 10:56:28
【问题描述】:

关于 reshape 方法(GLEventListener)的openGL初始化代码:

    public void reshape(GLAutoDrawable glautodrawable, int x, int y, int width, int height) {
        final GL2 gl = glautodrawable.getGL().getGL2();

        //gl.glFrontFace(GL2.GL_CW);
        gl.glEnable(GL2.GL_DEPTH_TEST);
        gl.glDepthMask(true);
        gl.glClearDepth(1.0);
        gl.glDepthFunc(GL2.GL_ALWAYS);
        gl.glColorMask(true, true, true, true);
        gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
        gl.glClearColor(0.0f, 1.0f, 0.0f, 0.5f);
        
        //build Buffers, program and extra;
    }

没有清除颜色缓冲区的显示方法。我用的是 FPS Animator。

    public void display( GLAutoDrawable drawable ) {
        final GL2 gl = drawable.getGL().getGL2();
        gl.glClear(GL2.GL_DEPTH_BUFFER_BIT);

        float time = (float)(System.currentTimeMillis() - startTime) / 1000.0f;
        System.out.println("Time: " + time);
        gl.glUniform1f(0, time);
        gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4);
    }

结果:



清除缓冲区的显示方法:

    public void display( GLAutoDrawable drawable ) {
        final GL2 gl = drawable.getGL().getGL2();
        gl.glClear(GL2.GL_DEPTH_BUFFER_BIT | GL2.GL_COLOR_BUFFER_BIT);

        float time = (float)(System.currentTimeMillis() - startTime) / 1000.0f;
        System.out.println("Time: " + time);
        gl.glUniform1f(0, time);
        gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4);
    }

结果:



所以我想,结果应该是一样的,因为我清除了缓冲区然后画了一个正方形。但正如您在上面的结果中看到的那样,只有绿色透明色。

统一位置 0 是片段着色器中的浮点变量“时间”,它影响正方形中星星的亮度。但它并没有像我预期的那样随着时间而改变。 但是只有第一次调用 glUniform1f() 是这样应用的(gl.glUniform1f(0, 20)):

有趣的是,当我在互联网上使用 glClear(GL_COLOR_BUFFER_BIT) 尝试示例时,它工作正常。

   public void display( GLAutoDrawable drawable ) {

       final GL2 gl = drawable.getGL().getGL2();

       gl.glClear(GL2.GL_DEPTH_BUFFER_BIT | GL2.GL_COLOR_BUFFER_BIT);

       gl.glBegin( GL2.GL_TRIANGLES );

       gl.glColor3f( 1.0f, 0.0f, 0.0f );   // Red
       gl.glVertex3f( 0.5f,0.7f,0.0f );    // Top
       gl.glColor3f( 0.0f,1.0f,0.0f );     // blue
       gl.glVertex3f( -0.2f,-0.50f,0.0f ); // Bottom Left
       gl.glColor3f( 0.0f,0.0f,1.0f );     // green
       gl.glVertex3f( 0.5f,-0.5f,0.0f );   // Bottom Right

       gl.glEnd();
       gl.glFlush();
   }

结果:


我的代码有什么问题?还是版本问题或错误?为什么示例工作正常但我的不是?
或者有没有办法检查实际发生了什么/调试?

【问题讨论】:

    标签: java graphics fragment-shader jogl


    【解决方案1】:

    寻找一些使用 glDrawArrays 或 glDrawElements 的示例,我找到了这个。

    github link

    与我的代码的区别在于两行:

    //after rendering in display method
    gl.glUseProgram(0);
    gl.glBindVertexArray(0);
    

    在我的代码中添加两行后,它按我的预期工作。在 glClear(GL_COLOR_BUFFER_BIT) 之后绘制的正方形可以正常工作,并且统一值会按照我的预期随时间变化。 但我不确定为什么这是我的问题的解决方案。因为当我在 C++ 中使用 openGL 时,代码可以正常工作,而无需添加刚刚添加的两行代码。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多