What is “immediate mode”? Give a code example.
When do I have to use immediate mode instead of retained mode?
What are pros and cons of using each method?
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
One example of “immediate mode” is using
glBeginandglEndwithglVertexin between them. Another example of “immediate mode” is to useglDrawArrayswith a client vertex array (i.e. not a vertex buffer object).You will usually never want to use immediate mode (except maybe for your first “hello world” program) because it is deprecated functionality and does not offer optimal performance.
The reason why immediate mode is not optimal is that the graphic card is linked directly with your program’s flow. The driver cannot tell the GPU to start rendering before
glEnd, because it does not know when you will be finished submitting data, and it needs to transfer that data too (which it can only do afterglEnd).Similarly, with a client vertex array, the driver can only pull a copy of your array the moment you call
glDrawArrays, and it must block your application while doing so. The reason is that otherwise you could modify (or free) the array’s memory before the driver has captured it. It cannot schedule that operation any earlier or later, because it only knows that the data is valid exactly at one point in time.In contrast to that, if you use for example a vertex buffer object, you fill a buffer with data and hand it to OpenGL. Your process does no longer own this data and can therefore no longer modify it. The driver can rely on this fact and can (even speculatively) upload the data whenever the bus is free.
Any of your later
glDrawArraysorglDrawElementscalls will just go into a work queue and return immediately (before actually finishing!), so your program keeps submitting commands while at the same time the driver works off one by one. They also likely won’t need to wait for the data to arrive, because the driver could already do that much earlier.Thus, render thread and GPU run asynchronously, every component is busy at all times, which yields better performance.
Immediate mode does have the advantage of being dead simple to use, but then again using OpenGL properly in a non-deprecated way is not precisely rocket science either — it only takes very little extra work.
Here is the typical OpenGL “Hello World” code in immediate mode:
Edit:
By common request, the same thing in retained mode would look somewhat like this: