Skip to content

Commit a23e65c

Browse files
committed
UPBGE: Use VBO and VAO for debug drawing.
Using VBO and VAO allow to render all the lines in one command and to render all the AABB and frustum using instancing in one command too. The usage of VBO request that all the structs for lines, aabbs, frustum and boxes use array instead of mathfu types to avoid SSE padding and alignement. Four shaders are introduced to help debug drawing using instancing. The first is just for drawing lines using a flat color, the second is for wire boxes, the third for solid boxes with in and out color and the fourth for 2d boxes. All the these geometry type use geometry instancing. For each type RAS_OpenGLDebugDraw allocate a VAO and multiples VBOs, they are stored into m_vbos and m_vaos and accessed thanks to enums. The VAO are initialized in RAS_OpenGlDebugDraw constructor pointing to the uninitialized VBOs, some VBOs as unit 3d and 2d box and IBOs are initialized in the same time. At each render step the VBO containing data about instancing or geometry are updated from the data list contained into RAS_DebugDraw. Then the render is procceed binding the VAO and calling the proper draw call. 2d boxes receive a special treatment. The boxes are rendered using a vertically inverted ortho matrix because the Y axis is from the top of the screen. All these modification ends in a significant speedup for debug drawing and makes the code easier to move to blender 2.8.
1 parent cd9fa2b commit a23e65c

18 files changed

+474
-258
lines changed

