git-svn-id: svn://db.shs.com.ru/libs@636 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-11-27 21:49:24 +00:00
parent 988c4e1150
commit 09298fadcd
22 changed files with 291 additions and 173 deletions

View File

@@ -45,9 +45,10 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
shader_files[srServiceFill ] = "service_fill.glsl";
shader_files[srServiceFrame] = "service_frame.glsl";
shader_files[srGeometryPass] = "ds_geom.glsl";
shader_files[srLightingPass] = "ds_light.glsl";
shader_files[srFinalPass ] = "ds_final.glsl";
shader_files[srGeometryPass ] = "ds_geom.glsl";
shader_files[srLightOmniPass] = "ds_light.glsl"; shader_defines[srLightOmniPass] << "FIRST_PASS";
shader_files[srLightSpotPass] = "ds_light.glsl"; shader_defines[srLightSpotPass] << "SPOT";
shader_files[srFinalPass ] = "ds_final.glsl";
/*shaders << ShaderPair("FXAA", &shader_fxaa)
<< ShaderPair("dsl_pass_0", &shader_ds_0)
@@ -102,9 +103,12 @@ void Renderer::reloadShaders() {
QMapIterator<ShaderRole, QString> it(shader_files);
while (it.hasNext()) {
it.next();
loadShadersMulti(shaders[it.key()], "shaders/" + it.value());
loadShadersMulti(shaders[it.key()], "shaders/" + it.value(), shader_defines.value(it.key()));
}
need_init_shaders = true;
view->scene()->setLightsChanged();
view->scene()->setTreeStructChanged();
view->scene()->setMaterialsChanged();
}
@@ -122,9 +126,12 @@ void Renderer::initShaders() {
if (!need_init_shaders) return;
need_init_shaders = false;
initUniformBuffer(shaders.value(srGeometryPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
initUniformBuffer(shaders.value(srLightingPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
initUniformBuffer(shaders.value(srLightingPass), &buffer_lights , bpLightParameters, "QGLLightParameterData");
initUniformBuffer(shaders.value(srLightingPass), &buffer_lights_pos, bpLightPositions , "QGLLightPositionData" );
initUniformBuffer(shaders.value(srLightOmniPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
initUniformBuffer(shaders.value(srLightOmniPass), &buffer_lights , bpLightParameters, "QGLLightParameterData");
initUniformBuffer(shaders.value(srLightOmniPass), &buffer_lights_pos, bpLightPositions , "QGLLightPositionData" );
initUniformBuffer(shaders.value(srLightSpotPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
initUniformBuffer(shaders.value(srLightSpotPass), &buffer_lights , bpLightParameters, "QGLLightParameterData");
initUniformBuffer(shaders.value(srLightSpotPass), &buffer_lights_pos, bpLightPositions , "QGLLightPositionData" );
}
@@ -167,7 +174,7 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
}
if (mesh->selected_changed && edit_mode) {
mesh->selected_changed = false;
rend_selection.fillSelectionsBuffer(it.value());
fillSelectionsBuffer(rend_selection.cur_selections_, it.value());
mesh->loadSelections(f, rend_selection.cur_selections_);
}
mesh->draw(f, it.value().size());
@@ -200,16 +207,16 @@ void Renderer::renderScene() {
}
/// lights
QList<Light*> ll = scene.lights_used;
QMap<int, QList<Light*>> ll = scene.lights_used;
if (is_camera_light) {
ll << cam_light;
ll[Light::Omni] << cam_light;
cam_light->setPos(cam->pos());
}
if (scene.lights_changed) {
scene.lights_changed = false;
reloadLightsParameters(ll);
}
reloadLightsPositions(ll, cam);
reloadLightsPositions(cam);
/// selection
if (edit_mode) {
@@ -233,31 +240,35 @@ void Renderer::renderScene() {
fbo_ds.bindColorTextures();
fbo_ds.bindDepthTexture(5);
fbo_out.bind();
if (bindShader(srLightingPass, &prog)) {
setUniformCamera(prog, cam);
setUniformViewCorners(prog, cam);
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_count", ll.size());
glClearFramebuffer(view->backColor(), false);
renderQuad(prog, quad, cam);
/*QVector<float> _fb = fbo_out.grabF(0);
if (!_fb.isEmpty()) {
double sum = 0.;
foreach (float f, _fb) sum += f;
sum /= _fb.size();
qDebug() << "sum =" << sum;
}*/
int ri = 1, wi = 0;
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
QVector<PassPair> passes;
passes << PassPair(srLightOmniPass, Light::Omni) << PassPair(srLightSpotPass, Light::Cone);
foreach (PassPair pass, passes) {
if (bindShader(pass.first, &prog)) {
setUniformCamera(prog, cam);
setUniformViewCorners(prog, cam);
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", lights_start[pass.second]);
prog->setUniformValue("lights_count", ll[pass.second].size());
prog->setUniformValue("tex_sum", 7);
fbo_out.setWriteBuffer(wi);
fbo_out.bindColorTexture(ri, 7);
glClearFramebuffer(Qt::black, false);
renderQuad(prog, quad, cam);
piSwap(ri, wi);
}
}
fbo_out.release();
/// apply hovers and selection frame
if (edit_mode) {
rend_selection.drawSelection(fbo_out);
rend_selection.drawSelection(fbo_out, ri);
rend_service.renderService();
} else {
fbo_out.blit(0, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
fbo_out.blit(ri, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
}
}