JOGL glDrawArrays 在调用 glClear(GL_COLOR_BUFFER_BIT) 后不起作用
JOGL glDrawArrays doesn't work after calling glClear(GL_COLOR_BUFFER_BIT)
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);
}
结果:
所以我想,结果应该是一样的,因为我清除了缓冲区,然后画了一个正方形。但是正如你在上面的结果中看到的,只有绿色清晰的颜色。
uniform location 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();
}
结果:
我的代码有什么问题?还是版本问题或错误?为什么示例工作正常但我的不是?
或者有没有办法检查 happening/debugging 实际上是什么?
寻找一些使用 glDrawArrays 或 glDrawElements 的示例,我找到了这个。
与我的代码不同的是两行:
//after rendering in display method
gl.glUseProgram(0);
gl.glBindVertexArray(0);
在我的代码中添加两行后,它按我的预期工作。在 glClear(GL_COLOR_BUFFER_BIT) 之后绘制的正方形工作正常,并且统一值按我的预期改变超时。
但我不确定为什么这是我的问题的解决方案。因为当我在 C++ 中使用 openGL 时,代码可以正常工作而无需添加两行代码。
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);
}
结果:
所以我想,结果应该是一样的,因为我清除了缓冲区,然后画了一个正方形。但是正如你在上面的结果中看到的,只有绿色清晰的颜色。
uniform location 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();
}
结果:
我的代码有什么问题?还是版本问题或错误?为什么示例工作正常但我的不是?
或者有没有办法检查 happening/debugging 实际上是什么?
寻找一些使用 glDrawArrays 或 glDrawElements 的示例,我找到了这个。
与我的代码不同的是两行:
//after rendering in display method
gl.glUseProgram(0);
gl.glBindVertexArray(0);
在我的代码中添加两行后,它按我的预期工作。在 glClear(GL_COLOR_BUFFER_BIT) 之后绘制的正方形工作正常,并且统一值按我的预期改变超时。 但我不确定为什么这是我的问题的解决方案。因为当我在 C++ 中使用 openGL 时,代码可以正常工作而无需添加两行代码。