easy-gl › Program

Program

Manages a linked OpenGL shader program. Handles shader compilation, linking, uniform setting and attribute binding. Non-copyable, movable, RAII.

One-line construction (recommended)

Compile and link a vertex + fragment program in a single constructor call:

easygl::Program prog(vertexShaderSource, fragmentShaderSource);
// Throws easygl::Exception if compilation or link fails
prog.use();

Step-by-step construction

easygl::Program prog;
prog.create();

easygl::Shader vert(easygl::ShaderType::Vertex);
vert.create();
vert.compile_from_source(vertSrc);

easygl::Shader frag(easygl::ShaderType::Fragment);
frag.create();
frag.compile_from_source(fragSrc);

prog.attach_owned(vert);   // ownership transferred
prog.attach_owned(frag);
prog.link();               // throws on failure
// vert and frag are now empty; prog owns them internally

compile_from_sources

Resets and recompiles/relinks an existing program object:

prog.compile_from_sources(newVertSrc, newFragSrc);

Uniforms — scalar and vector

int loc = prog.uniform_location("uColor");
if (loc < 0) { /* uniform not found or optimised away */ }

prog.set_uniform(loc, 1.0f);                        // float
prog.set_uniform(loc, 1.0f, 0.5f);                   // vec2
prog.set_uniform(loc, 1.0f, 0.5f, 0.2f);              // vec3
prog.set_uniform(loc, 1.0f, 0.5f, 0.2f, 1.0f);        // vec4

prog.set_uniform(loc, 42);                             // int
prog.set_uniform(loc, 42u);                            // uint

Uniforms — arrays

std::vector<float> pts = { 0.0f, 1.0f, 2.0f, 3.0f };
prog.set_uniform_fv(loc, pts, 2);  // 2 components per element → 2 × vec2

Uniforms — matrices

float model[16] = { /* column-major 4×4 */ };
float mvp[16]   = { /* ... */ };

prog.set_uniform_matrix4(prog.uniform_location("uModel"), model);
prog.set_uniform_matrix4(prog.uniform_location("uMVP"), mvp);

// Non-square matrices:
prog.set_uniform_matrix3x4(prog.uniform_location("uBones"), boneData);

// Transpose flag (false = column-major, the OpenGL default):
prog.set_uniform_matrix4(loc, data, false);

Uniform blocks (UBOs)

unsigned int blockIdx = prog.uniform_block_index("Matrices");
prog.set_uniform_block_binding(blockIdx, 0); // bind block to point 0

// Then bind the Buffer to the same point:
ubo.bind_base(easygl::BufferTarget::Uniform, 0);

Attribute binding

// Must be done BEFORE linking:
prog.bind_attrib_location(0, "aPos");
prog.bind_attrib_location(1, "aTexCoord");
prog.link();

// Or query after linking:
int posIdx = prog.attrib_location("aPos");

Validation

prog.validate(); // Calls glValidateProgram — useful in debug builds
std::cout << prog.info_log() << '\n';

Method reference

MethodDescription
Program()Default construction — empty, no GL handle yet.
Program(vertSrc, fragSrc)Compile & link in one step. Throws on failure.
create()Allocate GL program handle.
destroy()Free handle. Noexcept.
attach(shader)Attach shader (const ref, no ownership transfer).
attach_owned(shader)Attach shader and transfer ownership to program.
detach(shader)Detach shader from program.
link()Link attached shaders. Throws on failure.
compile_from_sources(v,f)Recompile/relink entire program from sources.
use()Make this program current (glUseProgram).
validate()Validate program state for current GL state.
info_log()Link or validation log string.
attrib_location(name)Get attribute location by name.
bind_attrib_location(idx, name)Bind attribute to index before linking.
uniform_location(name)Get uniform location by name.
set_uniform(loc, ...)Overloaded: float/int/uint scalars and vectors.
set_uniform_fv(loc, span, components)Float array uniform.
set_uniform_matrix2..4(loc, data, transpose)Square matrix uniforms.
set_uniform_matrix2x3..4x3(loc, data, transpose)Non-square matrix uniforms.
uniform_block_index(name)Get UBO block index by name.
set_uniform_block_binding(idx, point)Bind UBO block to binding point.
is_linked()True after successful link.
is_created()True if GL handle allocated.
native_handle()Raw GL integer ID.
reset_handle_no_gl()Context-loss recovery.