git-svn-id: svn://db.shs.com.ru/libs@656 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -29,9 +29,13 @@ 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_, 3, false, GL_RGBA16F),
|
||||
fbo_hsmall (view_, 1, false, GL_RGB16F ),
|
||||
fbo_out (view_, 6, false, GL_RGBA16F),
|
||||
fbo_small_4 (view_, 1, false, GL_RGBA16F),
|
||||
fbo_small_16 (view_, 1, false, GL_RGBA16F),
|
||||
fbo_1x1 (view_, 1, false, GL_RGB32F ),
|
||||
buffer_vbo(GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW),
|
||||
rend_mat(this), rend_service(this), rend_selection(this) {
|
||||
shader_sum = 0;
|
||||
quad = Primitive::plane(2., 2.);
|
||||
cam_light = new Light();
|
||||
cam_light->intensity = 0.75;
|
||||
@@ -50,6 +54,7 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
|
||||
shader_files[srLightOmniPass] = "ds_light.glsl";
|
||||
shader_files[srLightSpotPass] = "ds_light.glsl"; shader_defines[srLightSpotPass] << "SPOT";
|
||||
shader_files[srFinalPass ] = "ds_final.glsl";
|
||||
shader_files[srTonemapPass ] = "ds_tonemap.glsl";
|
||||
|
||||
/*shaders << ShaderPair("FXAA", &shader_fxaa)
|
||||
<< ShaderPair("dsl_pass_0", &shader_ds_0)
|
||||
@@ -76,10 +81,13 @@ 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);
|
||||
@@ -96,16 +104,20 @@ void Renderer::resize(int width, int height) {
|
||||
rend_selection.resize(width, height);
|
||||
fbo_ds .resize(width, height);
|
||||
fbo_out .resize(width, height);
|
||||
fbo_hsmall .resize(width / 16, height / 16);
|
||||
fbo_small_4 .resize(width / 4 , height / 4 );
|
||||
fbo_small_16 .resize(width / 16, height / 16);
|
||||
resizeSum();
|
||||
}
|
||||
|
||||
|
||||
void Renderer::reloadShaders() {
|
||||
QMapIterator<ShaderRole, QString> it(shader_files);
|
||||
QString dir = "shaders/";
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
loadShadersMulti(shaders[it.key()], "shaders/" + it.value(), shader_defines.value(it.key()));
|
||||
loadShadersMulti(shaders[it.key()], dir + it.value(), true, shader_defines.value(it.key()));
|
||||
}
|
||||
loadShadersMulti(shader_sum, dir + "sum.glsl", false);
|
||||
need_init_shaders = true;
|
||||
view->scene()->setLightsChanged();
|
||||
view->scene()->setTreeStructChanged();
|
||||
@@ -144,6 +156,10 @@ void Renderer::initShaders() {
|
||||
for (int i = 0; i < 5; ++i)
|
||||
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
|
||||
}
|
||||
if (bindShader(srTonemapPass, &prog)) {
|
||||
prog->setUniformValue("tex_0", 0);
|
||||
prog->setUniformValue("tex_sum", 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -197,6 +213,62 @@ 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 = fbo_small_16.width() * fbo_small_16.height();
|
||||
QVector<Vector2i> _data;
|
||||
_data.resize(pcnt);
|
||||
pcnt = -1;
|
||||
for (int x = 0; x < fbo_small_16.width(); ++x)
|
||||
for (int y = 0; y < fbo_small_16.height(); ++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;
|
||||
@@ -255,7 +327,7 @@ void Renderer::renderScene() {
|
||||
fbo_ds.bindColorTextures();
|
||||
fbo_ds.bindDepthTexture(5);
|
||||
fbo_out.bind();
|
||||
int ri = 1, wi = 0;
|
||||
//int ri = 1, wi = 0;
|
||||
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
|
||||
QVector<PassPair> passes;
|
||||
passes << PassPair(srLightOmniPass, Light::Omni) << PassPair(srLightSpotPass, Light::Cone);
|
||||
@@ -265,26 +337,38 @@ void Renderer::renderScene() {
|
||||
setUniformViewCorners(prog, cam);
|
||||
prog->setUniformValue("lights_start", lights_start[pass.second]);
|
||||
prog->setUniformValue("lights_count", ll[pass.second].size());
|
||||
fbo_out.setWriteBuffer(1 + pass.second);
|
||||
fbo_out.setWriteBuffer(obrSolidOmni + pass.second);
|
||||
glClearFramebuffer(Qt::black, false);
|
||||
renderQuad(prog, quad, cam);
|
||||
}
|
||||
}
|
||||
if (bindShader(srFinalPass, &prog)) {
|
||||
fbo_out.bindColorTexture(1, 0);
|
||||
fbo_out.bindColorTexture(2, 1);
|
||||
fbo_out.setWriteBuffer(0);
|
||||
fbo_out.bindColorTexture(obrSolidOmni, 0);
|
||||
fbo_out.bindColorTexture(obrSolidSpot, 1);
|
||||
fbo_out.setWriteBuffer(obrSum);
|
||||
renderQuad(prog, quad);
|
||||
}
|
||||
fbo_out.blit(obrSum, fbo_small_4.id(), 0, fbo_out.rect(), fbo_small_4.rect(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
fbo_small_4.blit(0, fbo_small_16.id(), 0, fbo_small_4.rect(), fbo_small_16.rect(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
renderSum(fbo_small_16, 0);
|
||||
fbo_out.bind();
|
||||
if (bindShader(srTonemapPass, &prog)) {
|
||||
fbo_1x1.bindColorTexture(0, 1);
|
||||
fbo_out.bindColorTexture(obrSum, 0);
|
||||
fbo_out.setWriteBuffer(obrTonemap);
|
||||
renderQuad(prog, quad);
|
||||
} else
|
||||
fbo_out.blit(obrSum, fbo_out.id(), obrTonemap, fbo_out.rect(), fbo_out.rect());
|
||||
fbo_out.release();
|
||||
|
||||
/// apply hovers and selection frame
|
||||
if (edit_mode) {
|
||||
rend_selection.drawSelection(fbo_out, 0);
|
||||
rend_selection.drawSelection(fbo_out, obrTonemap);
|
||||
rend_service.renderService();
|
||||
} else {
|
||||
fbo_out.blit(0, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
|
||||
fbo_out.blit(obrTonemap, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
|
||||
}
|
||||
//fbo_small_16.blit(0, 0, 0, fbo_small_16.rect(), fbo_small_16.rect(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user