使用 lwjgl 使背景闪烁
Make background blink with lwjgl
我已经从 lwjgl.org 网页 (http://www.lwjgl.org/guide) 编译了入门示例,现在我想不断更改为背景颜色。所以,我想要类似闪烁效果的东西。但是当程序为 运行 时,我无法使用 glClearColor
永久切换背景颜色。
我试图在 while 循环中的 loop() 函数中使用 glClearColor
执行此操作。但这似乎是错误的,因为 glClearColor
方法仅在 while 循环之外调用。例如,在下面的代码中,背景颜色采用上次使用 glClearColor
.
调用的颜色
...
private void loop() {
// This line is critical for LWJGL's interoperation with GLFW's
// OpenGL context, or any context that is managed externally.
// LWJGL detects the context that is current in the current thread,
// creates the ContextCapabilities instance and makes the OpenGL
// bindings available for use.
GLContext.createFromCurrent();
// Set the clear color
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// Run the rendering loop until the user has attempted to close
// the window or has pressed the ESCAPE key.
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
/* Switch permanently between red and green background color
- doesn't work, no blinking, just green background color */
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
}
...
我是 lwjgl 的新手,因此我认为我犯了一些基本错误,背景颜色根本不应该像我那样改变。有什么东西可以处理 lwjgl 中的背景来实现这个吗?
我应该提一下,我使用的是 lwjgl 3,而不是 lwjgl 2。似乎不再有显示 Class。 GLFW 似乎可以替代它。
在下面的 while 循环中,认为每次迭代代表您的 1 帧。在您的场景中,您只会在每次迭代后 glfwPollEvents()
调用后看到变化。这就是为什么在一次迭代中改变颜色 2 次不会影响任何东西。
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
/* Switch permanently between red and green background color
- doesn't work, no blinking, just green background color */
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
在下面,我为您的问题写了一个简单的解决方案。如果你在每一帧都改变颜色,你看不到变化,因为它会非常快,所以我做了一个小技巧,每 30 帧改变你的颜色。您可以使用随时间变化的颜色变化而不是帧数来编写替代方案。
正确版本:
boolean redOrGreen = true; // true = Green false = Red
int counter = 0;
int COLORCHANGEAT = 30;
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
counter++;
if(counter == COLORCHANGEAT) {
redOrGreen = !redOrGreen;
counter = counter % COLORCHANGEAT;
}
if(redOrGreen == true)
glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
else
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
我已经从 lwjgl.org 网页 (http://www.lwjgl.org/guide) 编译了入门示例,现在我想不断更改为背景颜色。所以,我想要类似闪烁效果的东西。但是当程序为 运行 时,我无法使用 glClearColor
永久切换背景颜色。
我试图在 while 循环中的 loop() 函数中使用 glClearColor
执行此操作。但这似乎是错误的,因为 glClearColor
方法仅在 while 循环之外调用。例如,在下面的代码中,背景颜色采用上次使用 glClearColor
.
...
private void loop() {
// This line is critical for LWJGL's interoperation with GLFW's
// OpenGL context, or any context that is managed externally.
// LWJGL detects the context that is current in the current thread,
// creates the ContextCapabilities instance and makes the OpenGL
// bindings available for use.
GLContext.createFromCurrent();
// Set the clear color
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// Run the rendering loop until the user has attempted to close
// the window or has pressed the ESCAPE key.
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
/* Switch permanently between red and green background color
- doesn't work, no blinking, just green background color */
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
}
...
我是 lwjgl 的新手,因此我认为我犯了一些基本错误,背景颜色根本不应该像我那样改变。有什么东西可以处理 lwjgl 中的背景来实现这个吗?
我应该提一下,我使用的是 lwjgl 3,而不是 lwjgl 2。似乎不再有显示 Class。 GLFW 似乎可以替代它。
在下面的 while 循环中,认为每次迭代代表您的 1 帧。在您的场景中,您只会在每次迭代后 glfwPollEvents()
调用后看到变化。这就是为什么在一次迭代中改变颜色 2 次不会影响任何东西。
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
/* Switch permanently between red and green background color
- doesn't work, no blinking, just green background color */
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
在下面,我为您的问题写了一个简单的解决方案。如果你在每一帧都改变颜色,你看不到变化,因为它会非常快,所以我做了一个小技巧,每 30 帧改变你的颜色。您可以使用随时间变化的颜色变化而不是帧数来编写替代方案。
正确版本:
boolean redOrGreen = true; // true = Green false = Red
int counter = 0;
int COLORCHANGEAT = 30;
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
counter++;
if(counter == COLORCHANGEAT) {
redOrGreen = !redOrGreen;
counter = counter % COLORCHANGEAT;
}
if(redOrGreen == true)
glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
else
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}