1- // Copyright 2017-2024 the openage authors. See copying.md for legal info.
1+ // Copyright 2017-2025 the openage authors. See copying.md for legal info.
22
33#include " renderer.h"
44
1515#include " renderer/opengl/texture.h"
1616#include " renderer/opengl/uniform_buffer.h"
1717#include " renderer/opengl/uniform_input.h"
18+ #include " renderer/opengl/vertex_array.h"
1819#include " renderer/opengl/window.h"
1920#include " renderer/resources/buffer_info.h"
2021
@@ -26,7 +27,8 @@ GlRenderer::GlRenderer(const std::shared_ptr<GlContext> &ctx,
2627 gl_context{ctx},
2728 display{std::make_shared<GlRenderTarget>(ctx,
2829 viewport_size[0 ],
29- viewport_size[1 ])} {
30+ viewport_size[1 ])},
31+ shared_quad_vao{std::make_shared<GlVertexArray>(ctx)} {
3032 // color used to clear the color buffers
3133 glClearColor (0 .0f , 0 .0f , 0 .0f , 0 .0f );
3234
@@ -100,7 +102,7 @@ std::shared_ptr<UniformBuffer> GlRenderer::add_uniform_buffer(resources::Uniform
100102 resources::UniformBufferInfo::get_size (input, info.get_layout ()),
101103 resources::UniformBufferInfo::get_stride_size (input.type , info.get_layout ()),
102104 input.count ,
103- input.name });
105+ input.name });
104106
105107 offset += size;
106108 }
@@ -169,6 +171,11 @@ void GlRenderer::render(const std::shared_ptr<RenderPass> &pass) {
169171 auto gl_target = std::dynamic_pointer_cast<GlRenderTarget>(pass->get_target ());
170172 gl_target->bind_write ();
171173
174+ // ensure that an (empty) VAO is bound before rendering geometry
175+ // a bound VAO is required to render bufferless quad geometries by OpenGL
176+ // see https://www.khronos.org/opengl/wiki/Vertex_Rendering#Causes_of_rendering_failure
177+ shared_quad_vao->bind ();
178+
172179 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
173180
174181 // TODO: Option for face culling
0 commit comments