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

View File

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