I’m getting really bad performance from VAOs, wich is the greatest version number of OpenGL in wich VAOs are not mandatory? I will use core context of that version (like 6-8% less drawcalls if using VAOs instead of setting states singulary, also because when states are singular you can avoid in average 3/4 of the calls because become redundant, seems that you can easily outperform drivers in that kind of optimization).
- Geometry shaders:
Is it possible to emit vertices inside geometry shaders and having those vertices use a vertex format different from the one of the VBO? (says I have particles I just input a set o points (X,Y,Z) and a textureindex (for the texture array) then the geometry shader outputs 4 (or more if want to save some fill rate) vertices and adds to them the UV coordinates wich are easily generated.
Thanks in advance
You can just run a non core profile. I think nvidia drivers will let you use a core profile without any VAOs. That is not standard conform but just there way to say “fuck VAOs”.
malexander already mentioned the default way to handle this, create and bind a single VAO. That’s what I do, because I work with mesa drivers and need to use a core profile to get GL3.3.
And if available I use ARB_vertex_attrib_binding and ARB_multi_bind. If your layout stays the same you can change all vertex buffer bindings with a single call.
You tell the geometry shader what type (there is only points, line_strip, triangle_strip) and how many you output maximum. (http://www.opengl.org/wiki/Geometry_Shader)
You’ve already got some good responses. Just to add to that, for VAO just use a compatibility profile and never use VAOs if you don’t want to. If you must use core, just gen and bind one VAO, and then blissfully ignore the fact that VAOs even exist.
As to geom shader, …what they said. In the new-style (3.2 “core”, ARB_gpu_shader5) way, you just declare what your geometry shader outputs in your geometry shader source code. For instance, let’s suppose your geom shader is generating POINTS output to 2 streams, writing a vec4 and a float to each for point, in your geom shader you’d have:
# extension GL_ARB_gpu_shader5 : require
layout( points, max_vertices = 1 ) out;
layout( stream=0 ) out vec4 apples0;
layout( stream=1 ) out vec4 apples1;
layout( stream=0 ) out float oranges0;
layout( stream=1 ) out float oranges1;
Uao thanks very much guys! that’s a lot of stuff I’ll have my time to get deep into that unluckily I don’t have parte of the features you mentioned but I have a lot to play with now:)