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

This commit is contained in:
2019-12-10 11:48:25 +00:00
parent 9d05dbe6da
commit 94c6536477
11 changed files with 71 additions and 56 deletions

View File

@@ -217,14 +217,10 @@ void Framebuffer::blit(int index_from, GLuint fb_to, int index_to, QRect from, Q
void Framebuffer::bind() {
if (is_changed) resize(wid, hei);
if (fbo == 0) return;
//glFlush();
f->glGetIntegerv(GL_VIEWPORT, prev_view);
//glClearError();
f->glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//qDebug() << QString::number(glGetError(), 16);
setWriteBuffers();
f->glReadBuffer(GL_COLOR_ATTACHMENT0);
//f->glDrawBuffer(GL_COLOR_ATTACHMENT0);
f->glViewport(0, 0, wid, hei);
}
@@ -232,7 +228,6 @@ void Framebuffer::bind() {
void Framebuffer::release() {
is_changed = false;
if (fbo == 0) return;
//glFlush();
f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
f->glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]);
}
@@ -245,7 +240,7 @@ void Framebuffer::setWriteBuffer(int index) {
}
void Framebuffer::setWriteBuffers(int * indeces, int count) {
void Framebuffer::setWriteBuffers(const int * indeces, int count) {
unsetWriteBuffers();
QVector<GLenum> buffers;
for (int i = 0; i < count; ++i)

View File

@@ -57,7 +57,8 @@ public:
void release();
void setReadBuffer(int index) {glReadBuffer(GL_COLOR_ATTACHMENT0 + index);}
void setWriteBuffer(int index);
void setWriteBuffers(int * indeces, int count);
void setWriteBuffers(const int * indeces, int count);
void setWriteBuffers(const QVector<int> & indeces) {setWriteBuffers(indeces.constData(), indeces.size());}
void setWriteBuffers();
void unsetWriteBuffers();
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}

View File

@@ -29,7 +29,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
content.clear();
return true;
}
//qDebug() << "[QGLView] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ...";
//qDebug() << "[QGLEngine] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ...";
if (add_qgl) {
switch (type) {
case QOpenGLShader::Fragment:
@@ -48,7 +48,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr
content.prepend(defs);
content.prepend(qgl_common_head);
bool ret = prog->addShaderFromSourceCode(type, content.toLatin1());
if (!ret) qDebug() << "[QGLView] Shader" << file << "Compile error:\n" << prog->log();
if (!ret) qDebug() << "[QGLEngine] Shader" << file << "Compile error:\n" << prog->log();
content.clear();
return ret;
}
@@ -69,7 +69,7 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
prog->removeAllShaders();
QFile f(file);
if (!f.open(QIODevice::ReadOnly)) {
qDebug() << "[QGLView] Shader" << file << "Error: can`t open file!";
qDebug() << "[QGLEngine] Shader" << file << "Error: can`t open file!";
return false;
}
QTextStream ts(&f);
@@ -109,10 +109,10 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
}
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
if (!prog->link()) {
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log();
qDebug() << "[QGLEngine] Shader" << file << "Link error:\n" << prog->log();
return false;
}
qDebug() << "[QGLView] Shader" << file << "ok";
qDebug() << "[QGLEngine] Shader" << file << "ok";
return true;
}
@@ -131,16 +131,16 @@ bool QGLEngineShaders::loadShaders(QOpenGLShaderProgram *& prog, const QStringLi
if (type == 0) continue;
QFile file(f);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "[QGLView] Shader" << f << "Error: can`t open file!";
qDebug() << "[QGLEngine] Shader" << f << "Error: can`t open file!";
return false;
}
cur_shader = file.readAll();
if (!addShader(prog, type, cur_shader, f, add_qgl, defs)) return false;
}
if (!prog->link()) {
qDebug() << "[QGLView] Shader" << files << "Link error:\n" << prog->log();
qDebug() << "[QGLEngine] Shader" << files << "Link error:\n" << prog->log();
return false;
}
qDebug() << "[QGLView] Shader" << files << "ok";
qDebug() << "[QGLEngine] Shader" << files << "ok";
return true;
}

View File

