opengl: buffers

This commit is contained in:
Mitchell Hashimoto
2022-04-01 17:44:54 -07:00
parent 10369f5643
commit f1cffea944
4 changed files with 68 additions and 12 deletions

View File

@ -52,17 +52,11 @@ pub fn main() !void {
};
const vao = try gl.VertexArray.create();
defer vao.destroy();
var vbo: c_uint = undefined;
c.glGenBuffers(1, &vbo);
const vbo = try gl.Buffer.create();
defer vbo.destroy();
try vao.bind();
c.glBindBuffer(c.GL_ARRAY_BUFFER, vbo);
c.glBufferData(
c.GL_ARRAY_BUFFER,
@as(isize, @sizeOf(@TypeOf(vertices))),
&vertices,
c.GL_STATIC_DRAW,
);
try vbo.bind(c.GL_ARRAY_BUFFER);
try vbo.setData(c.GL_ARRAY_BUFFER, vertices[0..], c.GL_STATIC_DRAW);
c.glVertexAttribPointer(
0,
@ -74,8 +68,8 @@ pub fn main() !void {
);
c.glEnableVertexAttribArray(0);
c.glBindBuffer(c.GL_ARRAY_BUFFER, 0);
c.glBindVertexArray(0);
try gl.Buffer.unbind(c.GL_ARRAY_BUFFER);
try gl.VertexArray.unbind();
// Wait for the user to close the window.
while (!window.shouldClose()) {

View File

@ -9,6 +9,7 @@
//! API is exposed via the `c` constant.
pub const c = @import("opengl/c.zig");
pub const Buffer = @import("opengl/Buffer.zig");
pub const Program = @import("opengl/Program.zig");
pub const Shader = @import("opengl/Shader.zig");
pub const VertexArray = @import("opengl/VertexArray.zig");

56
src/opengl/Buffer.zig Normal file
View File

@ -0,0 +1,56 @@
const Buffer = @This();
const c = @import("c.zig");
const errors = @import("errors.zig");
id: c.GLuint,
/// Create a single buffer.
pub inline fn create() !Buffer {
var vbo: c.GLuint = undefined;
c.glGenBuffers(1, &vbo);
return Buffer{ .id = vbo };
}
// Unbind any active vertex array.
pub inline fn unbind(target: c.GLenum) !void {
c.glBindBuffer(target, 0);
}
/// glBindBuffer
pub inline fn bind(v: Buffer, target: c.GLenum) !void {
c.glBindBuffer(target, v.id);
}
pub inline fn setData(
v: Buffer,
target: c.GLenum,
data: []const f32,
usage: c.GLenum,
) !void {
// Maybe one day in debug mode we can validate that this buffer
// is currently bound.
_ = v;
// Determine the per-element size. This is all comptime-computed.
const dataInfo = @typeInfo(@TypeOf(data));
const size: usize = switch (dataInfo) {
.Pointer => |ptr| switch (ptr.size) {
.Slice => @sizeOf(ptr.child),
else => unreachable,
},
else => unreachable,
};
c.glBufferData(
target,
@intCast(isize, size * data.len),
data.ptr,
usage,
);
try errors.getError();
}
pub inline fn destroy(v: Buffer) void {
c.glDeleteBuffers(1, &v.id);
}

View File

@ -11,6 +11,11 @@ pub inline fn create() !VertexArray {
return VertexArray{ .id = vao };
}
// Unbind any active vertex array.
pub inline fn unbind() !void {
c.glBindVertexArray(0);
}
/// glBindVertexArray
pub inline fn bind(v: VertexArray) !void {
c.glBindVertexArray(v.id);