Even though client side arrays are deprecated in 3.0 they are performing better at my task than VBO's because I have a lot of small independent different objects whose geometry is changed every frame(they're soft bodies) and it looks like switching/updating/calling that many VBO's works slower than just passing these buffers every frame from client side arrays.
No offence, but if client arrays are faster than buffer streaming, then you likely did something wrong. Internally, the driver and GPU don't do anything else than use buffers even if you use client arrays. Somehow, a block of memory needs to get updated on the GPU every frame, and how that gets done depends on what code you choose to write. If you are talking about the overhead of having to rebind and update many small buffers every frame, you might want to consider some of the more "advanced" draw functions that OpenGL provides. They allow you to use a single buffer per attribute (assuming that you use a single vertex layout) for multiple draw operations, which eliminates the need to update a large number of smaller sized buffers. Also, don't forget that having to rebind each buffer and call glVertexAttribPointer every frame becomes unnecessary when using VAOs.
There are enough resources on the internet about reducing the overhead in modern OpenGL, which I assume is what was causing the inferior performance of the server object variant. OpenGL is very powerful and flexible, one just has to know what the most efficient way to get something done is
.
Even though I have used vbo's extensively before I have not yet tested a whole basic pipeline how it's supposed to work in OGL 3/4. Especially I'm interested in how to do so in SFML. Can you give me a basic example of OGL 3/4-way rendering geometry with SFML-based context? Also am I right that SFML itself uses deprecated features and is incompatible with 3.0 context so that I'll just have to use "modern" functions in "legacy" context?
You use OpenGL basically the same way as you do using any other library (GLUT, SDL, GLFW, etc.). First, you create the SFML window. If you want sfml-graphics rendering as well, you will have to create an sf::RenderWindow, otherwise an sf::Window will suffice for pure OpenGL rendering. After the window is created, an OpenGL context will automatically be active. From there, you do the usual thing with OpenGL.
SFML supports requesting any context version.
However: This is subject to what the operating system is willing to provide. On Windows, and Linux if you use proprietary drivers, SFML will request a compatibility profile context in order for sfml-graphics to function. Unfortunately, this applies to sf::Window as well even though it isn't part of sfml-graphics. Work is under way to allow the user to explicitly request a core profile context on creation of an SFML context. This is necessary for requesting any of the non-legacy OpenGL versions on OS X and Linux if you use the free drivers.
What this means is that if you use Windows, you have nothing to worry about. Just request a 3.2 context and you will get something you and SFML can both use. If you use OS X or Linux with free drivers, you can still request a 2.1 context and rely on extensions to get access to the newer features. Either way, you will have to use a loader to provide the defines and function signatures for the newer stuff.
You can restrict yourself to the "modern" API even in a compatibility profile context, yes. This means that your code is future-proof and portable across many more platforms if that is a concern. When the time comes (i.e. SFML 3
), SFML might switch to solely using the core API when it can as well, so in that case, your whole application will be core only. It is never a bad idea to start getting used to writing modern OpenGL code now.