relief map support, small refactoring, shadow bias now based on geometry normal

This commit is contained in:
2023-03-02 11:46:52 +03:00
parent adf8c4d7f0
commit 64eee9e607
26 changed files with 465 additions and 174 deletions

View File

@@ -19,12 +19,16 @@
#define GL_GLEXT_PROTOTYPES
#include "renderer.h"
#include "ccm_qglengine_core.h"
#include "glmesh.h"
#include "glshaders.h"
#include "gltexture_manager.h"
#include "qglview.h"
#include <QOpenGLExtraFunctions>
#include <picodeinfo.h>
#include <piiostream.h>
#include <piqt.h>
#include <qad_types.h>
@@ -33,7 +37,9 @@ using namespace QGLEngineShaders;
Renderer::Renderer(QGLView * view_)
: RendererBase(view_)
, fbo_ds(view_, QVector<GLenum>() << GL_RGBA16F << GL_RGBA32F << GL_RGBA16F << GL_RGBA16F << GL_RGBA16F << GL_RGBA32F << GL_RGBA16F)
, fbo_ds(view_,
QVector<GLenum>() << GL_RGBA16F << GL_RGBA32F << GL_RGBA16F << GL_RGBA16F << GL_RGBA16F << GL_RGBA16F << GL_RGBA32F
<< GL_RGBA16F)
, fbo_out(view_, obrBuffersCount, false, GL_RGBA16F)
, rend_mat(this)
, rend_service(this)
@@ -94,6 +100,13 @@ Renderer::Renderer(QGLView * view_)
shader_defines[srLightSpotPass] << "SPOT";
shader_defines[srShadowOmniPass] << "OMNI";
PICodeInfo::EnumInfo * obre = PICodeInfo::enumsInfo->value("Renderer::DeferredBufferRole");
if (obre) {
for (auto e: obre->members) {
obr_defines += "#define " + PI2QString(e.name) + " " + QString::number(e.value) + "\n";
}
}
edit_mode = need_init_shaders = true;
camera_light_mode = QGLView::clmAuto;
}
@@ -157,7 +170,7 @@ void Renderer::reloadShaders() {
QString dir = ":/shaders/";
while (it.hasNext()) {
it.next();
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()));
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()), obr_defines);
}
loadShadersMulti(tone_proc.shader_sum, dir + "sum.glsl", false);
QStringList fxaa_defs;
@@ -203,11 +216,10 @@ void Renderer::initShaders() {
initUniformBuffer(prog, &buffer_materials, bpMaterials, "QGLMaterialData");
initUniformBuffer(prog, &buffer_lights, bpLightParameters, "QGLLightParameterData");
initUniformBuffer(prog, &buffer_lights_pos, bpLightPositions, "QGLLightPositionData");
for (int i = 0; i < 5; ++i)
for (int i = 0; i <= 5; ++i)
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
prog->setUniformValue("tex_coeffs[0]", (int)Renderer::dbrBuffersCount);
prog->setUniformValue("tex_env", (int)Renderer::dbrBuffersCount + 1);
prog->setUniformValue("tex_noise", (int)Renderer::dbrBuffersCount + 2);
prog->setUniformValue("tex_coeff_brdf", trCoeffBRDF);
prog->setUniformValue("tex_env", trEnvironment);
setUniformMaps(prog);
}
if (bindShader(srFinalPass, &prog)) {
@@ -311,12 +323,8 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
void Renderer::renderLight(int first_wr_buff, bool clear_only) {
QOpenGLShaderProgram * prog = 0;
Camera * cam = view->camera();
for (int i = 0; i < 3; ++i) {
view->glActiveTexture(GL_TEXTURE0 + Renderer::dbrBuffersCount + i);
view->glBindTexture(GL_TEXTURE_2D, tex_coeff[i]);
}
fbo_ds.bindColorTextures();
fbo_out.bind();
view->glActiveTexture(GL_TEXTURE0 + trCoeffBRDF);
view->glBindTexture(GL_TEXTURE_2D, tex_coeff[0]);
// tex_env.bind((int)Renderer::dbrBuffersCount + 1);
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
QVector<PassPair> passes;
@@ -558,17 +566,21 @@ void Renderer::renderScene() {
setUniformCamera(prog, cam);
textures_empty.bind(f, tarEmpty);
textures_maps.bind(f, tarMaps);
prog->setUniformValue("out_index_normal", dbrNormalZSolid);
prog->setUniformValue("out_index_metal", dbrMetalRoughReflectFlagsSolid);
glPolygonMode(GL_FRONT_AND_BACK, view->renderMode());
renderObjects(scene, rpSolid);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
fbo_ds.blit(dbrNormalZ, fbo_ds.id(), dbrNormalZSolid, fbo_ds.rect(), fbo_ds.rect());
fbo_ds.blit(dbrMetalRoughReflectFlags, fbo_ds.id(), dbrMetalRoughReflectFlagsSolid, fbo_ds.rect(), fbo_ds.rect());
// fbo_ds.blit(dbrNormalZ, fbo_ds.id(), dbrNormalZSolid, fbo_ds.rect(), fbo_ds.rect());
// fbo_ds.blit(dbrMetalRoughReflectFlags, fbo_ds.id(), dbrMetalRoughReflectFlagsSolid, fbo_ds.rect(), fbo_ds.rect());
fbo_ds.release();
phase.end();
/// lighting passes
phase.begin("... light");
fbo_out.bind();
fbo_ds.bindColorTextures({dbrDiffuse, dbrNormalZSolid, dbrMetalRoughReflectFlagsSolid, dbrEmission, dbrSpeedBitangXY, dbrGeoNormal});
renderLight(obrSolidOmni, scene.geometries_used[rpSolid].isEmpty());
phase.end();
@@ -583,6 +595,8 @@ void Renderer::renderScene() {
setUniformCamera(prog, cam);
textures_empty.bind(f, tarEmpty);
textures_maps.bind(f, tarMaps);
prog->setUniformValue("out_index_normal", dbrNormalZ);
prog->setUniformValue("out_index_metal", dbrMetalRoughReflectFlags);
glPolygonMode(GL_FRONT_AND_BACK, view->renderMode());
renderObjects(scene, rpTransparent);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -592,6 +606,8 @@ void Renderer::renderScene() {
/// lighting passes
phase.begin("... light");
fbo_out.bind();
fbo_ds.bindColorTextures({dbrDiffuse, dbrNormalZ, dbrMetalRoughReflectFlags, dbrEmission, dbrSpeedBitangXY, dbrGeoNormal});
renderLight(obrTransparentOmni, scene.geometries_used[rpTransparent].isEmpty());
phase.end();