Which OpenGL version by default installed along with MinGW? - opengl

I recently tried to lay my hands on OpenGL. Trying to grasp the API, I am using MinGW along with OpenGW. Now, I learned (or was given the advice) that I shouldn't use glBegin and glEnd anymore, since those are deprecated, but should start with OpenGL 3.1, instead. As I didn't know that the version used makes such a difference, I didn't pay much Attention as to which version I actually have installed on my computer. And, as far as I can see, there is no glVersion or similar call that I could use to determine that version.
Since I am using MinGW I went to its respective include folder and found in c:\MinGW\include\GL\gl.h:
/*
* Mesa 3-D graphics library
* Version: 4.0
[more lines]
*/
[more lines]
#define GL_VERSION_1_1 1
#if !defined(__WIN32__)
#define GL_VERSION_1_2 1
#define GL_VERSION_1_3 1
#define GL_ARB_imaging 1
#endif
[more lines]
#define GL_VERSION 0x1F02
which, to me, indicates, that the installed version is as low as 1.3. Is this the case or how could I verify my suspicion? Also, where would I find a later version (that is working fine along with MinGW) if I have 1.3 (or whatever version it is) only?
So, does someone know, if my suspicion is right and that MinGW comes with an outdated OpenGL version?
Edit I realise that this question might be taken as a duplicate of Which OpenGL version by default installed along with MinGW?, yet, I believe this question is specifically about MinGW and OpenGL, so I think that this fact allows for a (perhaps) more specific answer.

So, does someone know, if my suspicion is right and that MinGW comes with an outdated OpenGL version?
MinGW comes without "an OpenGL", your operating system (the graphics card driver, usually) provides OpenGL.
MinGW provides a header file (gl.h), and a corresponding library (libopengl32.a) which is a wrapper for opengl32.dll, a dynamic library which comes with Windows and contains the handles to OpenGL 1.0 an 1.1 functions... something around that, not sure about exact version numbers.
Then:
Most operating systems allow you to use the whole OpenGL in a similar way.
On Windows, however, in order to access the newer OpenGL functions than what's in the header and library wrapper (which you probably do have available - depending on your GPU and driver), you have to use system calls to load the function pointers to the OpenGL calls.
There are libraries which do that for you and let you use OpenGL 3/4 functionality easily. I recommend gl3w or GLEW. That's the usual way of using OpenGL on Windows.

There's glGetString(GL_VERSION).
Please note this question has been asked and answered before.

http://learningwebgl.com/blog/?p=11#troubleshooting has some good information - WebGL uses OpenGL. You can use http://www.realtech-vr.com/glview/ to confirm your test.

Related

Can I use programs using OpenGL and GLUT in Raspberry Pi 3b+?

I have a ready-made program code that uses OpenGL and glut, can I compile and run this program in Rasbian on Raspberry 3b+?
Yes, but with a caveat
You can use OpenGL software on RPis, but you need to note that RPIs do not implement up to the newest standard, 4.6. I think they implement up to version OpenGL 2.0 ES, but don't quote me on that.
If you want to find out, you can simply enable the GL driver in raspi-config and then run the command
glxinfo | grep "OpenGL version"
to figure out what standard you can use.
This will determine what standard of OpenGL code works and therefore what code will compile.
Only after you verify the version will you know if the code will run.
Even then, there is sooo little RAM that it may not work.
That is outside the scope of this question though.

how should I interpret the output of glewinfo?

running glewinfo has a lot of information, but some of it is more confusing than helpful.
Here is my glewinfo from a laptop I have http://pastebin.com/K5p37w8a
It tells me my OpenGL version is 2.1, but when I continue reading, there are entries to GL_VERSION_3_0 up to GL_VERSION_4_0, and all of them say OK. But I can't call any of the functions listed there.
Others are tagging with OK [MISSING] this is the most confusing of them all, because either it is there, or it is missing, but it can't be both at the same time.
The glewinfo program shows you all of the entry points (functions) which are present, it doesn't tell you whether you can use the features, or whether those entry points work. A function could report as OK but your program could still crash if you call it! To figure out what features are available, you will have to look at the extension strings and the version number. You can get this information from glxinfo, you do not need GLEW.
In this case, you are using Mesa (an OpenGL implementation) with a compatibility profile (which is the default profile). In compatibility mode, Mesa is limited to OpenGL 2.1. However, if you request a core profile, Mesa will provide newer features and support a newer version of OpenGL. The same Mesa library is still used, which is why all of the OpenGL 4.0 entry points are available.
However, GLEW is somewhat broken when you use it with the core profile. The glewExperimental "fix" is a poor band-aid on a flawed implementation. For this reason, I do not recommend GLEW. glLoadGen is a good alternative.

