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

This commit is contained in:
2019-12-06 22:26:37 +00:00
parent 816c87d101
commit 1c73e79c65
11 changed files with 295 additions and 104 deletions

View File

@@ -30,11 +30,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_1x1 (view_, 1, false, GL_RGB32F ),
fbomm(fbo_out, obrSum, 3),
buffer_vbo(GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW),
rend_mat(this), rend_service(this), rend_selection(this) {
shader_sum = 0;
rend_mat(this), rend_service(this), rend_selection(this), tone_proc(this) {
quad = Primitive::plane(2., 2.);
cam_light = new Light();
cam_light->intensity = 0.75;
@@ -80,17 +76,15 @@ Renderer::~Renderer() {
delete quad;
delete cam_light;
qDeleteAll(shaders.values());
if (shader_sum) delete shader_sum;
}
void Renderer::init(int width, int height) {
prepareSum();
fbo_1x1.resize(1, 1);
resize(width, height);
rend_mat.init(width, height);
rend_service.init(width, height);
rend_selection.init(width, height);
tone_proc.init();
initQuad(quad);
initTextureArrays();
need_init_shaders = true;
@@ -103,8 +97,7 @@ void Renderer::resize(int width, int height) {
rend_selection.resize(width, height);
fbo_ds .resize(width, height);
fbo_out .resize(width, height);
fbomm.resize();
resizeSum();
tone_proc.resize();
}
@@ -115,7 +108,7 @@ void Renderer::reloadShaders() {
it.next();
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()));
}
loadShadersMulti(shader_sum, dir + "sum.glsl", false);
loadShadersMulti(tone_proc.shader_sum, dir + "sum.glsl", false);
need_init_shaders = true;
view->scene()->setLightsChanged();
view->scene()->setTreeStructChanged();
@@ -211,62 +204,6 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
}
void Renderer::prepareSum() {
QOpenGLExtraFunctions * f = view;
buffer_vbo.init(f);
f->glGenVertexArrays(1, &vbo_vao);
f->glBindVertexArray(vbo_vao);
buffer_vbo.bind(f);
f->glEnableVertexAttribArray(1);
f->glVertexAttribIPointer(1, 2, GL_UNSIGNED_INT, 0, 0);
buffer_vbo.release(f);
f->glBindVertexArray(0);
}
void Renderer::resizeSum() {
QOpenGLExtraFunctions * f = view;
int pcnt = fbomm.width(fbomm.lastLevel()) * fbomm.height(fbomm.lastLevel());
QVector<Vector2i> _data;
_data.resize(pcnt);
pcnt = -1;
for (int x = 0; x < fbomm.width(fbomm.lastLevel()); ++x)
for (int y = 0; y < fbomm.height(fbomm.lastLevel()); ++y)
_data[++pcnt] = Vector2i(x,y);
buffer_vbo.bind(f);
buffer_vbo.resize(f, _data.size() * sizeof(Vector2i));
buffer_vbo.load(f, _data.constData(), _data.size() * sizeof(Vector2i));
}
void Renderer::renderSum(Framebuffer & fbo_src, int index) {
QOpenGLExtraFunctions * f = view;
int pcnt = fbo_src.width() * fbo_src.height();
fbo_src.bindColorTexture(index);
fbo_1x1.bind();
//glClearFramebuffer(Qt::white, false);
glClearFramebuffer();
if (shader_sum) {
if (shader_sum->isLinked()) {
if (shader_sum->bind()) {
shader_sum->setUniformValue("tex", 0);
shader_sum->setUniformValue("pcnt", float(pcnt));
f->glBindVertexArray(vbo_vao);
f->glEnable(GL_BLEND);
f->glBlendFunc(GL_ONE, GL_ONE);
f->glBlendEquation(GL_MAX);
f->glDrawArrays(GL_POINTS, 0, pcnt);
f->glBlendEquation(GL_FUNC_ADD);
f->glDisable(GL_BLEND);
f->glBindVertexArray(0);
}
}
}
fbo_1x1.release();
//fbo_src.bind();
}
void Renderer::renderScene() {
initShaders();
QOpenGLExtraFunctions * f = view;
@@ -346,12 +283,12 @@ void Renderer::renderScene() {
fbo_out.setWriteBuffer(obrSum);
renderQuad(prog, quad);
}
fbomm.create();
renderSum(fbomm.plane(fbomm.lastLevel()), 0);
fbo_out.bind();
if (tone_proc.process())
fbo_out.bind();
if (bindShader(srTonemapPass, &prog)) {
prog->setUniformValue("exposure", exposure_);
fbo_1x1.bindColorTexture(0, 1);
prog->setUniformValue("frame_max", tone_proc.frameMax());
//fbo_1x1.bindColorTexture(0, 1);
fbo_out.bindColorTexture(obrSum, 0);
fbo_out.setWriteBuffer(obrTonemap);
renderQuad(prog, quad);