relief map support, small refactoring, shadow bias now based on geometry normal
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -85,6 +85,7 @@ public:
|
||||
dbrMetalRoughReflectFlags,
|
||||
dbrEmission,
|
||||
dbrSpeedBitangXY,
|
||||
dbrGeoNormal,
|
||||
|
||||
dbrNormalZSolid,
|
||||
dbrMetalRoughReflectFlagsSolid,
|
||||
@@ -155,7 +156,7 @@ private:
|
||||
QMap<int, QList<Light *>> cur_lights;
|
||||
QVector<FramebufferEffectBase *> fb_effects;
|
||||
QImage last_img;
|
||||
QString timings;
|
||||
QString obr_defines, timings;
|
||||
bool is_grabbing = false;
|
||||
};
|
||||
|
||||
|
||||
@@ -57,13 +57,15 @@ void RendererBase::initTextureArrays() {
|
||||
QOpenGLExtraFunctions * f = view;
|
||||
textures_maps.init(f);
|
||||
textures_empty.init(f);
|
||||
textures_empty.resize(f, QSize(1, 1), 2);
|
||||
textures_empty.resize(f, QSize(1, 1), emrCount);
|
||||
textures_empty.bind(f, tarEmpty);
|
||||
QImage im(1, 1, QImage::Format_RGBA8888);
|
||||
im.fill(0xFFFFFFFF);
|
||||
textures_empty.load(f, im, emrWhite);
|
||||
im.fill(0xFF8080);
|
||||
textures_empty.load(f, im, emrBlue);
|
||||
im.fill(0x000000);
|
||||
textures_empty.load(f, im, emrBlack);
|
||||
shadow_maps_cone.init(f);
|
||||
shadow_maps_omni.init(f);
|
||||
depth_maps_cone.init(f);
|
||||
@@ -402,7 +404,7 @@ void RendererBase::initCoeffTextures() {
|
||||
}
|
||||
}
|
||||
createCoeffTexture(tex_coeff[0], data.constData(), size, 2);
|
||||
createNoiseTexture(tex_coeff[2]);
|
||||
// createNoiseTexture(tex_coeff[2]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
using namespace QGLEngineShaders;
|
||||
|
||||
|
||||
RendererMaterial::RendererMaterial(Renderer * r_): r(r_), fbo_mat_thumb(r->view, 6, true, GL_RGBA16F) {
|
||||
RendererMaterial::RendererMaterial(Renderer * r_): r(r_), fbo_mat_thumb(r->view, 7, true, GL_RGBA16F) {
|
||||
mat_sphere = Primitive::ellipsoid(16, 16);
|
||||
mat_camera = new Camera();
|
||||
mat_camera->setPos(QVector3D(2, 2, 2));
|
||||
@@ -38,6 +38,7 @@ RendererMaterial::RendererMaterial(Renderer * r_): r(r_), fbo_mat_thumb(r->view,
|
||||
mat_camera->setFOV(45.);
|
||||
mat_light = new Light();
|
||||
mat_light->setPos(QVector3D(50, 100, 25));
|
||||
mat_light->setCastShadows(false);
|
||||
last_thumb_material = 0;
|
||||
}
|
||||
|
||||
@@ -74,6 +75,8 @@ void RendererMaterial::renderMaterial(Material * m) {
|
||||
if (r->bindShader(role, &prog)) {
|
||||
r->setUniformMaps(prog);
|
||||
r->setUniformCamera(prog, mat_camera, true, fbo_mat_thumb.size());
|
||||
prog->setUniformValue("out_index_normal", Renderer::dbrNormalZ);
|
||||
prog->setUniformValue("out_index_metal", Renderer::dbrMetalRoughReflectFlags);
|
||||
// qDebug() << mat_camera->viewMatrix();
|
||||
r->textures_empty.bind(f, tarEmpty);
|
||||
r->textures_maps.bind(f, tarMaps);
|
||||
@@ -83,15 +86,18 @@ void RendererMaterial::renderMaterial(Material * m) {
|
||||
mat_sphere->loadObject(f, o);
|
||||
mat_sphere->draw(f, 1);
|
||||
}
|
||||
fbo_mat_thumb.bindColorTextures();
|
||||
fbo_mat_thumb.bindDepthTexture(5);
|
||||
fbo_mat_thumb.setWriteBuffer(5);
|
||||
fbo_mat_thumb.bindColorTextures({Renderer::dbrDiffuse,
|
||||
Renderer::dbrNormalZ,
|
||||
Renderer::dbrMetalRoughReflectFlags,
|
||||
Renderer::dbrEmission,
|
||||
Renderer::dbrSpeedBitangXY,
|
||||
Renderer::dbrGeoNormal});
|
||||
fbo_mat_thumb.setWriteBuffer(6);
|
||||
if (r->bindShader(Renderer::srLightOmniPass, &prog)) {
|
||||
r->setUniformCamera(prog, mat_camera, true, fbo_mat_thumb.size());
|
||||
r->setUniformViewCorners(prog, mat_camera, fbo_mat_thumb.size());
|
||||
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_d", 5);
|
||||
prog->setUniformValue("lights_start", 0);
|
||||
prog->setUniformValue("lights_count", 1);
|
||||
QMap<int, QList<Light *>> mat_l;
|
||||
@@ -102,7 +108,7 @@ void RendererMaterial::renderMaterial(Material * m) {
|
||||
r->renderQuad(prog, r->quad, mat_camera);
|
||||
r->view->scene()->setLightsChanged();
|
||||
}
|
||||
fbo_mat_thumb.queryImage(5);
|
||||
fbo_mat_thumb.queryImage(6);
|
||||
fbo_mat_thumb.release();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user