source/blender/gpu/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ set(SRC
6262
intern/gpu_shader.c
6363
intern/gpu_texture.c
6464

65+
shaders/gpu_shader_2d_box_vert.glsl
66+
shaders/gpu_shader_flat_color_frag.glsl
67+
shaders/gpu_shader_flat_color_vert.glsl
6568
shaders/gpu_shader_fx_lib.glsl
6669
shaders/gpu_shader_fx_ssao_frag.glsl
6770
shaders/gpu_shader_fx_dof_frag.glsl
@@ -83,6 +86,9 @@ set(SRC
8386
shaders/gpu_shader_vsm_store_vert.glsl
8487
shaders/gpu_shader_fx_depth_resolve.glsl
8588
shaders/gpu_shader_fire_frag.glsl
89+
shaders/gpu_shader_frustum_line_vert.glsl
90+
shaders/gpu_shader_frustum_solid_frag.glsl
91+
shaders/gpu_shader_frustum_solid_vert.glsl
8692
shaders/gpu_shader_smoke_frag.glsl
8793
shaders/gpu_shader_smoke_vert.glsl
8894

@@ -104,7 +110,13 @@ set(SRC
104110
intern/gpu_select_private.h
105111
)
106112

113+
data_to_c_simple(shaders/gpu_shader_2d_box_vert.glsl SRC)
107114
data_to_c_simple(shaders/gpu_shader_geometry.glsl SRC)
115+
data_to_c_simple(shaders/gpu_shader_flat_color_frag.glsl SRC)
116+
data_to_c_simple(shaders/gpu_shader_flat_color_vert.glsl SRC)
117+
data_to_c_simple(shaders/gpu_shader_frustum_line_vert.glsl SRC)
118+
data_to_c_simple(shaders/gpu_shader_frustum_solid_vert.glsl SRC)
119+
data_to_c_simple(shaders/gpu_shader_frustum_solid_frag.glsl SRC)
108120
data_to_c_simple(shaders/gpu_shader_fire_frag.glsl SRC)
109121
data_to_c_simple(shaders/gpu_shader_smoke_frag.glsl SRC)
110122
data_to_c_simple(shaders/gpu_shader_smoke_vert.glsl SRC)

source/blender/gpu/GPU_shader.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ typedef enum GPUBuiltinShader {
104104
GPU_SHADER_DRAW_FRAME_BUFFER = 8,
105105
GPU_SHADER_STEREO_STIPPLE = 9,
106106
GPU_SHADER_STEREO_ANAGLYPH = 10,
107+
GPU_SHADER_FRUSTUM_LINE = 11,
108+
GPU_SHADER_FRUSTUM_SOLID = 12,
109+
GPU_SHADER_FLAT_COLOR = 13,
110+
GPU_SHADER_2D_BOX = 14,
107111
} GPUBuiltinShader;
108112

109113
GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);

source/blender/gpu/intern/gpu_shader.c

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,17 @@
4747
#define MAX_EXT_DEFINE_LENGTH 1024
4848

4949
/* Non-generated shaders */
50+
extern char datatoc_gpu_shader_2d_box_vert_glsl[];
5051
extern char datatoc_gpu_shader_black_frag_glsl[];
5152
extern char datatoc_gpu_shader_black_vert_glsl[];
53+
extern char datatoc_gpu_shader_fire_frag_glsl[];
54+
extern char datatoc_gpu_shader_flat_color_frag_glsl[];
55+
extern char datatoc_gpu_shader_flat_color_vert_glsl[];
5256
extern char datatoc_gpu_shader_frame_buffer_frag_glsl[];
5357
extern char datatoc_gpu_shader_frame_buffer_vert_glsl[];
54-
extern char datatoc_gpu_shader_fire_frag_glsl[];
58+
extern char datatoc_gpu_shader_frustum_line_vert_glsl[];
59+
extern char datatoc_gpu_shader_frustum_solid_vert_glsl[];
60+
extern char datatoc_gpu_shader_frustum_solid_frag_glsl[];
5561
extern char datatoc_gpu_shader_smoke_vert_glsl[];
5662
extern char datatoc_gpu_shader_smoke_frag_glsl[];
5763
extern char datatoc_gpu_shader_vsm_store_vert_glsl[];
@@ -82,6 +88,10 @@ static struct GPUShadersGlobal {
8288
GPUShader *draw_frame_buffer;
8389
GPUShader *stereo_stipple;
8490
GPUShader *stereo_anaglyph;
91+
GPUShader *frustum_line;
92+
GPUShader *frustum_solid;
93+
GPUShader *flat_color;
94+
GPUShader *box2d;
8595
/* cache for shader fx. Those can exist in combinations so store them here */
8696
GPUShader *fx_shaders[MAX_FX_SHADERS * 2];
8797
} shaders;
@@ -760,6 +770,34 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
760770
NULL, NULL, "#define ANAGLYPH;\n", 0, 0, 0);
761771
retval = GG.shaders.stereo_anaglyph;
762772
break;
773+
case GPU_SHADER_FRUSTUM_LINE:
774+
if (!GG.shaders.frustum_line)
775+
GG.shaders.frustum_line = GPU_shader_create(
776+
datatoc_gpu_shader_frustum_line_vert_glsl, datatoc_gpu_shader_flat_color_frag_glsl,
777+
NULL, NULL, NULL, 0, 0, 0);
778+
retval = GG.shaders.frustum_line;
779+
break;
780+
case GPU_SHADER_FRUSTUM_SOLID:
781+
if (!GG.shaders.frustum_solid)
782+
GG.shaders.frustum_solid = GPU_shader_create(
783+
datatoc_gpu_shader_frustum_solid_vert_glsl, datatoc_gpu_shader_frustum_solid_frag_glsl,
784+
NULL, NULL, NULL, 0, 0, 0);
785+
retval = GG.shaders.frustum_solid;
786+
break;
787+
case GPU_SHADER_FLAT_COLOR:
788+
if (!GG.shaders.flat_color)
789+
GG.shaders.flat_color = GPU_shader_create(
790+
datatoc_gpu_shader_flat_color_vert_glsl, datatoc_gpu_shader_flat_color_frag_glsl,
791+
NULL, NULL, NULL, 0, 0, 0);
792+
retval = GG.shaders.flat_color;
793+
break;
794+
case GPU_SHADER_2D_BOX:
795+
if (!GG.shaders.box2d)
796+
GG.shaders.box2d = GPU_shader_create(
797+
datatoc_gpu_shader_2d_box_vert_glsl, datatoc_gpu_shader_flat_color_frag_glsl,
798+
NULL, NULL, NULL, 0, 0, 0);
799+
retval = GG.shaders.box2d;
800+
break;
763801
}
764802

