Skip to content

Commit 0241819

Browse files
committed
unified shaders
1 parent ecfc475 commit 0241819

File tree

101 files changed

+586
-844
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+586
-844
lines changed

src/foundations/object/object_quad/ObjectQuad.zig

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,21 @@ pub const default_correct_indices: [6]u32 = .{
2727
};
2828

2929
pub fn init(
30-
vertex_shader: []const u8,
31-
frag_shader: []const u8,
30+
allocator: std.mem.Allocator,
31+
vertex_partials: []const []const u8,
32+
frag_shader: rhi.Shader.fragment_shader_type,
3233
positions: [6][3]f32,
3334
colors: [6][4]f32,
3435
) Quad {
3536
const program = rhi.createProgram();
36-
rhi.attachShaders(program, vertex_shader, frag_shader);
37+
{
38+
var s: rhi.Shader = .{
39+
.program = program,
40+
.instance_data = true,
41+
.fragment_shader = frag_shader,
42+
};
43+
s.attach(allocator, vertex_partials);
44+
}
3745

3846
var data: [6]rhi.attributeData = undefined;
3947
var i: usize = 0;

src/foundations/object/object_triangle/ObjectTriangle.zig

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,22 @@ pub const default_normals: [3][3]f32 = .{
2121
};
2222

2323
pub fn init(
24-
vertex_shader: []const u8,
25-
frag_shader: []const u8,
24+
allocator: std.mem.Allocator,
25+
vertex_partials: []const []const u8,
26+
frag_shader: rhi.Shader.fragment_shader_type,
2627
positions: [3][3]f32,
2728
colors: [3][4]f32,
2829
normals: [3][3]f32,
2930
) Triangle {
3031
const program = rhi.createProgram();
31-
rhi.attachShaders(program, vertex_shader, frag_shader);
32+
{
33+
var s: rhi.Shader = .{
34+
.program = program,
35+
.instance_data = true,
36+
.fragment_shader = frag_shader,
37+
};
38+
s.attach(allocator, vertex_partials);
39+
}
3240
return initWithProgram(program, positions, colors, normals);
3341
}
3442

@@ -63,4 +71,5 @@ pub fn initWithProgram(
6371
};
6472
}
6573

74+
const std = @import("std");
6675
const rhi = @import("../../rhi/rhi.zig");

