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

This commit is contained in:
2019-12-10 12:20:58 +00:00
parent 94c6536477
commit 046bcf2bef
2 changed files with 56 additions and 26 deletions

View File

@@ -29,7 +29,7 @@ using namespace QGLEngineShaders;
Renderer::Renderer(QGLView * view_): RendererBase(view_),
fbo_ds (view_, QVector<GLenum>() << GL_RGBA16F << GL_RGBA32F << GL_RGBA16F << GL_RGBA16F << GL_RGBA16F),
fbo_out (view_, 6, false, GL_RGBA16F),
fbo_out (view_, obrBuffersCount, false, GL_RGBA16F),
rend_mat(this), rend_service(this), rend_selection(this), tone_proc(this) {
quad = Primitive::plane(2., 2.);
cam_light = new Light();
@@ -157,8 +157,10 @@ void Renderer::initShaders() {
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
}
if (bindShader(srFinalPass, &prog)) {
for (int i = 0; i < 5; ++i)
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
prog->setUniformValue("tex_s_0", 0);
prog->setUniformValue("tex_s_1", 1);
prog->setUniformValue("tex_t_0", 2);
prog->setUniformValue("tex_t_1", 3);
}
if (bindShader(srGeometryPass, &prog)) {
setUniformMaps(prog);
@@ -223,6 +225,29 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
}
void Renderer::renderLight(int first_wr_buff) {
QOpenGLShaderProgram * prog = 0;
Camera * cam = view->camera();
fbo_ds.bindColorTextures();
fbo_out.bind();
//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);
prog->setUniformValue("lights_start", lights_start[pass.second]);
prog->setUniformValue("lights_count", cur_lights[pass.second].size());
fbo_out.setWriteBuffer(first_wr_buff + pass.second);
glClearFramebuffer(Qt::black, false);
renderQuad(prog, quad, cam);
}
}
}
void Renderer::renderScene() {
initShaders();
QOpenGLExtraFunctions * f = view;
@@ -248,14 +273,14 @@ void Renderer::renderScene() {
}
/// lights
QMap<int, QList<Light*>> ll = scene.lights_used;
cur_lights = scene.lights_used;
if (is_camera_light) {
ll[Light::Omni] << cam_light;
cur_lights[Light::Omni] << cam_light;
cam_light->setPos(cam->pos());
}
if (scene.lights_changed) {
scene.lights_changed = false;
reloadLightsParameters(ll);
reloadLightsParameters(cur_lights);
}
reloadLightsPositions(cam);
@@ -264,7 +289,7 @@ void Renderer::renderScene() {
rend_selection.renderSelection(scene);
}
/// geometry pass
/// solid geometry pass
fbo_ds.bind();
glEnableDepth();
glClearFramebuffer();
@@ -273,36 +298,35 @@ void Renderer::renderScene() {
textures_empty.bind(f, tarEmpty);
textures_maps .bind(f, tarMaps );
renderObjects(scene, rpSolid);
}
fbo_ds.release();
/// lighting passes
renderLight(obrSolidOmni);
/// transparent geometry pass
fbo_ds.bind();
glEnableDepth();
glClearFramebuffer(Qt::black, false);
if (bindShader(srGeometryPass, &prog)) {
renderObjects(scene, rpTransparent);
}
fbo_ds.release();
/// lighting passes
fbo_ds.bindColorTextures();
fbo_out.bind();
//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);
prog->setUniformValue("lights_start", lights_start[pass.second]);
prog->setUniformValue("lights_count", ll[pass.second].size());
fbo_out.setWriteBuffer(obrSolidOmni + pass.second);
glClearFramebuffer(Qt::black, false);
renderQuad(prog, quad, cam);
}
}
renderLight(obrTransparentOmni);
/// blending layers
if (bindShader(srFinalPass, &prog)) {
fbo_out.bindColorTexture(obrSolidOmni, 0);
fbo_out.bindColorTexture(obrSolidSpot, 1);
fbo_out.bindColorTexture(obrSolidOmni , 0);
fbo_out.bindColorTexture(obrSolidSpot , 1);
fbo_out.bindColorTexture(obrTransparentOmni, 2);
fbo_out.bindColorTexture(obrTransparentSpot, 3);
fbo_out.setWriteBuffer(obrSum);
renderQuad(prog, quad);
}
/// tonemapping
if (tone_proc.process())
fbo_out.bind();
if (bindShader(srTonemapPass, &prog)) {

View File

@@ -65,6 +65,10 @@ class Renderer: public RendererBase {
obrSum,
obrSolidOmni,
obrSolidSpot,
obrTransparentOmni,
obrTransparentSpot,
obrBuffersCount,
};
public:
@@ -85,6 +89,7 @@ protected:
void fillObjectsBuffer(const ObjectBaseList & ol, RenderPass pass);
void reloadObjects();
void renderObjects(Scene & scene, RenderPass pass);
void renderLight(int first_wr_buff);
bool bindShader(ShaderRole role, QOpenGLShaderProgram ** ret = 0);
bool bindShader(QOpenGLShaderProgram * sp);
@@ -118,6 +123,7 @@ private:
QMatrix3x3 nm;
QVector4D corner_dirs[4];
QVector<QVector3D> hcontent;
QMap<int, QList<Light*>> cur_lights;
};