My OpenGL Version doesn't support Buffer Binding

Why is this? I'd like to know because in a LOT of articles and various tutorials I see on the Internet it's hard NOT to see something which doesn't deal with buffer binding. The only bind function I have is glBindTexture. Does this mean my drivers are significantly outdated?
Edit
Sorry for lack of information. My OpenGL version 3.1 from an Intel integrated GPU. Also, the reason why I thought that I lacked functions such as glBindBuffer is mainly because it wouldn't show up in Qt as a function I could use in my auto-completion.
The only bind function I have is glBindTexture
Most likely you're fooled by the way OpenGL implementations export their functionality. opengl32.dll on Windows will and libGL.so most likely will give you only OpenGL-1.1 functionality (Windows Vista and / actually do give you OpenGL-1.4 and most Linux/BSD drivers will give you OpenGL-2.1). Anything beyond (and buffer objects go beyond) must be loaded through the so called extension system.
Most easy and reliable way to do this:
Go to http://glew.sf.net get the version matching your development environment
Install GLEW in development environment
Replace all occurences of #include <GL/gl.h> with #include <GL/glew.h>
Call glewInit() in your code after a OpenGL context has been made current.

Moving from fixed-pipeline to modern OpenGL

I have done some simple OpenGL (old fixed pipeline ,without shaders ..etc) and want to start some serious "modern" OpenGL programming. (Should compile on Windows and Linux)
I have few questions.
1) In Windows , the "gl.h" doesnt have OpenGL2.0+ related API calls declared .(eg. glShaderSource() ) . How can I access these API calls?
I dont want to install graphics-card specific headers since, I want to compile this application in other machines.
2) In Linux ,If I install Mesa library can I access above OpenGL2+ APIs functions ?
There has been a long-held belief among some (due to the slowness of GL version updates in the late 90s/early 00s) that the way to get core OpenGL calls was to just include a header and a library. That loading function pointers manually was something you did for extensions, for "graphics-card specific" function. That isn't the case.
You should always use an extension loading library to get access to OpenGL functions, whether core or extension. GLEW is a pretty good one, and GL3W is decent if you can live with its limitations (3.0 core or better only).

App using 3D & 3rd-party plugins - forward compatible OpenGL or Direct3D?

I'm writing an app that's going to use 3rd-party created plugins to render all kinds of 3D trickery.
My main application is to create the context / render-object and a rendertarget/framebufferobject. The 3rd-party plugins are going to be rendering their fancy stuff to that, so they need access to that context / renderobject to perform their 3d-render-related calls.
I can choose to implement this using either OpenGL or Direct3D.
My decision will most probably be based on my understanding of the next problem :
Obviously, new versions of OpenGL / Direct3D will be coming out, and it would be nice if newly created plugins could benefit from newer versions of DX/OGL than the main program was compiled with. (if the computer running the application supports that newer version)
Using OpenGL (using OpenTK) I understood it's possible to create a forward-compatible context, as in "Give me the most up-to-date-version that is backward compatible with version X".
So when asked for a 3.2 context, if 4.0 is available it would return a 4.0 context.
For DirectX, I don't see anything like that, which would mean that if I create my main program with DirectX 11 for example, 3rd-party plugins would never be able to use newer versions when available ?
Am I getting this correct ?
Will OpenGL enable 3rd-party plugin writers to create plugins for newer versions of OpenGL, while DirectX will not allow me to do something like that ?
I'd be amazed if DirectX ever supported the sort of compatibility you're talking about within an application. Each version of the Direct3D APIs has basically been an independent (COM) object hierarchy with absolutely no acknowledgment that other generations of the system might exist, past or future. (Backwards compatibility at the platform level has generally been superb, of course, but you're after something quite different).
So either go with OpenGL (the support you mention at least sounds like it offers some hope), or maybe even consider a higher level API for plugins which somehow "compiles"/"adapts" to the actual target platform at runtime. That'd let you support OpenGL and Direct3D (although obviously shaders in particular would present severe difficulties; hence projects like AnySL).