@@ -49,7 +49,8 @@ class QGLView: public OpenGLWindow
Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth)
Q_PROPERTY (float FOV READ FOV WRITE setFOV)
Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart)
Q_PROPERTY (float exposure READ exposure WRITE setExposure)
Q_PROPERTY (float gamma READ gamma WRITE setGamma)
Q_PROPERTY (bool autoExposure READ autoExposure WRITE setAutoExposure)
Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor)
Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor)
Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled)
@@ -111,7 +112,8 @@ public:
float FOV() const {return camera()->fov_;}
float depthStart() const {return camera()->depth_start;}
float currentFPS() const {return fps_;}
float exposure() const {return renderer_.exposure_;}
float gamma() const {return renderer_.gamma_;}
bool autoExposure() const {return renderer_.tone_proc.enabled;}
int maxAnisotropicLevel() const {return max_anisotropic;}
QColor ambientColor() const {return ambientColor_;}
@@ -231,7 +233,8 @@ public slots:
void setLineWidth(const float & arg) {lineWidth_ = arg;}
void setFOV(const float & arg) {camera()->fov_ = arg;}
void setDepthStart(const float & arg) {camera()->depth_start = arg;}
void setExposure(const float & arg) {renderer_.exposure_ = arg;}
void setGamma(const float & arg) {renderer_.gamma_ = arg;}
void setAutoExposure(bool arg) {renderer_.tone_proc.enabled = arg;}
void setAmbientColor(const QColor & arg) {ambientColor_ = arg;}
void setFogColor(const QColor & arg) {fogColor_ = arg;}
void setFogDensity(const float & arg) {fogDensity_ = arg;}

View File

@@ -63,7 +63,7 @@ private:
private slots:
void on_spinFOV_valueChanged(double val) {view->view()->setFOV(val);}
void on_spinDepthStart_valueChanged(double val) {view->view()->setDepthStart(val);}
void on_spinViewExposure_valueChanged(double val) {view->view()->setExposure(val);}
void on_spinViewGamma_valueChanged(double val) {view->view()->setGamma(val);}
void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->view()->setRenderMode((ObjectBase::RenderMode)modes[val]);}
void on_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(val);}
void on_groupSelectionHalo_clicked(bool val) {view->view()->setSelectionHaloEnabled(val);}
@@ -71,6 +71,7 @@ private slots:
void on_spinSelectionHaloFill_valueChanged(double val) {view->view()->setSelectionHaloFillAlpha(val);}
void on_colorHoverHalo_colorChanged(QColor color) {view->view()->setHoverHaloColor(color);}
void on_colorSelectionHalo_colorChanged(QColor color) {view->view()->setSelectionHaloColor(color);}
void on_checkAutoExposure_toggled(bool val) {view->view()->setAutoExposure(val);}
void on_checkFXAA_clicked(bool val) {view->view()->setFeature(QGLView::qglFXAA, val);}
void on_colorBack_colorChanged(QColor color) {view->view()->setBackColor(color);}
void on_colorAmbient_colorChanged(QColor color) {view->view()->setAmbientColor(color);}

View File

@@ -107,6 +107,22 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="spinDepthStart">
<property name="decimals">
<number>3</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::AdaptiveDecimalStepType</enum>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
@@ -175,37 +191,34 @@
<item row="5" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Exposure</string>
<string>Gamma</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="SpinSlider" name="spinViewExposure">
<widget class="SpinSlider" name="spinViewGamma">
<property name="minimum">
<double>0.010000000000000</double>
</property>
<property name="maximum">
<double>99.000000000000000</double>
<double>5.000000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
<property name="decimals">
<number>3</number>
</property>
<property name="squareScale">
<bool>true</bool>
<number>2</number>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<item row="7" column="0" colspan="2">
<widget class="QCheckBox" name="checkFXAA">
<property name="text">
<string>FXAA</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<item row="8" column="0" colspan="2">
<widget class="QGroupBox" name="groupHoverHalo">
<property name="title">
<string>Hover halo</string>
@@ -260,7 +273,7 @@
</layout>
</widget>
</item>
<item row="8" column="0" colspan="2">
<item row="9" column="0" colspan="2">
<widget class="QGroupBox" name="groupSelectionHalo">
<property name="title">
<string>Selection halo</string>
@@ -315,7 +328,7 @@
</layout>
</widget>
</item>
<item row="9" column="0" colspan="2">
<item row="10" column="0" colspan="2">
<widget class="QGroupBox" name="groupCamera">
<property name="title">
<string>Camera</string>
@@ -344,16 +357,13 @@
</layout>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="spinDepthStart">
<property name="decimals">
<number>3</number>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="checkAutoExposure">
<property name="text">
<string>Auto exposure</string>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
@@ -377,7 +387,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>960</width>
<width>951</width>
<height>737</height>
</rect>
</property>
@@ -1016,7 +1026,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>999</width>
<width>990</width>
<height>853</height>
</rect>
</property>

View File

