Skip to content

Commit

Permalink
renderer: Frustum culling demo.
Browse files Browse the repository at this point in the history
  • Loading branch information
heinezen committed Jul 21, 2024
1 parent 6fe3f9a commit 67cf2d1
Show file tree
Hide file tree
Showing 21 changed files with 786 additions and 10 deletions.
37 changes: 37 additions & 0 deletions assets/test/shaders/demo_6_2d.frag.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#version 330

in vec2 vert_uv;

layout(location=0) out vec4 col;

uniform sampler2D tex;

// position (top left corner) and size: (x, y, width, height)
uniform vec4 tile_params;

vec2 uv = vec2(
vert_uv.x * tile_params.z + tile_params.x,
vert_uv.y * tile_params.w + tile_params.y
);

void main() {
vec4 tex_val = texture(tex, uv);
int alpha = int(round(tex_val.a * 255));
switch (alpha) {
case 0:
col = tex_val;
discard;
case 254:
col = vec4(1.0f, 0.0f, 0.0f, 1.0f);
break;
case 252:
col = vec4(0.0f, 1.0f, 0.0f, 1.0f);
break;
case 250:
col = vec4(0.0f, 0.0f, 1.0f, 1.0f);
break;
default:
col = tex_val;
break;
}
}
83 changes: 83 additions & 0 deletions assets/test/shaders/demo_6_2d.vert.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#version 330

layout(location=0) in vec2 v_position;
layout(location=1) in vec2 uv;

out vec2 vert_uv;

// camera parameters for transforming the object position
// and scaling the subtex to the correct size
layout (std140) uniform camera {
// view matrix (world to view space)
mat4 view;
// projection matrix (view to clip space)
mat4 proj;
// inverse zoom factor (1.0 / zoom)
// high zoom = upscale subtex
// low zoom = downscale subtex
float inv_zoom;
// inverse viewport size (1.0 / viewport size)
vec2 inv_viewport_size;
};

// position of the object in world space
uniform vec3 obj_world_position;

// parameters for scaling and moving the subtex
// to the correct position in clip space

// animation scalefactor
// scales the vertex positions so that they
// match the subtex dimensions
//
// high animation scale = downscale subtex
// low animation scale = upscale subtex
uniform float scale;

// size of the subtex (in pixels)
uniform vec2 subtex_size;

// offset of the subtex anchor point
// from the subtex center (in pixels)
// used to move the subtex so that the anchor point
// is at the object position
uniform vec2 anchor_offset;

void main() {
// translate the position of the object from world space to clip space
// this is the position where we want to draw the subtex in 2D
vec4 obj_clip_pos = proj * view * vec4(obj_world_position, 1.0);

// subtex has to be scaled to account for the zoom factor
// and the animation scale factor. essentially this is (animation scale / zoom).
float zoom_scale = scale * inv_zoom;

// Scale the subtex vertices
// we have to account for the viewport size to get the correct dimensions
// and then scale the subtex to the zoom factor to get the correct size
vec2 vert_scale = zoom_scale * subtex_size * inv_viewport_size;

// Scale the anchor offset with the same method as above
// to get the correct anchor position in the viewport
vec2 anchor_scale = zoom_scale * anchor_offset * inv_viewport_size;

// offset the clip position by the offset of the subtex anchor
// imagine this as pinning the subtex to the object position at the subtex anchor point
obj_clip_pos += vec4(anchor_scale.x, anchor_scale.y, 0.0, 0.0);

// create a move matrix for positioning the vertices
// uses the vert scale and the transformed object position in clip space
mat4 move = mat4(vert_scale.x, 0.0, 0.0, 0.0,
0.0, vert_scale.y, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
obj_clip_pos.x, obj_clip_pos.y, obj_clip_pos.z, 1.0);

// calculate the final vertex position
gl_Position = move * vec4(v_position, 0.0, 1.0);

// flip y axis because OpenGL uses bottom-left as its origin
float uv_x = uv.x;
float uv_y = 1.0 - uv.y;

vert_uv = vec2(uv_x, uv_y);
}
7 changes: 7 additions & 0 deletions assets/test/shaders/demo_6_2d_frame.frag.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#version 330

out vec4 col;

void main() {
col = vec4(1.0, 0.0, 0.0, 0.8);
}
58 changes: 58 additions & 0 deletions assets/test/shaders/demo_6_2d_frame.vert.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#version 330

layout(location=0) in vec2 v_position;

