Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL先画一条线,然后画一个正方形_Java_Opengl_Lwjgl_Game Loop - Fatal编程技术网

Java OpenGL先画一条线,然后画一个正方形

Java OpenGL先画一条线,然后画一个正方形,java,opengl,lwjgl,game-loop,Java,Opengl,Lwjgl,Game Loop,我在管理我的代码和想象一个好的设计时遇到了问题。我想做的只是先画一条线,然后在线被渲染后,画正方形,使其部分重叠线,然后继续这样做 我创建了两个类,行和正方形。我在主类中设置并绑定了VAO和VBO。在我的lines and squares类中,我只将数据传递到此缓冲区,并在其draw()方法中对VertexAttributePointer和GlDrawArrays进行适当的调用 在main类中有一个主游戏循环,它无限运行,直到用户关闭窗口。现在我要做的是调用Update()方法中的line和Sq

我在管理我的代码和想象一个好的设计时遇到了问题。我想做的只是先画一条线,然后在线被渲染后,画正方形,使其部分重叠线,然后继续这样做

我创建了两个类,
正方形
。我在主类中设置并绑定了VAO和VBO。在我的lines and squares类中,我只将数据传递到此缓冲区,并在其
draw()
方法中对
VertexAttributePointer
GlDrawArrays
进行适当的调用

在main类中有一个主游戏循环,它无限运行,直到用户关闭窗口。现在我要做的是调用
Update()
方法中的
line
Squares
draw()
方法。然后调用
Render()
,它只交换缓冲区和轮询事件。基本上,草图是

while(window_close != true)
{   
    update();
    render();
}

public void update()
{
   GL11.glClearColor(0.2f,0.4f,0.3f, 1);
   GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);  
   lines.draw();  // object of Lines class
   squares.draw();   // object of Squares class
}

public void render()
{
   swapbuffers(); 
}
但有一个问题,因为更新是在一个循环中,它会将行数据馈送到缓冲区,然后它会用1覆盖该数据。我希望它交替渲染线,然后是正方形。因此,我认为在每个类中都有一个标志。在
draw()
方法提供数据之前,它们会检查渲染的是哪一个,然后相应地绘制,否则返回而不执行任何操作

此外,由于在
Update()
开始时背景已清除,因此我需要绘制线条,渲染它,然后绘制正方形,并在清除背景之前进行渲染。我知道我能做到

while(window_close != true)
{  
   GL11.glClearColor(0.2f,0.4f,0.3f, 1);
   GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);   
   lines.draw();
   render();
   squares.draw();
}

这没关系,但对于更大的项目来说,它会变得丑陋。我必须另外编写
render()

到底是什么问题?你现在所做的是大多数人都做的我不知道。。我想一定有其他方法,这样在调用
render()
之后我就不必做任何事情了,一切都由
update()
Ahhh waitwait来管理,我很难理解问题出在哪里。你想要的是交替交换缓冲区?@fordcars-现在检查我原来的问题。最后一段代码就是我想要的。但是我想用另一种方式来做,这样所有对
draw()
的调用都在update方法中。好吧,呃,你不应该有这个问题!我会尽量简短地解释它
swapBuffers()
通常不会以这种方式执行任何操作。当您调用类似于
glDrawArrays()
的任何函数时,OpenGL会将内容绘制到帧缓冲区中。因此,您可以画一条线,然后再画一个正方形,因为它只会修改形状实际所在的帧缓冲区(因此它会像您所希望的那样重叠)。然后,
swapBuffers()
所做的就是逐像素地将帧缓冲区中的所有内容复制到屏幕上。