summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2025-03-02 17:30:17 +1100
committerquou <quou@disroot.org>2025-03-02 17:31:06 +1100
commit5b548cb866405b6716d5f904e4df75c07dbbad9b (patch)
treef08cddeb3f6ecb668dbac536d0ee2c533b0a55ee
parent528c5a7ef9e3e7cadf9a2caefa3ca115b382df75 (diff)
nevermind
-rw-r--r--Makefile17
-rw-r--r--build.ninja9
-rw-r--r--c2.cpp73
-rw-r--r--configure.lua1
-rw-r--r--intermediate/forward.h6
-rw-r--r--intermediate/surface.glsl59
-rw-r--r--intermediate/ts.glsl179
-rw-r--r--lighting.cpp127
-rw-r--r--lighting.hpp25
-rw-r--r--model.cpp6
-rw-r--r--model.hpp1
-rw-r--r--renderer.cpp223
-rw-r--r--renderer.hpp43
-rw-r--r--sc/sc.cpp2
-rw-r--r--src/guy.blendbin483196 -> 0 bytes
-rw-r--r--video.cpp19
-rw-r--r--video.hpp1
17 files changed, 185 insertions, 606 deletions
diff --git a/Makefile b/Makefile
index fe8d568..4a1b27e 100644
--- a/Makefile
+++ b/Makefile
@@ -118,18 +118,15 @@ data/tonemap.csh: intermediate/tonemap.glsl shadercompiler | data
data/triangle.csh: intermediate/triangle.glsl shadercompiler | data
cpp -MMD -MF data/triangle.d -MT data/triangle.csh -Iintermediate intermediate/triangle.glsl > /dev/null
./shadercompiler intermediate/triangle.glsl data/triangle.csh
-data/ts.csh: intermediate/ts.glsl shadercompiler | data
- cpp -MMD -MF data/ts.d -MT data/ts.csh -Iintermediate intermediate/ts.glsl > /dev/null
- ./shadercompiler intermediate/ts.glsl data/ts.csh
data/ui.csh: intermediate/ui.glsl shadercompiler | data
cpp -MMD -MF data/ui.d -MT data/ui.csh -Iintermediate intermediate/ui.glsl > /dev/null
./shadercompiler intermediate/ui.glsl data/ui.csh
-data/monkey.mdl: convmodel intermediate/monkey.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh | data
+data/monkey.mdl: convmodel intermediate/monkey.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh | data
./convmodel data intermediate/monkey.glb data/monkey.mdl
-data/cube.mdl: convmodel intermediate/cube.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh | data
+data/cube.mdl: convmodel intermediate/cube.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh | data
./convmodel data intermediate/cube.glb data/cube.mdl
-data/scene.mdl: convmodel intermediate/scene.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh | data
+data/scene.mdl: convmodel intermediate/scene.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh | data
./convmodel data intermediate/scene.glb data/scene.mdl
data/22.tex: convtexture intermediate/22.bmp | data
@@ -152,16 +149,16 @@ data/plastic.mat: convmaterial intermediate/plastic.mat | data
data/greybox.mat: convmaterial intermediate/greybox.mat | data
./convmaterial intermediate/greybox.mat data/greybox.mat
-pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat
- ./packer pack data debug.csh mip_spec.csh sky.csh surface.csh surface_depthonly.csh tonemap.csh triangle.csh ts.csh ui.csh monkey.mdl cube.mdl scene.mdl 22.tex kita.tex brick_albedo.tex brick_ao.tex brick_normal.tex sky.tex bricks.mat plastic.mat greybox.mat
+pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat
+ ./packer pack data debug.csh mip_spec.csh sky.csh surface.csh surface_depthonly.csh tonemap.csh triangle.csh ui.csh monkey.mdl cube.mdl scene.mdl 22.tex kita.tex brick_albedo.tex brick_ao.tex brick_normal.tex sky.tex bricks.mat plastic.mat greybox.mat
data:
mkdir -p data
--include qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ts.d data/ui.d
+-include qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ui.d
clean:
- rm -f qstd/memory.o qstd/plat.o qstd/str.o qstd/pack.o cfg/cfgparse.o sc/sc.o sc/includer.o app.o asset.o c2.o camera.o debugdraw.o editor.o lighting.o maths.o model.o physics.o pipeline.o renderer.o scene.o ui.o video.o world.o convtexture.o convmodel.o convmaterial.o packer.o qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ts.d data/ui.d data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat
+ rm -f qstd/memory.o qstd/plat.o qstd/str.o qstd/pack.o cfg/cfgparse.o sc/sc.o sc/includer.o app.o asset.o c2.o camera.o debugdraw.o editor.o lighting.o maths.o model.o physics.o pipeline.o renderer.o scene.o ui.o video.o world.o convtexture.o convmodel.o convmaterial.o packer.o qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ui.d data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat
rm -f shadercompiler
rmdir data
rm -f c2
diff --git a/build.ninja b/build.ninja
index 8635232..0d15a5e 100644
--- a/build.ninja
+++ b/build.ninja
@@ -83,12 +83,11 @@ build data/surface.csh: shadercompiler intermediate/surface.glsl | shadercompile
build data/surface_depthonly.csh: shadercompiler intermediate/surface_depthonly.glsl | shadercompiler.exe
build data/tonemap.csh: shadercompiler intermediate/tonemap.glsl | shadercompiler.exe
build data/triangle.csh: shadercompiler intermediate/triangle.glsl | shadercompiler.exe
-build data/ts.csh: shadercompiler intermediate/ts.glsl | shadercompiler.exe
build data/ui.csh: shadercompiler intermediate/ui.glsl | shadercompiler.exe
-build data/monkey.mdl: convmodel intermediate/monkey.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh
-build data/cube.mdl: convmodel intermediate/cube.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh
-build data/scene.mdl: convmodel intermediate/scene.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh
+build data/monkey.mdl: convmodel intermediate/monkey.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh
+build data/cube.mdl: convmodel intermediate/cube.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh
+build data/scene.mdl: convmodel intermediate/scene.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh
build data/bricks.mat: convmaterial intermediate/bricks.mat | convmaterial.exe
build data/plastic.mat: convmaterial intermediate/plastic.mat | convmaterial.exe
@@ -107,5 +106,5 @@ build data/brick_normal.tex: convtexture intermediate/brick_normal.bmp | convtex
build data/sky.tex: convtexture intermediate/sky.hdr | convtexture.exe
format = rgba16f
-build pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/bricks.mat data/plastic.mat data/greybox.mat data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex | packer.exe
+build pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/bricks.mat data/plastic.mat data/greybox.mat data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex | packer.exe
diff --git a/c2.cpp b/c2.cpp
index f53d59d..ac9e7d4 100644
--- a/c2.cpp
+++ b/c2.cpp
@@ -162,6 +162,61 @@ struct Orbit_Cam {
}
};
+struct Fullscreen_Quad {
+ Buffer_Id vb;
+
+ void init(Device* d) {
+ float verts[] = {
+ -1.0f, -1.0f, 0.0f, 0.0f,
+ -1.0f, 3.0f, 0.0f, 2.0f,
+ 3.0f, -1.0f, 2.0f, 0.0f
+ };
+ Buffer_Id stage;
+ void* mem;
+ stage = d->create_buffer(
+ "sky vb stage",
+ sizeof verts,
+ Buffer_Flags::cpu_readwrite |
+ Buffer_Flags::copy_src
+ );
+ mem = d->map_buffer(stage, 0, sizeof verts);
+ memcpy(mem, verts, sizeof verts);
+ d->unmap_buffer(stage);
+ vb = d->create_buffer(
+ "fullscreen quad",
+ sizeof verts,
+ Buffer_Flags::copy_dst |
+ Buffer_Flags::vertex_buffer
+ );
+ Context& ctx = d->acquire();
+ ctx.copy(vb, stage);
+ d->submit(ctx);
+ d->destroy_bufferi(stage);
+ }
+
+ void destroy(Device* d) {
+ d->destroy_buffer(vb);
+ }
+
+ void render(
+ Context& ctx,
+ Pipeline& pip,
+ Render_Pass& pass,
+ int bind
+ ) {
+ Vertex_Buffer_Binding vbb[] = {{
+ .id = vb,
+ .offset = 0,
+ .target = bind
+ }, {}};
+ Draw draw{};
+ draw.verts = vbb;
+ draw.vertex_count = 3;
+ draw.instance_count = 1;
+ ctx.submit(draw, pip, pass);
+ }
+};
+
struct Sky {
Staged_Buffer config;
Texture_Id texture;
@@ -592,6 +647,7 @@ struct C2 : public App {
Lighting lighting;
Camera_Id camera;
Orbit_Cam orbit_cam;
+ Fullscreen_Quad quad;
Sky sky;
Env_Probe eprobe;
Tonemap tonemap;
@@ -647,6 +703,7 @@ struct C2 : public App {
ui_shader = (Shader*)assets.load("ui.csh");
texture = (Texture*)assets.load("22.tex");
texture2 = (Texture*)assets.load("kita.tex");
+ quad.init(dev);
cbuf = dev->create_buffer(
"config buffer",
sizeof(Config_Buffer),
@@ -658,7 +715,7 @@ struct C2 : public App {
per_frame_memory_size
);
clamped_linear = create_clamped_linear(dev);
- renderer.init(arena, dev, assets);
+ renderer.init(arena, dev);
world = (World*)arena_alloc(arena, sizeof *world);
world->init(arena);
ui = UI::create(this, &ui_arena);
@@ -669,7 +726,7 @@ struct C2 : public App {
ui->layout(w, h);
fps_label = ui->create_element<UI::Label>(ui->root, "");
scene.init(&scene_arena, 32, clamped_linear);
- lighting.init(dev, w, h);
+ lighting.init(dev);
sky.init(dev, &assets);
eprobe.init(dev, &assets, 256);
tonemap.init(dev, &assets);
@@ -827,7 +884,7 @@ struct C2 : public App {
Render_Pass& tonemap_pass = pb.build_rp();
ctx.debug_push("environment cube");
- eprobe.render(dev, &frame_arena, renderer.quad, sky);
+ eprobe.render(dev, &frame_arena, quad, sky);
ctx.debug_pop();
renderer.env_cubemap = eprobe.get_cubemap();
@@ -836,11 +893,11 @@ struct C2 : public App {
Texture& bb = dev->get_texture(hdr_target);
pcam.asp = (float)bb.w / (float)bb.h;
- renderer.prev_vp = pcam.get_proj() * pcam.get_view();
orbit_cam.update_orbit(*this);
pcam.update();
lighting.update(dev, ctx, *world, renderer, scene);
update_scene(scene, dev, *world);
+ lr.add_box(scene.bound);
ctx.debug_push("scene");
renderer.render(
dev,
@@ -854,7 +911,7 @@ struct C2 : public App {
sky.render(
dev,
&frame_arena,
- renderer.quad,
+ quad,
sky_pass,
clamped_linear,
pcam,
@@ -868,7 +925,7 @@ struct C2 : public App {
tonemap.render(
dev,
&frame_arena,
- renderer.quad,
+ quad,
tonemap_pass,
hdr_target,
clamped_linear
@@ -902,7 +959,7 @@ struct C2 : public App {
clamped_linear
);
Pipeline& ui_pip = pb.build();
- renderer.quad.render(
+ quad.render(
ctx,
ui_pip,
ui_pass,
@@ -944,6 +1001,7 @@ struct C2 : public App {
}
void on_destroy() override {
+ quad.destroy(dev);
scene.destroy(dev);
sky.destroy(dev);
lighting.destroy(dev, renderer);
@@ -972,7 +1030,6 @@ struct C2 : public App {
dev->destroy_buffer(ui_buffer);
make_hdr_target();
make_ui_texture();
- lighting.recreate(dev, w, h);
}
void make_hdr_target() {
diff --git a/configure.lua b/configure.lua
index d944308..9bfe342 100644
--- a/configure.lua
+++ b/configure.lua
@@ -50,7 +50,6 @@ config = {
"surface_depthonly",
"tonemap",
"triangle",
- "ts",
"ui",
},
materials = {
diff --git a/intermediate/forward.h b/intermediate/forward.h
index 156a185..7c4c9d3 100644
--- a/intermediate/forward.h
+++ b/intermediate/forward.h
@@ -22,9 +22,6 @@ name: Caster
[variable]
name: projection
type: mat4
-[variable]
-name: jittered
-type: mat4
[struct]
name: Globals
@@ -44,7 +41,4 @@ type: Globals
stage: fragment
#endif
-
-#define max_casters 16
-
#endif
diff --git a/intermediate/surface.glsl b/intermediate/surface.glsl
index 82bf2f6..71a4307 100644
--- a/intermediate/surface.glsl
+++ b/intermediate/surface.glsl
@@ -29,9 +29,6 @@ type: vec2
name: uv
type: vec2
[interpolator]
-name: screen
-type: vec4
-[interpolator]
name: position
type: vec4
[interpolator]
@@ -117,7 +114,7 @@ dimension: cube
[texture]
name: shadowmaps
stage: fragment
-dimension: array
+dimension: shadowArray
[target]
name: colour
@@ -136,9 +133,7 @@ void main() {
interpolator.uv = uv;
interpolator.position = pos;
interpolator.tbn = mat3(t, b, n);
- pos = c_vp.view_projection * pos;
- interpolator.screen = pos;
- gl_Position = pos;
+ gl_Position = c_vp.view_projection * pos;
}
#endif
@@ -175,10 +170,54 @@ float specular_brdf(vec2 uv, vec3 ref, vec3 l, vec3 v, vec3 n) {
return (D * F * G) / (4.0 * ndl * ndv + 0.001);
}
+vec2 poissonDisk[16] = vec2[](
+ vec2(-0.94201624, -0.39906216),
+ vec2(0.94558609, -0.76890725),
+ vec2(-0.094184101, -0.92938870),
+ vec2(0.34495938, 0.29387760),
+ vec2(-0.91588581, 0.45771432),
+ vec2(-0.81544232, -0.87912464),
+ vec2(-0.38277543, 0.27676845),
+ vec2(0.97484398, 0.75648379),
+ vec2(0.44323325, -0.97511554),
+ vec2(0.53742981, -0.47373420),
+ vec2(-0.26496911, -0.41893023),
+ vec2(0.79197514, 0.19090188),
+ vec2(-0.24188840, 0.99706507),
+ vec2(-0.81409955, 0.91437590),
+ vec2(0.19984126, 0.78641367),
+ vec2(0.14383161, -0.14100790)
+);
+
+float random(vec3 seed, int i){
+ vec4 seed4 = vec4(seed,i);
+ float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673));
+ return fract(sin(dot_product) * 43758.5453);
+}
+
+float get_shadow(Light l, vec3 wpos) {
+ const int taps = 4;
+ const float w = 1.0 / float(taps);
+ const float m = 1.0 / 1000.0;
+ int i;
+ float d = 0.0f;
+ Caster caster = casters[l.caster_id];
+ vec4 surf = caster.projection * vec4(wpos, 1.0);
+ surf /= surf.w;
+ surf.xy = surf.xy * 0.5 + 0.5;
+ surf.z -= 0.005;
+ for (i = 0; i < taps; i++) {
+ int index = int(16.0 * random(floor(wpos.xyz * 1000.0), i)) % 16;
+ vec2 coord = surf.xy + poissonDisk[index] * m;
+ vec4 vec = vec4(coord, float(l.caster_id), surf.z);
+ d += texture(shadowmaps, vec).r * w;
+ }
+ return d;
+}
+
void main() {
int i;
vec2 uv = interpolator.uv;
- vec2 suv = (interpolator.screen.xy / interpolator.screen.w) * 0.5 + 0.5;
vec3 p = interpolator.position.xyz;
vec3 nrmsample = texture(normal, uv).rgb;
@@ -212,7 +251,9 @@ void main() {
spec_col *
specular_brdf(uv, ref, light_dir, view_dir, nrm) *
cos_theta_i;
- float shadow = texture(shadowmaps, vec3(suv, float(l.caster_id))).r;
+ float shadow = 1.0f;
+ if (l.caster_id >= 0)
+ shadow = get_shadow(l, p);
light += (diffuse + spec) * l.brightness * l.colour * shadow;
}
diff --git a/intermediate/ts.glsl b/intermediate/ts.glsl
deleted file mode 100644
index d80d6e4..0000000
--- a/intermediate/ts.glsl
+++ /dev/null
@@ -1,179 +0,0 @@
-#ifdef DESC
-[program]
-type: graphics
-vertex: main
-fragment: main
-#endif
-
-#include "forward.h"
-
-#ifdef DESC
-
-[binding]
-name: verts
-rate: vertex
-[attribute]
-name: position
-type: vec2
-[attribute]
-name: uv
-type: vec2
-
-[interpolator]
-name: uv
-type: vec2
-
-[texture]
-name: shadowmaps
-stage: fragment
-dimension: shadowArray
-[texture]
-name: previous
-stage: fragment
-dimension: 2
-[texture]
-name: depthmap
-stage: fragment
-dimension: 2
-[texture]
-name: prev_occlusion
-stage: fragment
-dimension: 2
-
-[struct]
-name: Config
-[variable]
-name: inv_view
-type: mat4
-[variable]
-name: inv_proj
-type: mat4
-[variable]
-name: prev_vp
-type: mat4
-
-[struct]
-name: Caster_Config
-[variable]
-name: index
-type: int
-
-[cbuffer]
-name: config
-type: Config
-stage: fragment
-
-[cbuffer]
-name: caster_config
-type: Caster_Config
-stage: fragment
-
-[sbuffer]
-name: casters
-type: Caster
-stage: fragment
-
-[target]
-name: shadow_amount
-type: float
-[target]
-name: occlusion
-type: float
-
-#endif
-
-#ifdef VERTEX_SHADER
-void main() {
- interpolator.uv = uv;
- gl_Position = vec4(position, 1.0, 1.0);
-}
-#endif
-
-#ifdef FRAGMENT_SHADER
-
-vec2 poissonDisk[16] = vec2[](
- vec2(-0.94201624, -0.39906216),
- vec2(0.94558609, -0.76890725),
- vec2(-0.094184101, -0.92938870),
- vec2(0.34495938, 0.29387760),
- vec2(-0.91588581, 0.45771432),
- vec2(-0.81544232, -0.87912464),
- vec2(-0.38277543, 0.27676845),
- vec2(0.97484398, 0.75648379),
- vec2(0.44323325, -0.97511554),
- vec2(0.53742981, -0.47373420),
- vec2(-0.26496911, -0.41893023),
- vec2(0.79197514, 0.19090188),
- vec2(-0.24188840, 0.99706507),
- vec2(-0.81409955, 0.91437590),
- vec2(0.19984126, 0.78641367),
- vec2(0.14383161, -0.14100790)
-);
-
-float random(vec3 seed, int i) {
- vec4 seed4 = vec4(seed, i);
- float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673));
- return fract(sin(dot_product) * 43758.5453);
-}
-
-float get_shadow(int id, mat4 proj, vec3 wpos) {
- const int taps = 4;
- const float w = 1.0 / float(taps);
- const float m = 1.0 / 1000.0;
- int i;
- float d = 0.0f;
- vec4 surf = proj * vec4(wpos, 1.0);
- surf /= surf.w;
- surf.xy = surf.xy * 0.5 + 0.5;
- surf.z -= 0.005;
- for (i = 0; i < taps; i++) {
- float r = random(floor(wpos.xyz * 1000.0), i + globals.frame);
- int index = int(16.0 * r) % 16;
- vec2 coord = surf.xy + poissonDisk[index] * m;
- vec4 vec = vec4(coord, float(id), surf.z);
- d += texture(shadowmaps, vec).r * w;
- }
- return d;
-}
-
-vec4 get_world_pos(float depth, vec2 uv) {
- float z = depth;
- vec4 clip = vec4(uv * 2.0 - 1.0, z, 1.0);
- vec4 view = config.inv_proj * clip;
- view /= view.w;
- return config.inv_view * view;
-}
-
-void main() {
- float w_prev = 0.99;
- float w_cur = 0.01;
- Caster caster = casters[caster_config.index];
- vec2 uv = interpolator.uv;
- float d = texture(depthmap, uv).r;
- float o = texture(prev_occlusion, uv).r;
- vec4 wpos = get_world_pos(d, uv);
- vec4 prev_pos = config.prev_vp * vec4(wpos.xyz, 1.0);
- vec2 prev_uv = (prev_pos.xy / prev_pos.w) * 0.5 + 0.5;
- float prev = texture(previous, prev_uv).r;
- float base = get_shadow(
- caster_config.index,
- caster.projection,
- wpos.xyz
- );
- float jittered = get_shadow(
- caster_config.index + max_casters,
- caster.jittered,
- wpos.xyz
- );
- if (
- prev_uv.x < 0.0 || prev_uv.x > 1.0 ||
- prev_uv.y < 0.0 || prev_uv.y > 1.0 ||
- abs(d - o) > 0.001
- ) {
- shadow_amount = base;
- } else {
- shadow_amount = prev * w_prev + jittered * w_cur;
- }
- occlusion = d;
-}
-#endif
diff --git a/lighting.cpp b/lighting.cpp
index 9f154cb..0e41ddd 100644
--- a/lighting.cpp
+++ b/lighting.cpp
@@ -8,8 +8,6 @@ extern "C" {
#include "plat.h"
}
-#include <random>
-
/* needs to match surface shader */
struct GPU_Light {
v3f dir;
@@ -20,19 +18,18 @@ struct GPU_Light {
struct GPU_Caster {
m4f projection;
- m4f jittered;
};
-void Lighting::init(Device* dev, int w, int h) {
+void Lighting::init(Device* dev) {
int i;
Sampler_State ss{};
- gpu_lights.init(
+ lights.init(
dev,
"Light buffer",
max_lights * sizeof(GPU_Light),
Buffer_Flags::storage_buffer
);
- gpu_casters.init(
+ casters.init(
dev,
"Caster buffer",
max_shadows * sizeof(GPU_Caster),
@@ -46,14 +43,10 @@ void Lighting::init(Device* dev, int w, int h) {
shadow_res,
1,
1,
- shadowmap_count,
+ max_shadows,
0
);
- zero(ss_shadows, sizeof ss_shadows);
- zero(ss_shadow_slices, sizeof ss_shadow_slices);
- zero(occlusion, sizeof occlusion);
- recreate(dev, w, h);
- for (i = 0; i < shadowmap_count; i++) {
+ for (i = 0; i < max_shadows; i++) {
cameras[i] = 0;
shadow_slices[i] = dev->alias_texture(
shadows,
@@ -84,81 +77,14 @@ void Lighting::init(Device* dev, int w, int h) {
void Lighting::destroy(Device* dev, Renderer& r) {
int i;
- gpu_lights.destroy(dev);
- gpu_casters.destroy(dev);
+ lights.destroy(dev);
+ casters.destroy(dev);
dev->destroy_sampler(shadow_sampler);
- for (i = 0; i < shadowmap_count; i++) {
+ for (i = 0; i < max_shadows; i++) {
dev->destroy_texture(shadow_slices[i]);
r.destroy_camera(cameras[i]);
}
dev->destroy_texture(shadows);
- destroy_ss(dev);
-}
-
-void Lighting::destroy_ss(Device* dev) {
- int i, j;
- for (i = 0; i < 2; i++) {
- for (j = 0; j < max_shadows; j++)
- if (ss_shadow_slices[i][j])
- dev->destroy_texture(ss_shadow_slices[i][j]);
- if (ss_shadows[i])
- dev->destroy_texture(ss_shadows[i]);
- if (occlusion[i])
- dev->destroy_texture(occlusion[i]);
- }
-}
-
-void Lighting::recreate(Device* dev, int w, int h) {
- int i, j;
- destroy_ss(dev);
- for (i = 0; i < 2; i++) {
- ss_shadows[i] = dev->create_texture(
- "Shadow accumulation buffer",
- texture_format_r16f,
- Texture_Flags::sampleable | Texture_Flags::colour_target,
- w,
- h,
- 1,
- 1,
- max_shadows,
- 0
- );
- for (j = 0; j < max_shadows; j++)
- ss_shadow_slices[i][j] = dev->alias_texture(
- ss_shadows[i],
- "Shadow accumulation buffer slice",
- texture_format_r16f,
- Texture_Flags::colour_target,
- w,
- h,
- 1,
- 1,
- 1,
- 0,
- j
- );
- occlusion[i] = dev->create_texture(
- "Occlusion buffer",
- texture_format_r32f,
- Texture_Flags::sampleable | Texture_Flags::colour_target,
- w,
- h,
- 1,
- 1,
- 1,
- 0
- );
- }
-}
-
-Camera_Id Lighting::gm_cam(Renderer& r) {
- int id = cam_count++;
- Camera_Id cid = cameras[id];
- if (!cid) {
- cid = r.create_camera();
- cameras[id] = cid;
- }
- return cid;
}
void Lighting::write_bufs(
@@ -171,10 +97,6 @@ void Lighting::write_bufs(
GPU_Light* ldst = (GPU_Light*)lptr;
GPU_Caster* cdst = (GPU_Caster*)cptr;
int count = 0, ccount = 0;
- cam_count = 0;
- std::random_device dev;
- std::mt19937 rng(dev());
- std::uniform_real_distribution<float> dist6(-0.01f, 0.01f);
for (auto v : w.view<Sun_Light>()) {
GPU_Light gl;
Sun_Light& l = v.get<Sun_Light>();
@@ -186,22 +108,15 @@ void Lighting::write_bufs(
gl.colour = l.colour;
gl.dir = l.dir;
if (l.caster && ccount < max_shadows) {
- Camera* cam[2];
int cid = ccount++;
- Caster& caster = casters[cid];
- GPU_Caster& gc = cdst[cid];
- v3f jitter(
- dist6(rng),
- dist6(rng),
- dist6(rng)
- );
- caster = Caster { gm_cam(r), gm_cam(r) };
- cam[0] = &r.get_camera(caster.reality);
- cam[1] = &r.get_camera(caster.jittered);
- cam[0]->init_shadow(l.dir, s.bound.min, s.bound.max);
- cam[1]->init_shadow(l.dir + jitter, s.bound.min, s.bound.max);
- gc.projection = cam[0]->get_proj() * cam[0]->get_view();
- gc.jittered = cam[1]->get_proj() * cam[1]->get_view();
+ GPU_Caster& c = cdst[cid];
+ Camera_Id camid = cameras[cid];
+ if (!camid)
+ camid = r.create_camera();
+ Camera& cam = r.get_camera(camid);
+ cam.init_shadow(l.dir, s.bound.min, s.bound.max);
+ c.projection = cam.get_proj() * cam.get_view();
+ cameras[cid] = camid;
gl.caster_id = cid;
} else
gl.caster_id = -1;
@@ -219,10 +134,10 @@ void Lighting::update(
Model_Scene& s
) {
light_count = 0;
- write_bufs(gpu_lights.map(dev), gpu_casters.map(dev), w, r, s);
- gpu_casters.unmap(dev);
- gpu_lights.unmap(dev);
- gpu_lights.update(ctx);
- gpu_casters.update(ctx);
+ write_bufs(lights.map(dev), casters.map(dev), w, r, s);
+ casters.unmap(dev);
+ lights.unmap(dev);
+ lights.update(ctx);
+ casters.update(ctx);
}
diff --git a/lighting.hpp b/lighting.hpp
index ac2d2c5..ccd08d3 100644
--- a/lighting.hpp
+++ b/lighting.hpp
@@ -11,32 +11,19 @@ struct Model_Scene;
struct Renderer;
struct World;
-struct Caster {
- Camera_Id reality;
- Camera_Id jittered;
-};
-
struct Lighting {
static constexpr int max_lights = 128;
static constexpr int max_shadows = 16;
- static constexpr int shadowmap_count = max_shadows * 2;
static constexpr int shadow_res = 2048;
- Staged_Buffer gpu_lights;
- Staged_Buffer gpu_casters;
+ Staged_Buffer lights;
+ Staged_Buffer casters;
Texture_Id shadows;
- Texture_Id shadow_slices[shadowmap_count];
- Texture_Id ss_shadows[2];
- Texture_Id ss_shadow_slices[2][shadowmap_count];
- Texture_Id occlusion[2];
+ Texture_Id shadow_slices[max_shadows];
Sampler_Id shadow_sampler;
- Caster casters[max_shadows];
- Camera_Id cameras[shadowmap_count];
- int light_count, caster_count, cam_count;
- void init(Device* dev, int w, int h);
- void destroy_ss(Device* dev);
- void recreate(Device* dev, int w, int h);
+ Camera_Id cameras[max_shadows];
+ int light_count, caster_count;
+ void init(Device* dev);
void destroy(Device* dev, Renderer& r);
- Camera_Id gm_cam(Renderer& r);
void update(
Device* dev,
Context& ctx,
diff --git a/model.cpp b/model.cpp
index aa65898..f24c0eb 100644
--- a/model.cpp
+++ b/model.cpp
@@ -386,9 +386,9 @@ void Model_Instance::render(
} else {
pb.depth(true, false, Depth_Mode::equal);
pb.shader(mesh.shader);
- pb.sbuffer(mesh.light_binding, lighting->gpu_lights.gpuonly);
- pb.sbuffer(mesh.casters_binding, lighting->gpu_casters.gpuonly);
- pb.texture(mesh.shadowmaps_binding, res.shadows, res.sampler);
+ pb.sbuffer(mesh.light_binding, lighting->lights.gpuonly);
+ pb.sbuffer(mesh.casters_binding, lighting->casters.gpuonly);
+ pb.texture(mesh.shadowmaps_binding, lighting->shadows, lighting->shadow_sampler);
mesh.material->use(pb, res.sampler, dev->get_shader(mesh.shader));
pb.cbuffer(
mesh.mat_binding,
diff --git a/model.hpp b/model.hpp
index 022ec27..7417e51 100644
--- a/model.hpp
+++ b/model.hpp
@@ -97,7 +97,6 @@ struct Material_Loader : public Asset_Loader {
struct Model_Resources {
Texture_Id env_cubemap;
- Texture_Id shadows;
Sampler_Id sampler;
Buffer_Id vp;
Buffer_Id globals;
diff --git a/renderer.cpp b/renderer.cpp
index 8bc2d94..d8c4895 100644
--- a/renderer.cpp
+++ b/renderer.cpp
@@ -5,23 +5,10 @@ extern "C" {
#include "memory.h"
}
-#include <string.h>
-
struct VP_Cbuffer {
m4f view_projection;
};
-struct TS_Cbuffer {
- m4f inv_view;
- m4f inv_proj;
- m4f prev_vp;
-};
-
-struct TS_Caster_Config {
- int index;
- char pad[60];
-};
-
struct Global_Cbuffer {
v3f camera_pos;
int light_count;
@@ -49,21 +36,7 @@ void init_drawlist(
);
}
-void Renderer::make_ts_sampler(Device* d) {
- Sampler_State s{};
- s.min = Filter_Mode::point;
- s.mag = Filter_Mode::point;
- s.mip = Filter_Mode::point;
- s.address_u = Address_Mode::clamp;
- s.address_v = Address_Mode::clamp;
- ts_sampler = d->create_sampler("temporal shadow sampler", s);
-}
-
-void Renderer::init(
- Arena* arena,
- Device* d,
- Asset_Arena& assets
-) {
+void Renderer::init(Arena* arena, Device* d) {
int i;
auto id = [&](int did, int cap) {
init_drawlist(&drawlists[did], d, arena, cap);
@@ -71,8 +44,6 @@ void Renderer::init(
id(FORWARD, 512);
for (i = SHADOW_MAP_START; i < SHADOW_MAP_END; i++)
id(i, 512);
- for (i = SHADOW_JIT_START; i < SHADOW_JIT_END; i++)
- id(i, 512);
camera_count = 1;
cameras.init();
globals.init(
@@ -81,39 +52,6 @@ void Renderer::init(
sizeof(Global_Cbuffer),
Buffer_Flags::constant_buffer
);
- ts_config.init(
- d,
- "Temporal shadow cbuffer",
- sizeof(TS_Cbuffer),
- Buffer_Flags::constant_buffer
- );
- ts_config2.init(
- d,
- "Temporal shadow casters",
- sizeof(TS_Caster_Config) * Lighting::max_shadows,
- Buffer_Flags::constant_buffer
- );
- quad.init(d);
- ts_shader = (Shader*)assets.load("ts.csh");
- ts_shadowmap_binding = ts_shader->descriptor_binding("shadowmaps");
- ts_depthmap_binding = ts_shader->descriptor_binding("depthmap");
- ts_prev_binding = ts_shader->descriptor_binding("previous");
- ts_vert_binding = ts_shader->binding_index("verts");
- ts_config_binding = ts_shader->descriptor_binding("config");
- ts_caster_config_binding = ts_shader->descriptor_binding("caster_config");
- ts_casters_binding = ts_shader->descriptor_binding("casters");
- ts_globals_binding = ts_shader->descriptor_binding("globals");
- ts_prev_occlusion_binding = ts_shader->descriptor_binding("prev_occlusion");
- assert(ts_shadowmap_binding >= 0);
- assert(ts_depthmap_binding >= 0);
- assert(ts_prev_binding >= 0);
- assert(ts_vert_binding >= 0);
- assert(ts_config_binding >= 0);
- assert(ts_caster_config_binding >= 0);
- assert(ts_casters_binding >= 0);
- assert(ts_globals_binding >= 0);
- assert(ts_prev_occlusion_binding >= 0);
- make_ts_sampler(d);
frame = 0;
}
@@ -122,10 +60,6 @@ void Renderer::destroy(Device* d) {
for (i = 0; i < drawlist_count; i++)
drawlists[i].vp.destroy(d);
globals.destroy(d);
- ts_config.destroy(d);
- ts_config2.destroy(d);
- quad.destroy(d);
- d->destroy_sampler(ts_sampler);
}
void Renderer::set_camera(Camera_Id cam, int drawlist) {
@@ -147,7 +81,6 @@ void Drawlist::render(
vpc->view_projection = cam.get_proj() * cam.get_view();
vp.unmap(dev);
vp.update(dev->get_ctx());
- res.shadows = l->ss_shadows[r.frame & 1];
res.sampler = r.clamped_linear;
res.env_cubemap = r.env_cubemap;
res.vp = vp.gpuonly;
@@ -173,73 +106,6 @@ void Renderer::update_globals(
globals.update(ctx);
}
-void Renderer::temporal_shadows(
- Device* dev,
- Context& ctx,
- const Lighting* l,
- Pipeline_Builder& pb
-) {
- int i, c = l->caster_count;
- Camera& cam = get_camera(drawlists[FORWARD].camera);
- TS_Cbuffer* cbuf = (TS_Cbuffer*)ts_config.map(dev);
- TS_Caster_Config* casters = (TS_Caster_Config*)ts_config2.map(dev);
- for (i = 0; i < c; i++) {
- casters[i].index = i;
- }
- cbuf->inv_view = cam.get_view().inverse();
- cbuf->inv_proj = cam.get_proj().inverse();
- cbuf->prev_vp = prev_vp;
- ts_config.unmap(dev);
- ts_config2.unmap(dev);
- ctx.debug_push("temporal shadows");
- ts_config.update(ctx);
- ts_config2.update(ctx);
- for (i = 0; i < c; i++) {
- int ind = frame & 1;
- auto& pass = pb
- .begin_rp()
- .rp_target(l->ss_shadow_slices[ind][i], Clear_Mode::discard)
- .rp_target(l->occlusion[ind], Clear_Mode::discard)
- .build_rp();
- auto& pip = pb
- .begin()
- .shader(ts_shader->id)
- .vertex_format(ts_shader->vf)
- .texture(
- ts_shadowmap_binding,
- l->shadows,
- l->shadow_sampler)
- .texture(
- ts_prev_binding,
- l->ss_shadow_slices[!ind][i],
- ts_sampler)
- .texture(
- ts_depthmap_binding,
- dev->get_depth_target(),
- ts_sampler)
- .texture(
- ts_prev_occlusion_binding,
- l->occlusion[!ind],
- ts_sampler)
- .cbuffer(ts_config_binding, ts_config.gpuonly)
- .cbuffer(
- ts_caster_config_binding,
- ts_config2.gpuonly,
- i * sizeof(TS_Caster_Config),
- sizeof(TS_Caster_Config))
- .cbuffer(ts_globals_binding, globals.gpuonly)
- .sbuffer(ts_casters_binding, l->gpu_casters.gpuonly)
- .build();
- quad.render(
- ctx,
- pip,
- pass,
- ts_vert_binding
- );
- }
- ctx.debug_pop();
-}
-
void Renderer::render(
Device* dev,
Arena* a, Texture_Id hdr_target,
@@ -260,11 +126,11 @@ void Renderer::render(
.rp_target(hdr_target, Clear_Mode::restore)
.rp_depth_target(dev->get_depth_target(), Clear_Mode::restore)
.build_rp();
- Render_Pass* shadow_passes[drawlist_count];
- for (i = SHADOW_MAP_START, j = 0; i < SHADOW_JIT_END; i++, j++) {
+ Render_Pass* shadow_passes[Lighting::max_shadows];
+ for (i = 0; i < Lighting::max_shadows; i++) {
shadow_passes[i] = &pb
.begin_rp()
- .rp_depth_target(l->shadow_slices[j], 1.0f)
+ .rp_depth_target(l->shadow_slices[i], 1.0f)
.build_rp();
}
@@ -272,26 +138,22 @@ void Renderer::render(
drawlists[FORWARD].render(*this, dev, a, l, depth_prepass, 0);
ctx.debug_pop();
- auto shadows = [&]<typename T>(int s, T cam) {
- for (i = s, j = 0; j < l->caster_count; i++, j++) {
- auto o = [](Pipeline_Builder& pb) {
- pb.cull(Cull_Mode::front);
- };
- setcam(i, l->casters[j].*cam);
- ctx.debug_push("shadow map");
- drawlists[i].render(*this, dev, a, l, *shadow_passes[i], o);
- ctx.debug_pop();
- }
- };
ctx.debug_push("shadow maps");
- shadows(SHADOW_MAP_START, &Caster::reality);
- ctx.debug_pop();
- ctx.debug_push("jittered shadow maps");
- shadows(SHADOW_JIT_START, &Caster::jittered);
+ for (
+ i = SHADOW_MAP_START, j = 0;
+ i < SHADOW_MAP_END && j < l->caster_count;
+ i++, j++
+ ) {
+ auto o = [](Pipeline_Builder& pb) {
+ pb.cull(Cull_Mode::front);
+ };
+ setcam(i, l->cameras[j]);
+ ctx.debug_push("shadow map");
+ drawlists[i].render(*this, dev, a, l, *shadow_passes[j], o);
+ ctx.debug_pop();
+ }
ctx.debug_pop();
- temporal_shadows(dev, ctx, l, pb);
-
ctx.debug_push("forward");
drawlists[FORWARD].render(*this, dev, a, l, forward_pass, 0);
ctx.debug_pop();
@@ -348,54 +210,3 @@ void Renderer::setcam(int did, Camera_Id cam) {
assert(cam.index);
drawlists[did].camera = cam;
}
-
-void Fullscreen_Quad::init(Device* d) {
- float verts[] = {
- -1.0f, -1.0f, 0.0f, 0.0f,
- -1.0f, 3.0f, 0.0f, 2.0f,
- 3.0f, -1.0f, 2.0f, 0.0f
- };
- Buffer_Id stage;
- void* mem;
- stage = d->create_buffer(
- "sky vb stage",
- sizeof verts,
- Buffer_Flags::cpu_readwrite |
- Buffer_Flags::copy_src
- );
- mem = d->map_buffer(stage, 0, sizeof verts);
- memcpy(mem, verts, sizeof verts);
- d->unmap_buffer(stage);
- vb = d->create_buffer(
- "fullscreen quad",
- sizeof verts,
- Buffer_Flags::copy_dst |
- Buffer_Flags::vertex_buffer
- );
- Context& ctx = d->acquire();
- ctx.copy(vb, stage);
- d->submit(ctx);
- d->destroy_bufferi(stage);
-}
-
-void Fullscreen_Quad::destroy(Device* d) {
- d->destroy_buffer(vb);
-}
-
-void Fullscreen_Quad::render(
- Context& ctx,
- Pipeline& pip,
- Render_Pass& pass,
- int bind
-) {
- Vertex_Buffer_Binding vbb[] = {{
- .id = vb,
- .offset = 0,
- .target = bind
- }, {}};
- Draw draw{};
- draw.verts = vbb;
- draw.vertex_count = 3;
- draw.instance_count = 1;
- ctx.submit(draw, pip, pass);
-}
diff --git a/renderer.hpp b/renderer.hpp
index 20c7f98..c49c804 100644
--- a/renderer.hpp
+++ b/renderer.hpp
@@ -10,11 +10,8 @@ enum {
FORWARD,
SHADOW_MAP_START,
SHADOW_MAP_END = SHADOW_MAP_START + Lighting::max_shadows,
- SHADOW_JIT_START = SHADOW_MAP_END,
- SHADOW_JIT_END = SHADOW_JIT_START + Lighting::max_shadows,
- drawlist_count = SHADOW_JIT_END };
+ drawlist_count = SHADOW_MAP_END };
-struct Asset_Arena;
struct Model_Instance;
struct Renderer;
@@ -35,62 +32,26 @@ struct Drawlist {
);
};
-struct Fullscreen_Quad {
- Buffer_Id vb;
-
- void init(Device* d);
- void destroy(Device* d);
- void render(
- Context& ctx,
- Pipeline& pip,
- Render_Pass& pass,
- int bind
- );
-};
-
struct Renderer {
static constexpr int max_cameras = 16;
Hash_Map<Camera_Id, Camera, max_cameras> cameras;
Drawlist drawlists[drawlist_count];
Staged_Buffer globals;
- Fullscreen_Quad quad;
int camera_count;
int frame;
- Shader* ts_shader;
- int ts_shadowmap_binding;
- int ts_depthmap_binding;
- int ts_prev_binding;
- int ts_vert_binding;
- int ts_config_binding;
- int ts_caster_config_binding;
- int ts_casters_binding;
- int ts_globals_binding;
- int ts_prev_occlusion_binding;
- Sampler_Id ts_sampler;
- Staged_Buffer ts_config, ts_config2;
-
- m4f prev_vp;
-
Sampler_Id clamped_linear;
Texture_Id env_cubemap;
- void init(Arena* arena, Device* d, Asset_Arena& assets);
+ void init(Arena* arena, Device* d);
void destroy(Device* d);
void set_camera(Camera_Id cam, int drawlist);
- void make_ts_sampler(Device* d);
void render(
Device* dev,
Arena* a,
Texture_Id hdr_target,
const Lighting* l
);
- void temporal_shadows(
- Device* dev,
- Context& ctx,
- const Lighting* l,
- Pipeline_Builder& pb
- );
void add_model(int drawlist, Model_Instance* m);
void rem_model(int drawlist, Model_Instance* m);
diff --git a/sc/sc.cpp b/sc/sc.cpp
index 1f7ccba..9232e10 100644
--- a/sc/sc.cpp
+++ b/sc/sc.cpp
@@ -601,7 +601,7 @@ struct Desc {
size_t i, l = trgts.size();
for (i = 0; i < l; i++) {
auto& attr = trgts[i];
- ss << "layout (location = " << i << ") out ";
+ ss << "layout (location = 0) out ";
ss << attr.tname << " ";
ss << attr.name << ";\n";
}
diff --git a/src/guy.blend b/src/guy.blend
deleted file mode 100644
index a3b14ce..0000000
--- a/src/guy.blend
+++ /dev/null
Binary files differ
diff --git a/video.cpp b/video.cpp
index 3e960be..fa98813 100644
--- a/video.cpp
+++ b/video.cpp
@@ -1386,7 +1386,7 @@ void Device_Vk::create_depth(int w, int h) {
destroy_texture(depth);
depth = create_texture(
"default depth",
- texture_format_d32,
+ texture_format_d24s8,
Texture_Flags::sampleable | Texture_Flags::depth_stencil_target,
w,
h,
@@ -1628,8 +1628,8 @@ void Renderpass_Vk::init(
const Rpo_Key& rpk
) {
VkRenderPassCreateInfo ri{};
- VkAttachmentDescription ads[max_colour_attachments + 1];
- VkAttachmentReference cars[max_colour_attachments], dar;
+ VkAttachmentDescription ads[2];
+ VkAttachmentReference car, dar;
VkSubpassDescription sd{};
VkResult r;
auto& rp = rpk.rpo;
@@ -1637,12 +1637,10 @@ void Renderpass_Vk::init(
bool has_depth = rp.depth.id;
int count = 0, i, c = rp.colour_count;
zero(ads, sizeof ads);
- zero(cars, sizeof cars);
for (i = 0; i < c; i++) {
int index = count++;
auto& colour = rp.colours[i];
auto& ad = ads[index];
- auto& car = cars[index];
ad.format = get_vk_format(colour.fmt);
ad.samples = VK_SAMPLE_COUNT_1_BIT;
ad.loadOp = load_op_from_mode(colour.mode);
@@ -1679,7 +1677,7 @@ void Renderpass_Vk::init(
sd.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
sd.colorAttachmentCount = rp.colour_count;
- sd.pColorAttachments = cars;
+ sd.pColorAttachments = &car;
sd.pDepthStencilAttachment = has_depth? &dar: 0;
ri.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
@@ -1706,7 +1704,7 @@ void Framebuffer_Vk::init(
) {
bool has_depth = rp.depth.id;
int i, count = 0;
- VkImageView atts[max_colour_attachments + 1];
+ VkImageView atts[2];
VkResult r;
VkFramebufferCreateInfo fbi{};
for (i = 0; i < rp.colour_count; i++) {
@@ -2882,11 +2880,12 @@ void Pipeline_Vk::init_blending(
zero(&bi, sizeof bi);
if (rp.colour_count) {
int i, c = rp.colour_count;
- abs = (VkPipelineColorBlendAttachmentState*)arena_alloc(
+ abs =
+ (VkPipelineColorBlendAttachmentState*)arena_alloc(
&scope,
- sizeof *abs * c
+ sizeof abs * c
);
- zero(abs, sizeof *abs * c);
+ zero(abs, sizeof *abs);
for (i = 0; i < c; i++) {
auto& ab = abs[i];
ab.colorWriteMask =
diff --git a/video.hpp b/video.hpp
index 4289685..5aa25bc 100644
--- a/video.hpp
+++ b/video.hpp
@@ -553,7 +553,6 @@ struct Context {
void submit(const Render_Pass& rp);
void copy(Buffer_Id dst, Buffer_Id src);
void copy(Texture_Id dst, Buffer_Id src);
- void copy(Texture_Id dst, Texture_Id src);
void transition(Texture_Id id, Resource_State state);
void debug_push(const char* name);
void debug_pop();