765803
if (retval == NULL)
@@ -901,6 +939,26 @@ void GPU_shader_free_builtin_shaders(void)
901939
GG.shaders.stereo_anaglyph = NULL;
902940
}
903941

942+
if (GG.shaders.frustum_line) {
943+
GPU_shader_free(GG.shaders.frustum_line);
944+
GG.shaders.frustum_line = NULL;
945+
}
946+
947+
if (GG.shaders.frustum_solid) {
948+
GPU_shader_free(GG.shaders.frustum_solid);
949+
GG.shaders.frustum_solid = NULL;
950+
}
951+
952+
if (GG.shaders.flat_color) {
953+
GPU_shader_free(GG.shaders.flat_color);
954+
GG.shaders.flat_color = NULL;
955+
}
956+
957+
if (GG.shaders.box2d) {
958+
GPU_shader_free(GG.shaders.box2d);
959+
GG.shaders.box2d = NULL;
960+
}
961+
904962
for (i = 0; i < 2 * MAX_FX_SHADERS; ++i) {
905963
if (GG.shaders.fx_shaders[i]) {
906964
GPU_shader_free(GG.shaders.fx_shaders[i]);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
in vec2 pos;
2+
in vec4 trans;
3+
in vec4 color;
4+
5+
flat out vec4 finalColor;
6+
7+
void main()
8+
{
9+
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(pos * trans.zw + trans.xy, 0.0, 1.0);
10+
finalColor = color;
11+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
flat in vec4 finalColor;
2+
3+
void main()
4+
{
5+
gl_FragColor = finalColor;
6+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
in vec3 pos;
2+
in vec4 color;
3+
4+
flat out vec4 finalColor;
5+
6+
void main()
7+
{
8+
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(pos, 1.0);
9+
finalColor = color;
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
in vec3 pos;
2+
in mat4 mat;
3+
in vec4 color;
4+
5+
flat out vec4 finalColor;
6+
7+
void main()
8+
{
9+
gl_Position = gl_ModelViewProjectionMatrix * mat * vec4(pos, 1.0);
10+
finalColor = color;
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
flat in vec4 insideFinalColor;
2+
flat in vec4 outsideFinalColor;
3+
out vec4 fragColor;
4+
5+
void main()
6+
{
7+
gl_FragColor = gl_FrontFacing ? insideFinalColor : outsideFinalColor;
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
in vec3 pos;
2+
in mat4 mat;
3+
in vec4 insideColor;
4+
in vec4 outsideColor;
5+
6+
flat out vec4 insideFinalColor;
7+
flat out vec4 outsideFinalColor;
8+
9+
void main()
10+
{
11+
gl_Position = gl_ModelViewProjectionMatrix * mat * vec4(pos, 1.0);
12+
insideFinalColor = insideColor;
13+
outsideFinalColor = outsideColor;
14+
}

source/gameengine/Ketsji/KX_Globals.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,3 @@ void KX_RasterizerDrawDebugLine(const mt::vec3& from,const mt::vec3& to,const mt
8787
{
8888
g_engine->GetRasterizer()->GetDebugDraw(g_scene).DrawLine(from, to, color);
8989
}
90-
91-
void KX_RasterizerDrawDebugCircle(const mt::vec3& center, const float radius, const mt::vec4& color,
92-
const mt::vec3& normal, int nsector)
93-
{
94-
g_engine->GetRasterizer()->GetDebugDraw(g_scene).DrawCircle(center, radius, color, normal, nsector);
95-
}

0 commit comments

Comments
 (0)