/** * Generates a shadow map into the specified framebuffer. * @param rstate RenderState with rendering parameters * @param camera camera with light viewpoint * @param framebufferId ID of framebuffer to render shadow map into * @param scene_objects temporary storage for culling * @see Light::makeShadowMap Renderer::makeShadowMaps */ void GLRenderer::renderShadowMap(RenderState& rstate, Camera* camera, GLuint framebufferId, std::vector<SceneObject*>& scene_objects) { cullFromCamera(rstate.scene, camera, rstate.shader_manager, scene_objects); GLint drawFbo = 0, readFbo = 0; glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &drawFbo); glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &readFbo); const GLenum attachments[] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT}; GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferId)); GL(glInvalidateFramebuffer(GL_FRAMEBUFFER, 3, attachments)); GL(glViewport(rstate.viewportX, rstate.viewportY, rstate.viewportWidth, rstate.viewportHeight)); glClearColor(0,0,0,1); GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); rstate.shadow_map = true; for (auto it = render_data_vector.begin(); it != render_data_vector.end(); ++it) { RenderData* rdata = *it; if (rdata->cast_shadows()) { GL(renderRenderData(rstate, rdata)); } } rstate.shadow_map = false; GL(glInvalidateFramebuffer(GL_FRAMEBUFFER, 2, &attachments[1])); glBindFramebuffer(GL_READ_FRAMEBUFFER, readFbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFbo); }
void Renderer::renderRenderDataVector(RenderState &rstate) { if (!do_batching || gRenderer->isVulkanInstace() ) { for (auto it = render_data_vector.begin(); it != render_data_vector.end(); ++it) { GL(renderRenderData(rstate, *it)); } } else { batch_manager->renderBatches(rstate); } }
/** * Generates a shadow map into the specified framebuffer. * @param rstate RenderState with rendering parameters * @param camera camera with light viewpoint * @param framebufferId ID of framebuffer to render shadow map into * @param scene_objects temporary storage for culling * @see Light::makeShadowMap Renderer::makeShadowMaps */ void Renderer::renderShadowMap(RenderState& rstate, Camera* camera, GLuint framebufferId, std::vector<SceneObject*>& scene_objects) { cullFromCamera(rstate.scene, camera, rstate.shader_manager, scene_objects); GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferId)); GL(glViewport(rstate.viewportX, rstate.viewportY, rstate.viewportWidth, rstate.viewportHeight)); glClearColor(0,0,0,1); GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); for (auto it = render_data_vector.begin(); it != render_data_vector.end(); ++it) { GL(renderRenderData(rstate, *it)); } }
void GLRenderer::renderCamera(Scene* scene, Camera* camera, int framebufferId, int viewportX, int viewportY, int viewportWidth, int viewportHeight, ShaderManager* shader_manager, PostEffectShaderManager* post_effect_shader_manager, RenderTexture* post_effect_render_texture_a, RenderTexture* post_effect_render_texture_b) { resetStats(); RenderState rstate; rstate.shadow_map = false; rstate.material_override = NULL; rstate.viewportX = viewportX; rstate.viewportY = viewportY; rstate.viewportWidth = viewportWidth; rstate.viewportHeight = viewportHeight; rstate.shader_manager = shader_manager; rstate.uniforms.u_view = camera->getViewMatrix(); rstate.uniforms.u_proj = camera->getProjectionMatrix(); rstate.shader_manager = shader_manager; rstate.scene = scene; rstate.render_mask = camera->render_mask(); rstate.uniforms.u_right = rstate.render_mask & RenderData::RenderMaskBit::Right; std::vector<PostEffectData*> post_effects = camera->post_effect_data(); GL(glEnable (GL_DEPTH_TEST)); GL(glDepthFunc (GL_LEQUAL)); GL(glEnable (GL_CULL_FACE)); GL(glFrontFace (GL_CCW)); GL(glCullFace (GL_BACK)); GL(glEnable (GL_BLEND)); GL(glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE)); GL(glBlendEquation (GL_FUNC_ADD)); GL(glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); GL(glDisable (GL_POLYGON_OFFSET_FILL)); GL(glLineWidth(1.0f)); if (post_effects.size() == 0) { GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferId)); GL(glViewport(viewportX, viewportY, viewportWidth, viewportHeight)); GL(glClearColor(camera->background_color_r(), camera->background_color_g(), camera->background_color_b(), camera->background_color_a())); GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); renderRenderDataVector(rstate); } else { RenderTexture* texture_render_texture = post_effect_render_texture_a; RenderTexture* target_render_texture; GL(glBindFramebuffer(GL_FRAMEBUFFER, texture_render_texture->getFrameBufferId())); GL(glViewport(0, 0, texture_render_texture->width(), texture_render_texture->height())); GL(glClearColor(camera->background_color_r(), camera->background_color_g(), camera->background_color_b(), camera->background_color_a())); GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); for (auto it = render_data_vector.begin(); it != render_data_vector.end(); ++it) { GL(renderRenderData(rstate, *it)); } GL(glDisable(GL_DEPTH_TEST)); GL(glDisable(GL_CULL_FACE)); for (int i = 0; i < post_effects.size() - 1; ++i) { if (i % 2 == 0) { texture_render_texture = post_effect_render_texture_a; target_render_texture = post_effect_render_texture_b; } else { texture_render_texture = post_effect_render_texture_b; target_render_texture = post_effect_render_texture_a; } GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferId)); GL(glViewport(viewportX, viewportY, viewportWidth, viewportHeight)); GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); GL(renderPostEffectData(camera, texture_render_texture, post_effects[i], post_effect_shader_manager)); } GL(glBindFramebuffer(GL_FRAMEBUFFER, framebufferId)); GL(glViewport(viewportX, viewportY, viewportWidth, viewportHeight)); GL(glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)); renderPostEffectData(camera, texture_render_texture, post_effects.back(), post_effect_shader_manager); } GL(glDisable(GL_DEPTH_TEST)); GL(glDisable(GL_CULL_FACE)); GL(glDisable(GL_BLEND)); }