src/foundations/rhi/Shader.zig

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
fragment_shader: fragment_shader_type,
2+
instance_data: bool,
3+
vertex_partials: [max_vertex_partials][]const u8 = undefined,
4+
num_vertex_partials: usize = 0,
5+
program: u32 = 0,
6+
7+
const max_vertex_partials: usize = 10;
8+
9+
pub const fragment_shader_type = enum(usize) {
10+
color,
11+
normals,
12+
texture,
13+
};
14+
15+
pub inline fn single_vertex(vertex_shader: []const u8) [1][]const u8 {
16+
return [_][]const u8{vertex_shader};
17+
}
18+
19+
const Shader = @This();
20+
21+
const vertex_attrib_header = @embedFile("../shaders/vertex_attrib_header.glsl");
22+
const vertex_attrib_i_data = @embedFile("../shaders/vertex_attrib_i_data.glsl");
23+
24+
const frag_color = @embedFile("../shaders/frag_color.glsl");
25+
const frag_normals = @embedFile("../shaders/frag_normals.glsl");
26+
const frag_texture = @embedFile("../shaders/frag_texture.glsl");
27+
28+
pub fn attach(self: *Shader, allocator: std.mem.Allocator, vertex_partials: []const []const u8) void {
29+
const frag = switch (self.fragment_shader) {
30+
.color => frag_color,
31+
.normals => frag_normals,
32+
.texture => frag_texture,
33+
};
34+
35+
{
36+
self.vertex_partials[self.num_vertex_partials] = vertex_attrib_header;
37+
self.num_vertex_partials += 1;
38+
}
39+
if (self.instance_data) {
40+
self.vertex_partials[self.num_vertex_partials] = vertex_attrib_i_data;
41+
self.num_vertex_partials += 1;
42+
}
43+
for (vertex_partials) |partial| {
44+
self.vertex_partials[self.num_vertex_partials] = partial;
45+
self.num_vertex_partials += 1;
46+
}
47+
const vertex = std.mem.concat(allocator, u8, self.vertex_partials[0..self.num_vertex_partials]) catch @panic("OOM");
48+
defer allocator.free(vertex);
49+
50+
const shaders = [_]struct { source: []const u8, shader_type: c.GLenum }{
51+
.{ .source = vertex, .shader_type = c.GL_VERTEX_SHADER },
52+
.{ .source = frag, .shader_type = c.GL_FRAGMENT_SHADER },
53+
};
54+
const log_len: usize = 1024;
55+
56+
var i: usize = 0;
57+
while (i < shaders.len) : (i += 1) {
58+
const source: [:0]u8 = std.mem.concatWithSentinel(allocator, u8, &[_][]const u8{shaders[i].source}, 0) catch @panic("OOM");
59+
defer allocator.free(source);
60+
61+
const shader = c.glCreateShader(shaders[i].shader_type);
62+
63+
c.glShaderSource(shader, 1, &[_][*c]const u8{source.ptr}, null);
64+
c.glCompileShader(shader);
65+
66+
var success: c.GLint = 0;
67+
c.glGetShaderiv(shader, c.GL_COMPILE_STATUS, &success);
68+
if (success == c.GL_FALSE) {
69+
var infoLog: [log_len]u8 = std.mem.zeroes([log_len]u8);
70+
var logSize: c.GLsizei = 0;
71+
c.glGetShaderInfoLog(shader, @intCast(log_len), &logSize, @ptrCast(&infoLog));
72+
const len: usize = @intCast(logSize);
73+
std.debug.panic("ERROR::SHADER::COMPILATION_FAILED\n{s}\n{s}\n", .{ infoLog[0..len], source });
74+
}
75+
c.glAttachShader(@intCast(self.program), shader);
76+
}
77+
{
78+
c.glLinkProgram(@intCast(self.program));
79+
var success: c.GLint = 0;
80+
c.glGetProgramiv(@intCast(self.program), c.GL_LINK_STATUS, &success);
81+
if (success == c.GL_FALSE) {
82+
var infoLog: [log_len]u8 = std.mem.zeroes([log_len]u8);
83+
var logSize: c.GLsizei = 0;
84+
c.glGetProgramInfoLog(@intCast(self.program), @intCast(log_len), &logSize, @ptrCast(&infoLog));
85+
const len: usize = @intCast(logSize);
86+
std.debug.panic("ERROR::PROGRAM::LINKING_FAILED\n{s}\n", .{infoLog[0..len]});
87+
}
88+
}
89+
return;
90+
}
91+
92+
const std = @import("std");
93+
const c = @import("../c.zig").c;

src/foundations/rhi/rhi.zig

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -193,49 +193,6 @@ pub fn initEBO(indices: []const u32, vao: u32) u32 {
193193
return ebo;
194194
}
195195