// camera parameters for transforming the object position
// and scaling the subtex to the correct size
layout (std140) uniform camera {
// view matrix (world to view space)
mat4 view;
// projection matrix (view to clip space)
mat4 proj;
// inverse zoom factor (1.0 / zoom)
float inv_zoom;
// inverse viewport size (1.0 / viewport size)
vec2 inv_viewport_size;
};

// position of the object in world space
uniform vec3 obj_world_position;

// parameters for scaling and moving the subtex
// to the correct position in clip space

// animation scalefactor
// scales the vertex positions so that they
// match the subtex dimensions
//
// high animation scale = downscale subtex
// low animation scale = upscale subtex
uniform float scale;

// size of the frame (in pixels)
uniform vec2 frame_size;

void main() {
// translate the position of the object from world space to clip space
// this is the position where we want to draw the subtex in 2D
vec4 obj_clip_pos = proj * view * vec4(obj_world_position, 1.0);

// subtex has to be scaled to account for the zoom factor
// and the animation scale factor. essentially this is (animation scale / zoom).
float zoom_scale = scale * inv_zoom;

// Scale the subtex vertices
// we have to account for the viewport size to get the correct dimensions
// and then scale the frame to the zoom factor to get the correct size
vec2 vert_scale = zoom_scale * frame_size * inv_viewport_size;

// create a move matrix for positioning the vertices
// uses the vert scale and the transformed object position in clip space
mat4 move = mat4(vert_scale.x, 0.0, 0.0, 0.0,
0.0, vert_scale.y, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
obj_clip_pos.x, obj_clip_pos.y, obj_clip_pos.z, 1.0);

// calculate the final vertex position
gl_Position = move * vec4(v_position, 0.0, 1.0);
}
13 changes: 13 additions & 0 deletions assets/test/shaders/demo_6_3d.frag.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#version 330

in vec2 tex_pos;

layout(location=0) out vec4 out_col;

uniform sampler2D tex;

void main()
{
vec4 tex_val = texture(tex, tex_pos);
out_col = tex_val;
}
24 changes: 24 additions & 0 deletions assets/test/shaders/demo_6_3d.vert.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#version 330

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 uv;

out vec2 tex_pos;

// camera parameters for transforming the object position
// and scaling the subtex to the correct size
layout (std140) uniform camera {
// view matrix (world to view space)
mat4 view;
// projection matrix (view to clip space)
mat4 proj;
// inverse zoom factor (1.0 / zoom)
float inv_zoom;
// inverse viewport size (1.0 / viewport size)
vec2 inv_viewport_size;
};

void main() {
gl_Position = proj * view * vec4(position, 1.0);
tex_pos = vec2(uv.x, 1.0 - uv.y);
}
10 changes: 10 additions & 0 deletions assets/test/shaders/demo_6_display.frag.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#version 330

uniform sampler2D color_texture;

in vec2 v_uv;
out vec4 col;

void main() {
col = texture(color_texture, v_uv);
}
10 changes: 10 additions & 0 deletions assets/test/shaders/demo_6_display.vert.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#version 330

layout(location=0) in vec2 position;
layout(location=1) in vec2 uv;
out vec2 v_uv;

void main() {
gl_Position = vec4(position, 0.0, 1.0);
v_uv = uv;
}
1 change: 1 addition & 0 deletions libopenage/renderer/demo/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ add_sources(libopenage
demo_3.cpp
demo_4.cpp
demo_5.cpp
demo_6.cpp
stresstest_0.cpp
stresstest_1.cpp
tests.cpp
Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_0.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2024 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#include "demo_0.h"

Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_0.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2023 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#pragma once

Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_1.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2024 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#include "demo_1.h"

Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_1.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2023 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#pragma once

Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_2.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2024 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#include "demo_2.h"

Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_2.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2023 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#pragma once

Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_3.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2024 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#include "demo_3.h"

Expand Down
3 changes: 1 addition & 2 deletions libopenage/renderer/demo/demo_3.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2023 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#pragma once

Expand All @@ -10,7 +10,6 @@ namespace openage::renderer::tests {
* Show off the render stages in the level 2 renderer and the camera
* system.
* - Window creation
* - Loading shaders
* - Creating a camera
* - Initializing the level 2 render stages: skybox, terrain, world, screen
* - Adding renderables to the render stages via the render factory
Expand Down
2 changes: 1 addition & 1 deletion libopenage/renderer/demo/demo_4.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2015-2023 the openage authors. See copying.md for legal info.
// Copyright 2023-2024 the openage authors. See copying.md for legal info.

#pragma once

Expand Down
Loading

0 comments on commit 67cf2d1

Please sign in to comment.