Render a frame on demand
I'm currently creating a NTSC signal decoder/simulator, and basically, I'd like to be able to prepare a frame before rendering it, such as, read an array, process data, draw some pixels accordingly, and then render the frame. I've tried getting rid of the glutMainLoop();
thing, and just using a handmade loop:
for(;;) {
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
This, however, doesn't work, glClearColor
and glClear
, probably also glFlush
get executed, but just one time, after that, the program just hangs, what can I do to avoid this?
c++ opengl glut
add a comment |
I'm currently creating a NTSC signal decoder/simulator, and basically, I'd like to be able to prepare a frame before rendering it, such as, read an array, process data, draw some pixels accordingly, and then render the frame. I've tried getting rid of the glutMainLoop();
thing, and just using a handmade loop:
for(;;) {
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
This, however, doesn't work, glClearColor
and glClear
, probably also glFlush
get executed, but just one time, after that, the program just hangs, what can I do to avoid this?
c++ opengl glut
2
There's usually some sort of SwapBuffers function you have to call after rendering a frame. It's platform specific though, not part of GL itself.
– immibis
Oct 24 '18 at 3:10
2
What function is it hanging on? You've got an infinite loop and you've removed the main event loop, so it's probably not getting update events.
– user1118321
Oct 24 '18 at 4:23
I can not tell if you are using Legacy OpenGL such as OpenGL 1 which in todays time is considered deprecated or if you are using modern OpenGL at least version 3.3+ up to current 4.6. Regardless of which version you are using; this webpage from this online tutorial for OpenGL gives a very good description of Frame Buffers in OpenGL! learnopengl.com/Advanced-OpenGL/Framebuffers
– Francis Cugler
Oct 24 '18 at 5:29
add a comment |
I'm currently creating a NTSC signal decoder/simulator, and basically, I'd like to be able to prepare a frame before rendering it, such as, read an array, process data, draw some pixels accordingly, and then render the frame. I've tried getting rid of the glutMainLoop();
thing, and just using a handmade loop:
for(;;) {
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
This, however, doesn't work, glClearColor
and glClear
, probably also glFlush
get executed, but just one time, after that, the program just hangs, what can I do to avoid this?
c++ opengl glut
I'm currently creating a NTSC signal decoder/simulator, and basically, I'd like to be able to prepare a frame before rendering it, such as, read an array, process data, draw some pixels accordingly, and then render the frame. I've tried getting rid of the glutMainLoop();
thing, and just using a handmade loop:
for(;;) {
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
This, however, doesn't work, glClearColor
and glClear
, probably also glFlush
get executed, but just one time, after that, the program just hangs, what can I do to avoid this?
c++ opengl glut
c++ opengl glut
asked Oct 24 '18 at 1:55
AurealAureal
345
345
2
There's usually some sort of SwapBuffers function you have to call after rendering a frame. It's platform specific though, not part of GL itself.
– immibis
Oct 24 '18 at 3:10
2
What function is it hanging on? You've got an infinite loop and you've removed the main event loop, so it's probably not getting update events.
– user1118321
Oct 24 '18 at 4:23
I can not tell if you are using Legacy OpenGL such as OpenGL 1 which in todays time is considered deprecated or if you are using modern OpenGL at least version 3.3+ up to current 4.6. Regardless of which version you are using; this webpage from this online tutorial for OpenGL gives a very good description of Frame Buffers in OpenGL! learnopengl.com/Advanced-OpenGL/Framebuffers
– Francis Cugler
Oct 24 '18 at 5:29
add a comment |
2
There's usually some sort of SwapBuffers function you have to call after rendering a frame. It's platform specific though, not part of GL itself.
– immibis
Oct 24 '18 at 3:10
2
What function is it hanging on? You've got an infinite loop and you've removed the main event loop, so it's probably not getting update events.
– user1118321
Oct 24 '18 at 4:23
I can not tell if you are using Legacy OpenGL such as OpenGL 1 which in todays time is considered deprecated or if you are using modern OpenGL at least version 3.3+ up to current 4.6. Regardless of which version you are using; this webpage from this online tutorial for OpenGL gives a very good description of Frame Buffers in OpenGL! learnopengl.com/Advanced-OpenGL/Framebuffers
– Francis Cugler
Oct 24 '18 at 5:29
2
2
There's usually some sort of SwapBuffers function you have to call after rendering a frame. It's platform specific though, not part of GL itself.
– immibis
Oct 24 '18 at 3:10
There's usually some sort of SwapBuffers function you have to call after rendering a frame. It's platform specific though, not part of GL itself.
– immibis
Oct 24 '18 at 3:10
2
2
What function is it hanging on? You've got an infinite loop and you've removed the main event loop, so it's probably not getting update events.
– user1118321
Oct 24 '18 at 4:23
What function is it hanging on? You've got an infinite loop and you've removed the main event loop, so it's probably not getting update events.
– user1118321
Oct 24 '18 at 4:23
I can not tell if you are using Legacy OpenGL such as OpenGL 1 which in todays time is considered deprecated or if you are using modern OpenGL at least version 3.3+ up to current 4.6. Regardless of which version you are using; this webpage from this online tutorial for OpenGL gives a very good description of Frame Buffers in OpenGL! learnopengl.com/Advanced-OpenGL/Framebuffers
– Francis Cugler
Oct 24 '18 at 5:29
I can not tell if you are using Legacy OpenGL such as OpenGL 1 which in todays time is considered deprecated or if you are using modern OpenGL at least version 3.3+ up to current 4.6. Regardless of which version you are using; this webpage from this online tutorial for OpenGL gives a very good description of Frame Buffers in OpenGL! learnopengl.com/Advanced-OpenGL/Framebuffers
– Francis Cugler
Oct 24 '18 at 5:29
add a comment |
1 Answer
1
active
oldest
votes
I've tried getting rid of the
glutMainLoop();
thing, and just using a handmade loop
... after that, the program just hangs ...
This is a bad idea, because in general the only way to get a event handling when using GLUT is glutMainLoop()
.
See glutMainLoop
:
glutMainLoop
enters the GLUT event processing loop. This routine should be called at most once in a GLUT program. Once called, this routine will never return. It will call as necessary any callbacks that have been registered.
Note, glutMainLoop()
doesn't only call the call back function which you have set by glutDisplayFunc
, it also receives and processes the IO events like mouse and keyboard events. If you don't use the glutMainLoop()
, then you have no event handling and of course no IO event handling. This causes that the program seems to hang and doesn't react on any input.
Either you have to use glutMainLoop()
or you have to switch a other window API like GLFW, where you can explicitly activate the event processing by glfwPollEvents()
Newer implementations of GLUT, like freeglut provide some additional functionality. glutMainLoopEvent()
does the same as glutMainLoop()
, but it does it only once. It does a single iteration of the event loop and gives control back immediately. So you can implement your own loop handles your application.
e.g.
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
It is even possible to set a dummy display function, which does nothing, and do the drawing in the loop:
e.g.
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52960066%2frender-a-frame-on-demand%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I've tried getting rid of the
glutMainLoop();
thing, and just using a handmade loop
... after that, the program just hangs ...
This is a bad idea, because in general the only way to get a event handling when using GLUT is glutMainLoop()
.
See glutMainLoop
:
glutMainLoop
enters the GLUT event processing loop. This routine should be called at most once in a GLUT program. Once called, this routine will never return. It will call as necessary any callbacks that have been registered.
Note, glutMainLoop()
doesn't only call the call back function which you have set by glutDisplayFunc
, it also receives and processes the IO events like mouse and keyboard events. If you don't use the glutMainLoop()
, then you have no event handling and of course no IO event handling. This causes that the program seems to hang and doesn't react on any input.
Either you have to use glutMainLoop()
or you have to switch a other window API like GLFW, where you can explicitly activate the event processing by glfwPollEvents()
Newer implementations of GLUT, like freeglut provide some additional functionality. glutMainLoopEvent()
does the same as glutMainLoop()
, but it does it only once. It does a single iteration of the event loop and gives control back immediately. So you can implement your own loop handles your application.
e.g.
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
It is even possible to set a dummy display function, which does nothing, and do the drawing in the loop:
e.g.
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}
add a comment |
I've tried getting rid of the
glutMainLoop();
thing, and just using a handmade loop
... after that, the program just hangs ...
This is a bad idea, because in general the only way to get a event handling when using GLUT is glutMainLoop()
.
See glutMainLoop
:
glutMainLoop
enters the GLUT event processing loop. This routine should be called at most once in a GLUT program. Once called, this routine will never return. It will call as necessary any callbacks that have been registered.
Note, glutMainLoop()
doesn't only call the call back function which you have set by glutDisplayFunc
, it also receives and processes the IO events like mouse and keyboard events. If you don't use the glutMainLoop()
, then you have no event handling and of course no IO event handling. This causes that the program seems to hang and doesn't react on any input.
Either you have to use glutMainLoop()
or you have to switch a other window API like GLFW, where you can explicitly activate the event processing by glfwPollEvents()
Newer implementations of GLUT, like freeglut provide some additional functionality. glutMainLoopEvent()
does the same as glutMainLoop()
, but it does it only once. It does a single iteration of the event loop and gives control back immediately. So you can implement your own loop handles your application.
e.g.
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
It is even possible to set a dummy display function, which does nothing, and do the drawing in the loop:
e.g.
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}
add a comment |
I've tried getting rid of the
glutMainLoop();
thing, and just using a handmade loop
... after that, the program just hangs ...
This is a bad idea, because in general the only way to get a event handling when using GLUT is glutMainLoop()
.
See glutMainLoop
:
glutMainLoop
enters the GLUT event processing loop. This routine should be called at most once in a GLUT program. Once called, this routine will never return. It will call as necessary any callbacks that have been registered.
Note, glutMainLoop()
doesn't only call the call back function which you have set by glutDisplayFunc
, it also receives and processes the IO events like mouse and keyboard events. If you don't use the glutMainLoop()
, then you have no event handling and of course no IO event handling. This causes that the program seems to hang and doesn't react on any input.
Either you have to use glutMainLoop()
or you have to switch a other window API like GLFW, where you can explicitly activate the event processing by glfwPollEvents()
Newer implementations of GLUT, like freeglut provide some additional functionality. glutMainLoopEvent()
does the same as glutMainLoop()
, but it does it only once. It does a single iteration of the event loop and gives control back immediately. So you can implement your own loop handles your application.
e.g.
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
It is even possible to set a dummy display function, which does nothing, and do the drawing in the loop:
e.g.
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}
I've tried getting rid of the
glutMainLoop();
thing, and just using a handmade loop
... after that, the program just hangs ...
This is a bad idea, because in general the only way to get a event handling when using GLUT is glutMainLoop()
.
See glutMainLoop
:
glutMainLoop
enters the GLUT event processing loop. This routine should be called at most once in a GLUT program. Once called, this routine will never return. It will call as necessary any callbacks that have been registered.
Note, glutMainLoop()
doesn't only call the call back function which you have set by glutDisplayFunc
, it also receives and processes the IO events like mouse and keyboard events. If you don't use the glutMainLoop()
, then you have no event handling and of course no IO event handling. This causes that the program seems to hang and doesn't react on any input.
Either you have to use glutMainLoop()
or you have to switch a other window API like GLFW, where you can explicitly activate the event processing by glfwPollEvents()
Newer implementations of GLUT, like freeglut provide some additional functionality. glutMainLoopEvent()
does the same as glutMainLoop()
, but it does it only once. It does a single iteration of the event loop and gives control back immediately. So you can implement your own loop handles your application.
e.g.
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
It is even possible to set a dummy display function, which does nothing, and do the drawing in the loop:
e.g.
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}
edited 2 days ago
answered Oct 24 '18 at 18:52
Rabbid76Rabbid76
34.9k113146
34.9k113146
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52960066%2frender-a-frame-on-demand%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
There's usually some sort of SwapBuffers function you have to call after rendering a frame. It's platform specific though, not part of GL itself.
– immibis
Oct 24 '18 at 3:10
2
What function is it hanging on? You've got an infinite loop and you've removed the main event loop, so it's probably not getting update events.
– user1118321
Oct 24 '18 at 4:23
I can not tell if you are using Legacy OpenGL such as OpenGL 1 which in todays time is considered deprecated or if you are using modern OpenGL at least version 3.3+ up to current 4.6. Regardless of which version you are using; this webpage from this online tutorial for OpenGL gives a very good description of Frame Buffers in OpenGL! learnopengl.com/Advanced-OpenGL/Framebuffers
– Francis Cugler
Oct 24 '18 at 5:29