196-
pub fn attachShaders(program: u32, vertex: []const u8, frag: []const u8) void {
197-
const shaders = [_]struct { source: []const u8, shader_type: c.GLenum }{
198-
.{ .source = vertex, .shader_type = c.GL_VERTEX_SHADER },
199-
.{ .source = frag, .shader_type = c.GL_FRAGMENT_SHADER },
200-
};
201-
const log_len: usize = 1024;
202-
203-
var i: usize = 0;
204-
while (i < shaders.len) : (i += 1) {
205-
const source: [:0]u8 = std.mem.concatWithSentinel(rhi.allocator, u8, &[_][]const u8{shaders[i].source}, 0) catch @panic("OOM");
206-
defer rhi.allocator.free(source);
207-
208-
const shader = c.glCreateShader(shaders[i].shader_type);
209-
210-
c.glShaderSource(shader, 1, &[_][*c]const u8{source.ptr}, null);
211-
c.glCompileShader(shader);
212-
213-
var success: c.GLint = 0;
214-
c.glGetShaderiv(shader, c.GL_COMPILE_STATUS, &success);
215-
if (success == c.GL_FALSE) {
216-
var infoLog: [log_len]u8 = std.mem.zeroes([log_len]u8);
217-
var logSize: c.GLsizei = 0;
218-
c.glGetShaderInfoLog(shader, @intCast(log_len), &logSize, @ptrCast(&infoLog));
219-
const len: usize = @intCast(logSize);
220-
std.debug.panic("ERROR::SHADER::COMPILATION_FAILED\n{s}\n{s}\n", .{ infoLog[0..len], source });
221-
}
222-
c.glAttachShader(@intCast(program), shader);
223-
}
224-
{
225-
c.glLinkProgram(@intCast(program));
226-
var success: c.GLint = 0;
227-
c.glGetProgramiv(@intCast(program), c.GL_LINK_STATUS, &success);
228-
if (success == c.GL_FALSE) {
229-
var infoLog: [log_len]u8 = std.mem.zeroes([log_len]u8);
230-
var logSize: c.GLsizei = 0;
231-
c.glGetProgramInfoLog(@intCast(program), @intCast(log_len), &logSize, @ptrCast(&infoLog));
232-
const len: usize = @intCast(logSize);
233-
std.debug.panic("ERROR::PROGRAM::LINKING_FAILED\n{s}\n", .{infoLog[0..len]});
234-
}
235-
}
236-
return;
237-
}
238-
239196
pub fn drawArrays(program: u32, vao: u32, count: usize) void {
240197
c.glUseProgram(@intCast(program));
241198
c.glBindVertexArray(vao);
@@ -391,3 +348,4 @@ const object = @import("../object/object.zig");
391348
pub const Mesh = @import("./Mesh.zig");
392349
pub const Uniform = @import("Uniform.zig");
393350
pub const Texture = @import("Texture.zig");
351+
pub const Shader = @import("Shader.zig");

src/foundations/scenery/grid/Grid.zig

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const num_grid_lines: usize = 101;
1313
const grid_increments: usize = 1;
1414

1515
const grid_vertex_shader: []const u8 = @embedFile("grid_vertex.glsl");
16-
const grid_frag_shader: []const u8 = @embedFile("grid_frag.glsl");
1716

1817
pub fn init(allocator: std.mem.Allocator) *Grid {
1918
const grid = allocator.create(Grid) catch @panic("OOM");
@@ -48,7 +47,14 @@ pub fn program(self: *Grid) u32 {
4847

4948
fn renderGrid(self: *Grid) void {
5049
const prog = rhi.createProgram();
51-
rhi.attachShaders(prog, grid_vertex_shader, grid_frag_shader);
50+
{
51+
var s: rhi.Shader = .{
52+
.program = prog,
53+
.instance_data = true,
54+
.fragment_shader = .color,
55+
};
56+
s.attach(self.allocator, rhi.Shader.single_vertex(grid_vertex_shader)[0..]);
57+
}
5258
var i_datas: [num_grid_lines * 2]rhi.instanceData = undefined;
5359
var i_data_i: usize = 0;
5460
for (0..2) |axis| {

src/foundations/scenery/grid/grid_frag.glsl

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,7 @@
1-
#version 460 core
2-
layout (location = 0) in vec3 f_position;
3-
layout (location = 1) in vec4 f_color;
4-
layout (location = 2) in vec3 f_normals;
5-
layout (location = 3) in vec2 f_texture_coords;
6-
layout (location = 4) in vec4 f_t_column0;
7-
layout (location = 5) in vec4 f_t_column1;
8-
layout (location = 6) in vec4 f_t_column2;
9-
layout (location = 7) in vec4 f_t_column3;
10-
layout (location = 8) in vec4 f_i_color;
11-
121

132
uniform mat4 f_mvp;
143

15-
out vec4 fo_color;
4+
out vec4 f_frag_color;
165
out vec3 fo_normals;
176

187
void main()
@@ -25,6 +14,6 @@ void main()
2514
);
2615
vec4 pos = f_mvp * f_transform * vec4(f_position.xyz, 1.0);
2716
gl_Position = pos;
28-
fo_color = f_i_color;
17+
f_frag_color = f_i_color;
2918
fo_normals = transpose(inverse(mat3(f_transform))) * f_normals;
3019
}

src/foundations/scenery/pointer/Pointer.zig

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ pub const mvp_uniform_name: []const u8 = "f_mvp";
77
pub const pointer_uniform_name: []const u8 = "f_pointer_transform";
88

99
const pointer_vertex_shader: []const u8 = @embedFile("pointer_vertex.glsl");
10-
const pointer_frag_shader: []const u8 = @embedFile("pointer_frag.glsl");
1110

1211
pub fn init(allocator: std.mem.Allocator) *Pointer {
1312
const pointer = allocator.create(Pointer) catch @panic("OOM");
@@ -43,7 +42,14 @@ pub fn programs(self: *Pointer) [2]u32 {
4342

4443
pub fn renderCylinder(self: *Pointer) void {
4544
const prog = rhi.createProgram();
46-
rhi.attachShaders(prog, pointer_vertex_shader, pointer_frag_shader);
45+
{
46+
var s: rhi.Shader = .{
47+
.program = prog,
48+
.instance_data = true,
49+
.fragment_shader = .normals,
50+
};
51+
s.attach(self.allocator, rhi.Shader.single_vertex(pointer_vertex_shader)[0..]);
52+
}
4753
var i_datas: [1]rhi.instanceData = undefined;
4854
var m = math.matrix.identity();
4955
m = math.matrix.transformMatrix(m, math.matrix.translate(0, 0.075, 0));
@@ -69,7 +75,14 @@ pub fn renderCylinder(self: *Pointer) void {
6975

7076
pub fn renderCone(self: *Pointer) void {
7177
const prog = rhi.createProgram();
72-
rhi.attachShaders(prog, pointer_vertex_shader, pointer_frag_shader);
78+
{
79+
var s: rhi.Shader = .{
80+
.program = prog,
81+
.instance_data = true,
82+
.fragment_shader = .normals,
83+
};
84+
s.attach(self.allocator, rhi.Shader.single_vertex(pointer_vertex_shader)[0..]);
85+
}
7386
var i_datas: [1]rhi.instanceData = undefined;
7487
var m = math.matrix.identity();
7588
m = math.matrix.transformMatrix(m, math.matrix.translate(3.85, 0, 0));

src/foundations/scenery/pointer/pointer_frag.glsl

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,7 @@
1-
#version 460 core
2-
layout (location = 0) in vec3 f_position;
3-
layout (location = 1) in vec4 f_color;
4-
layout (location = 2) in vec3 f_normals;
5-
layout (location = 3) in vec2 f_texture_coords;
6-
layout (location = 4) in vec4 f_t_column0;
7-
layout (location = 5) in vec4 f_t_column1;
8-
layout (location = 6) in vec4 f_t_column2;
9-
layout (location = 7) in vec4 f_t_column3;
10-
layout (location = 8) in vec4 f_i_color;
11-
12-
131
uniform mat4 f_pointer_transform;
142
uniform mat4 f_mvp;
153

16-
out vec4 fo_color;
4+
out vec4 f_frag_color;
175
out vec3 fo_normals;
186

197
void main()
@@ -27,6 +15,6 @@ void main()
2715
f_transform = f_pointer_transform * f_transform;
2816
vec4 pos = f_mvp * f_transform * vec4(f_position.xyz, 1.0);
2917
gl_Position = pos;
30-
fo_color = f_i_color;
18+
f_frag_color = f_i_color;
3119
fo_normals = normalize(transpose(inverse(mat3(f_pointer_transform))) * f_normals);
3220
}

0 commit comments

Comments
 (0)