@@ -68,7 +68,7 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
<< ShaderPair("ssao_merge", &shader_ssao_merge)
<< ShaderPair("dof", &shader_dof);*/
shader_fxaa = 0;
exposure_ = 1.;
gamma_ = 1.;
edit_mode = need_init_shaders = is_camera_light = true;
}
@@ -160,6 +160,9 @@ void Renderer::initShaders() {
for (int i = 0; i < 5; ++i)
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
}
if (bindShader(srGeometryPass, &prog)) {
setUniformMaps(prog);
}
if (bindShader(srTonemapPass, &prog)) {
prog->setUniformValue("tex_0", 0);
prog->setUniformValue("tex_sum", 1);
@@ -266,17 +269,16 @@ void Renderer::renderScene() {
glEnableDepth();
glClearFramebuffer();
if (bindShader(srGeometryPass, &prog)) {
setUniformMaps(prog);
setUniformCamera(prog, cam);
textures_empty.bind(f, tarEmpty);
textures_maps .bind(f, tarMaps );
renderObjects(scene, rpSolid);
renderObjects(scene, rpTransparent);
}
fbo_ds.release();
/// lighting passes
fbo_ds.bindColorTextures();
fbo_ds.bindDepthTexture(5);
fbo_out.bind();
//int ri = 1, wi = 0;
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
@@ -293,6 +295,8 @@ void Renderer::renderScene() {
renderQuad(prog, quad, cam);
}
}
/// blending layers
if (bindShader(srFinalPass, &prog)) {
fbo_out.bindColorTexture(obrSolidOmni, 0);
fbo_out.bindColorTexture(obrSolidSpot, 1);
@@ -302,7 +306,7 @@ void Renderer::renderScene() {
if (tone_proc.process())
fbo_out.bind();
if (bindShader(srTonemapPass, &prog)) {
prog->setUniformValue("exposure", exposure_);
prog->setUniformValue("gamma", gamma_);
prog->setUniformValue("frame_max", tone_proc.frameMax());
//fbo_1x1.bindColorTexture(0, 1);
fbo_out.bindColorTexture(obrSum, 0);

View File

@@ -92,7 +92,7 @@ protected:
void releaseShader();
private:
float exposure_;
float gamma_;
bool edit_mode, need_init_shaders, is_camera_light, need_render_sum;
Framebuffer fbo_ds, fbo_out;
/*QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;

View File

@@ -142,8 +142,7 @@ void RendererSelection::renderSelection(Scene & scene) {
//qDebug() << id_hover;
fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover );
fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect);
int wind[2] = {sbrHovered, sbrSelected};
fbo_selection.setWriteBuffers(wind, 2);
fbo_selection.setWriteBuffers(QVector<int>() << sbrHovered << sbrSelected);
if (!view->hoverHalo_ && !view->selectionHalo_)
glClearFramebuffer(QColor(0,0,0,0), false);
else {

View File

@@ -33,6 +33,7 @@ TonemappingProc::TonemappingProc(Renderer * rend): QThread(), r(rend),
timer_delim = 0;
frame_max = cur_max = 1.;
need_render_sum = exit_ = false;
enabled = true;
timer_tone = startTimer(10);
}
@@ -80,7 +81,7 @@ void TonemappingProc::resize() {
void TonemappingProc::timerEvent(QTimerEvent * e) {
if (!fbo_1x1.isInit()) return;
if (!fbo_1x1.isInit() || !enabled) return;
if (timer_delim == 0)
need_render_sum = true;
timer_delim = (timer_delim + 1) % 10;
@@ -122,6 +123,10 @@ void TonemappingProc::renderSum(Framebuffer & fbo_src, int index) {
void TonemappingProc::run() {
while (!exit_) {
if (!enabled) {
msleep(100);
continue;
}
mutex.lock();
if (last_data.isEmpty()) {
mutex.unlock();
@@ -159,7 +164,7 @@ float TonemappingProc::calcHistogram(const QVector<QVector4D> & data) {
bool TonemappingProc::process() {
if (!need_render_sum) return false;
if (!need_render_sum || !enabled) return false;
need_render_sum = false;
Framebuffer & fbo(fbomm.lastPlane());
if (fbo.queriedPoints() > 0) {
@@ -176,10 +181,6 @@ bool TonemappingProc::process() {
float TonemappingProc::frameMax() {
if (!enabled) return 1.f;
return cur_max;
/*mutex.lock();
float ret = frame_max;
mutex.unlock();
return ret;*/
}

View File

@@ -26,6 +26,7 @@
class TonemappingProc: public QThread
{
friend class Renderer;
friend class QGLView;
public:
TonemappingProc(Renderer * rend);
virtual ~TonemappingProc();
@@ -50,7 +51,7 @@ private:
QVector<float> last_max;
float frame_max, cur_max;
bool need_render_sum;
bool need_render_sum, enabled;
volatile bool exit_;
int timer_tone, timer_delim;
Framebuffer fbo_1x1;