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

This commit is contained in:
2015-11-30 14:45:48 +00:00
parent 8f3506b4a0
commit fc0b593329
15 changed files with 294 additions and 284 deletions

View File

@@ -89,7 +89,7 @@ void GLRendererBase::setupShadersLights(int lights_count) {
#define BIND_TEXTURE(ch, map) if (rp.prev_tex[ch] != mat.map.bitmap_id) { \
rp.prev_tex[ch] = mat.map.bitmap_id; \
glActiveTextureChannel(ch); glBindTexture(GL_TEXTURE_2D, mat.map.bitmap_id); \
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, view.anisotropicLevel_);}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, view.feature(QGLView::qglAnisotropicLevel).toInt());}
void GLRendererBase::setupTextures(GLObjectBase & o, GLRendererBase::RenderingParameters & rp, bool first_object) {
if (first_object) {
@@ -141,14 +141,14 @@ void GLRendererBase::setupLights(int pass, int lights_per_pass) {
void GLRendererBase::applyFilteringParameters() {
if (view.linearFiltering_) {
if (view.isFeatureEnabled(QGLView::qglLinearFiltering)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
} else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, view.anisotropicLevel_);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, view.feature(QGLView::qglAnisotropicLevel).toInt());
}

View File

@@ -65,6 +65,7 @@ const char qgl_structs[] =
" float constantAttenuation;\n"
" float linearAttenuation;\n"
" float quadraticAttenuation;\n"
" sampler2DShadow shadow;\n"
"};\n"
"struct QGLMap {\n"
" float offset;\n"

View File

@@ -38,7 +38,6 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
view->setMouseSelectionEnabled(true);
view->setSelectionHaloEnabled(true);
view->setHoverHaloEnabled(true);
view->setAccomodationEnabled(false);
view->setHoverHaloFillAlpha(0.);
view->setSelectionHaloFillAlpha(0.);
view->setBackColor(Qt::lightGray);
@@ -181,8 +180,9 @@ void MainWindow::changeEvent(QEvent * e) {
void MainWindow::timerEvent(QTimerEvent * ) {
static double t = 0.;
view->light(view->lightsCount() - 1)->setPos(view->camera().worldPos());
((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos());
if (checkCameraLight->isChecked())
view->light(view->lightsCount() - 1)->setPos(view->camera().worldPos());
//((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos());
//qDebug() << view->camera().angles();
//cam_mat.rotate(e->y(), 0., 1., 0.);
//view->camera().setTransform(cam_mat);

View File

@@ -69,15 +69,16 @@ private slots:
void on_actionExit_triggered() {close();}
void on_spinFOV_valueChanged(double val) {view->setFOV(val);}
void on_spinAccom_valueChanged(double val) {view->setAccomodationTime(val);}
void on_spinAccomMS_valueChanged(double val) {view->setAccomodationMaxSpeed(val);}
void on_spinCubemapSize_valueChanged(double val) {view->setDynamicReflectionsMapSize(val);}
void on_spinShadowmapSize_valueChanged(double val) {view->setShadowMapSize(val);}
void on_spinAccom_valueChanged(double val) {view->setFeature(QGLView::qglEyeAccomodationTime, val);}
void on_spinAccomMS_valueChanged(double val) {view->setFeature(QGLView::qglEyeAccomodationMaxSpeed, val);}
void on_spinCubemapSize_valueChanged(double val) {view->setFeature(QGLView::qglDynamicReflectionsMapSize, val);}
void on_spinShadowmapSize_valueChanged(double val) {view->setFeature(QGLView::qglShadowsMapSize, val);}
void on_spinHaloFillAlpha_valueChanged(double val) {view->setSelectionHaloFillAlpha(val);}
void on_spinMotionBlurFactor_valueChanged(double val) {view->setMotionBlurFactor(val);}
void on_spinMotionBlurSteps_valueChanged(int val) {view->setMotionBlurSteps(val);}
void on_spinMotionBloomFactor_valueChanged(double val) {view->setBloomFactor(val);}
void on_spinMotionBloomRadius_valueChanged(int val) {view->setBloomRadius(val);}
void on_spinMotionBlurFactor_valueChanged(double val) {view->setFeature(QGLView::qglMotionBlurFactor, val);}
void on_spinMotionBlurSteps_valueChanged(int val) {view->setFeature(QGLView::qglMotionBlurSteps, val);}
void on_spinBloomFactor_valueChanged(double val) {view->setFeature(QGLView::qglBloomFactor, val);}
void on_spinBloomRadius_valueChanged(int val) {view->setFeature(QGLView::qglBloomRadius, val);}
void on_spinBloomThreshold_valueChanged(double val) {view->setFeature(QGLView::qglBloomThreshold, val);}
//void on_spinSliderShine_valueChanged(double val) {obj->material().shine_strength = val; obj->setMaterial(obj->material(), true);}
//void on_spinSliderRough_valueChanged(double val) {obj->material().shine = val; obj->setMaterial(obj->material(), true);}
void on_pushButton_clicked() {view->removeLight(view->lightsCount() - 1); setWindowTitle(QString::number(view->lightsCount()));}
@@ -87,16 +88,16 @@ private slots:
void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->setRenderMode((GLObjectBase::RenderMode)modes[val]);}
//void on_comboLight_currentIndexChanged(int val) {obj->material().light_model = (Material::LightModel)val; obj->setMaterial(obj->material(), true);}
void on_checkSelectionHalo_toggled(bool val) {view->setSelectionHaloEnabled(val);}
void on_checkDynamicReflections_toggled(bool val) {view->setDynamicReflectionsEnabled(val);}
void on_checkHDR_toggled(bool val) {view->setHDREnabled(val);}
void on_checkAccomodation_toggled(bool val) {view->setAccomodationEnabled(val);}
void on_checkBloom_toggled(bool val) {view->setBloomEnabled(val);}
void on_checkFXAA_toggled(bool val) {view->setFXAAEnabled(val);}
void on_checkMSAA_toggled(bool val) {view->setMultisamplingEnabled(val);}
void on_checkShadows_toggled(bool val) {view->setShadowsEnabled(val);}
void on_checkSoftShadows_toggled(bool val) {view->setSoftShadowsEnabled(val);}
void on_checkDynamicReflections_toggled(bool val) {view->setFeature(QGLView::qglDynamicReflectionsEnabled, val);}
void on_checkHDR_toggled(bool val) {view->setFeature(QGLView::qglHDR, val);}
void on_checkAccomodation_toggled(bool val) {view->setFeature(QGLView::qglEyeAccomodationEnabled, val);}
void on_checkBloom_toggled(bool val) {view->setFeature(QGLView::qglBloomEnabled, val);}
void on_checkFXAA_toggled(bool val) {view->setFeature(QGLView::qglFXAA, val);}
void on_checkMSAA_toggled(bool val) {view->setFeature(QGLView::qglMSAA, val);}
void on_checkShadows_toggled(bool val) {view->setFeature(QGLView::qglShadowsEnabled, val);}
void on_checkSoftShadows_toggled(bool val) {view->setFeature(QGLView::qglShadowsSoftEnabled, val);}
void on_checkCameraOrbit_toggled(bool val) {view->setCameraOrbit(val);}
void on_checkMotionBlur_toggled(bool val) {view->setMotionBlurEnabled(val);}
void on_checkMotionBlur_toggled(bool val) {view->setFeature(QGLView::qglMotionBlurEnabled, val);}
void on_colorAmbient_colorChanged(QColor color) {view->setAmbientColor(color);}
void on_colorHalo_colorChanged(QColor color) {view->setSelectionHaloColor(color);}
void on_view_glKeyPressEvent(QKeyEvent * e);

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1246</width>
<height>851</height>
<width>1131</width>
<height>772</height>
</rect>
</property>
<property name="windowTitle">
@@ -108,14 +108,14 @@
</property>
</widget>
</item>
<item row="7" column="0">
<item row="8" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>motion blur factor</string>
</property>
</widget>
</item>
<item row="8" column="0">
<item row="9" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>motion blur steps</string>
@@ -213,7 +213,7 @@
</property>
</widget>
</item>
<item row="7" column="1">
<item row="8" column="1">
<widget class="SpinSlider" name="spinMotionBlurFactor">
<property name="minimum">
<double>0.000000000000000</double>
@@ -238,7 +238,7 @@
</property>
</widget>
</item>
<item row="8" column="1">
<item row="9" column="1">
<widget class="SpinSlider" name="spinMotionBlurSteps">
<property name="minimum">
<double>1.000000000000000</double>
@@ -270,7 +270,7 @@
</property>
</widget>
</item>
<item row="6" column="0">
<item row="7" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>bloom radius</string>
@@ -278,7 +278,7 @@
</widget>
</item>
<item row="5" column="1">
<widget class="SpinSlider" name="spinMotionBloomFactor">
<widget class="SpinSlider" name="spinBloomFactor">
<property name="minimum">
<double>0.000000000000000</double>
</property>
@@ -302,8 +302,8 @@
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="SpinSlider" name="spinMotionBloomRadius">
<item row="7" column="1">
<widget class="SpinSlider" name="spinBloomRadius">
<property name="minimum">
<double>1.000000000000000</double>
</property>
@@ -327,6 +327,38 @@
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>bloom threshold</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="SpinSlider" name="spinBloomThreshold">
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="value">
<double>0.900000000000000</double>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="pageStep">
<double>1.000000000000000</double>
</property>
<property name="squareScale">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
@@ -438,106 +470,107 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkCameraOrbit">
<property name="text">
<string>orbit camera</string>
<layout class="QGridLayout" name="gridLayout">
<property name="bottomMargin">
<number>20</number>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkSelectionHalo">
<property name="text">
<string>selection halo</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBadAccum">
<property name="text">
<string>bad accumulation</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkDynamicReflections">
<property name="text">
<string>dynamic reflections</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkHDR">
<property name="text">
<string>HDR</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkAccomodation">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>accomodation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBloom">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>bloom</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkMotionBlur">
<property name="text">
<string>motion blur</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkFXAA">
<property name="text">
<string>FXAA</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkMSAA">
<property name="text">
<string>MSAA</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkShadows">
<property name="text">
<string>shadows</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkSoftShadows">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>soft shadows</string>
</property>
</widget>
<item row="3" column="0">
<widget class="QCheckBox" name="checkDynamicReflections">
<property name="text">
<string>dynamic reflections</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBadAccum">
<property name="text">
<string>bad accumulation</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkSelectionHalo">
<property name="text">
<string>selection halo</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkShadows">
<property name="text">
<string>shadows</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="checkSoftShadows">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>soft shadows</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="checkCameraOrbit">
<property name="text">
<string>orbit camera</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="checkAccomodation">
<property name="text">
<string>accomodation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="checkBloom">
<property name="text">
<string>bloom</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="checkMotionBlur">
<property name="text">
<string>motion blur</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="checkFXAA">
<property name="text">
<string>FXAA</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="checkMSAA">
<property name="text">
<string>MSAA</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="checkCameraLight">
<property name="text">
<string>Follow camera light</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_7">
@@ -699,38 +732,6 @@
</customwidgets>
<resources/>
<connections>
<connection>
<sender>checkHDR</sender>
<signal>toggled(bool)</signal>
<receiver>checkAccomodation</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>112</x>
<y>570</y>
</hint>
<hint type="destinationlabel">
<x>111</x>
<y>593</y>
</hint>
</hints>
</connection>
<connection>
<sender>checkHDR</sender>
<signal>toggled(bool)</signal>
<receiver>checkBloom</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>167</x>
<y>570</y>
</hint>
<hint type="destinationlabel">
<x>163</x>
<y>616</y>
</hint>
</hints>
</connection>
<connection>
<sender>checkShadows</sender>
<signal>toggled(bool)</signal>

View File

@@ -37,11 +37,12 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
ambientColor_ = QColor(10, 10, 10);
lastPos = QPoint(-1, -1);
lineWidth_ = 1.;
linearFiltering_ = cameraOrbit_ = lightEnabled_ = true;
max_anisotropic = 1;
max_texture_chanels = 8;
cameraOrbit_ = lightEnabled_ = true;
shaders_supported = selecting_ = customMouseMove_ = false;
sel_button = Qt::LeftButton;
sel_mod = Qt::NoModifier;
anisotropicLevel_ = 8;
renderer_ = 0;
fps_cnt = 0;
fps_tm = fps_ = 0.;
@@ -51,19 +52,30 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
fogMode_ = Exp;
hoverHaloFill_ = 0.333;
selectionHaloFill_ = 0.5;
shadow_map_size = dynamic_cubemap_size = 512;
//lmode = Simple;
shader_select = shader_halo = 0;
cur_luminance = 1.;
m_bloomFactor = 0.5;
m_bloomRadius = 8;
accom_time = 16.;
accom_max_speed = 0.2;
m_motionBlurFactor = 1.;
m_motionBlurSteps = 8;
mouse_first = mouseSelect_ = accomodation_ = hoverHalo_ = selectionHalo_ = true;
fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = m_motionBlurEnabled =
shadows_ = shadows_soft = dynamic_reflections = hdr_ = bloom_ = msaa_ = fxaa_ = changed_ = false;
setFeature(qglMSAA, false);
setFeature(qglFXAA, false);
setFeature(qglLinearFiltering, true);
setFeature(qglAnisotropicLevel, 8);
setFeature(qglHDR, false);
setFeature(qglEyeAccomodationEnabled, false);
setFeature(qglEyeAccomodationTime, 16.);
setFeature(qglEyeAccomodationMaxSpeed, 0.2);
setFeature(qglBloomEnabled, false);
setFeature(qglBloomThreshold, 0.9);
setFeature(qglBloomFactor, 1.);
setFeature(qglBloomRadius, 8);
setFeature(qglMotionBlurEnabled, false);
setFeature(qglMotionBlurFactor, 1.);
setFeature(qglMotionBlurSteps, 8);
setFeature(qglShadowsEnabled, false);
setFeature(qglShadowsMapSize, 512);
setFeature(qglShadowsSoftEnabled, false);
setFeature(qglDynamicReflectionsEnabled, false);
setFeature(qglDynamicReflectionsMapSize, 512);
mouse_first = mouseSelect_ = hoverHalo_ = selectionHalo_ = true;
fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = changed_ = false;
rmode = GLObjectBase::Fill;
sel_mode = QGLView::SingleSelection;
sel_pen = QPen(Qt::black, 1, Qt::DashLine);
@@ -73,8 +85,6 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
emit cameraPosChanged(camera().pos());
//camera().aim_ = camera().pos_;
ktm_.restart();
sh_lm_diff << "Phong_diffuse" << "Cook_Torrance_diffuse" << "Minnaert_diffuse" << "Strauss_diffuse" << "Oren_Nayar_diffuse";
sh_lm_spec << "Phong_specular" << "Cook_Torrance_specular" << "Minnaert_specular" << "Strauss_specular" << "Oren_Nayar_specular";
}
@@ -400,7 +410,7 @@ void QGLView::renderSelection() {
void QGLView::renderShadow() {
glPushMatrix();
renderSingleShadow(objects_);
//renderSingleShadow(objects_);
glPopMatrix();
}
@@ -434,7 +444,7 @@ void QGLView::renderSingleSelection(GLObjectBase & o) {
renderSingleSelection(*i);
}
/**
void QGLView::renderSingleShadow(GLObjectBase & o) {
if (!o.isInit()) {
o.init();
@@ -449,7 +459,7 @@ void QGLView::renderSingleShadow(GLObjectBase & o) {
foreach (GLObjectBase * i, o.children_)
renderSingleSelection(*i);
}
*/
void QGLView::collectLights() {
lights_.clear();
@@ -483,6 +493,8 @@ void QGLView::collectObjectLights(GLObjectBase * o) {
void QGLView::checkCaps() {
glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropic);
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_texture_chanels);
//qDebug() << max_texture_chanels;
shaders_supported = QGLShaderProgram::hasOpenGLShaderPrograms();
}
@@ -495,7 +507,7 @@ void QGLView::reloadThisShaders() {
}
inline void QGLView::applyFog() {
void QGLView::applyFog() {
GLfloat fog_col[4] = {float(fogColor_.redF()), float(fogColor_.greenF()), float(fogColor_.blueF()), .0f};
if (fogEnabled_) {
glEnable(GL_FOG);

View File

@@ -47,8 +47,6 @@ class QGLView: public QGraphicsView, public QGLViewBase
Q_PROPERTY (double FOV READ FOV WRITE setFOV)
Q_PROPERTY (double depthStart READ depthStart WRITE setDepthStart)
Q_PROPERTY (double depthEnd READ depthEnd WRITE setDepthEnd)
Q_PROPERTY (bool linearFiltering READ linearFiltering WRITE setLinearFiltering)
Q_PROPERTY (int anisotropicLevel READ anisotropicLevel WRITE setAnisotropicLevel)
Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor)
Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor)
Q_PROPERTY (double fogDensity READ fogDensity WRITE setFogDensity)
@@ -68,23 +66,6 @@ class QGLView: public QGraphicsView, public QGLViewBase
Q_PROPERTY (QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor)
Q_PROPERTY (double selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha)
//Q_PROPERTY (LightingMode lightingMode READ lightingMode WRITE setLightingMode)
Q_PROPERTY (bool shadowsEnabled READ isShadowsEnabled WRITE setShadowsEnabled)
Q_PROPERTY (bool softShadowsEnabled READ isSoftShadowsEnabled WRITE setSoftShadowsEnabled)
Q_PROPERTY (int shadowMapSize READ shadowMapSize WRITE setShadowMapSize)
Q_PROPERTY (bool dynamicReflectionsEnabled READ isDynamicReflectionsEnabled WRITE setDynamicReflectionsEnabled)
Q_PROPERTY (int dynamicReflectionsMapSize READ dynamicReflectionsMapSize WRITE setDynamicReflectionsMapSize)
Q_PROPERTY (bool HDREnabled READ isHDREnabled WRITE setHDREnabled)
Q_PROPERTY (bool bloomEnabled READ isBloomEnabled WRITE setBloomEnabled)
Q_PROPERTY (double bloomFactor READ bloomFactor WRITE setBloomFactor)
Q_PROPERTY (int bloomRadius READ bloomRadius WRITE setBloomRadius)
Q_PROPERTY (bool multisamplingEnabled READ isMultisamplingEnabled WRITE setMultisamplingEnabled)
Q_PROPERTY (bool FXAAEnabled READ isFXAAEnabled WRITE setFXAAEnabled)
Q_PROPERTY (bool accomodationEnabled READ isAccomodationEnabled WRITE setAccomodationEnabled)
Q_PROPERTY (double accomodationTime READ accomodationTime WRITE setAccomodationTime)
Q_PROPERTY (double accomodationMaxSpeed READ accomodationMaxSpeed WRITE setAccomodationMaxSpeed)
Q_PROPERTY (bool motionBlurEnabled READ isMotionBlurEnabled WRITE setMotionBlurEnabled)
Q_PROPERTY (double motionBlurFactor READ motionBlurFactor WRITE setMotionBlurFactor)
Q_PROPERTY (int motionBlurSteps READ motionBlurSteps WRITE setMotionBlurSteps)
Q_PROPERTY (Qt::MouseButton selectionButton READ selectionButton WRITE setSelectionButton)
Q_PROPERTY (Qt::KeyboardModifier selectionModifier READ selectionModifier WRITE setSelectionModifier)
Q_PROPERTY (SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
@@ -97,6 +78,28 @@ public:
enum FogMode {Linear = GL_LINEAR, Exp = GL_EXP, Exp2 = GL_EXP2};
enum SelectionMode {NoSelection, SingleSelection, MultiSelection};
enum Feature {
qglMSAA,
qglFXAA,
qglLinearFiltering,
qglAnisotropicLevel,
qglHDR,
qglEyeAccomodationEnabled,
qglEyeAccomodationTime,
qglEyeAccomodationMaxSpeed,
qglBloomEnabled,
qglBloomThreshold,
qglBloomFactor,
qglBloomRadius,
qglMotionBlurEnabled,
qglMotionBlurFactor,
qglMotionBlurSteps,
qglShadowsEnabled,
qglShadowsMapSize,
qglShadowsSoftEnabled,
qglDynamicReflectionsEnabled,
qglDynamicReflectionsMapSize
};
Q_ENUMS (FogMode)
Q_ENUMS (SelectionMode)
@@ -118,11 +121,7 @@ public:
double depthStart() const {return camera().depth_start;}
double depthEnd() const {return camera().depth_end;}
double currentFPS() const {return fps_;}
bool linearFiltering() const {return linearFiltering_;}
int anisotropicLevel() const {return anisotropicLevel_;}
int maxAnisotropicLevel() const {return max_anisotropic;}
int shadowMapSize() const {return shadow_map_size;}
int dynamicReflectionsMapSize() const {return dynamic_cubemap_size;}
QColor ambientColor() const {return ambientColor_;}
QColor fogColor() const {return fogColor_;}
@@ -143,26 +142,14 @@ public:
bool isSelectionHaloEnabled() const {return selectionHalo_;}
QColor selectionHaloColor() const {return selectionHaloColor_;}
double selectionHaloFillAlpha() const {return selectionHaloFill_;}
bool isMotionBlurEnabled() const {return m_motionBlurEnabled;}
bool isShadowsEnabled() const {return shadows_;}
bool isSoftShadowsEnabled() const {return shadows_soft;}
bool isDynamicReflectionsEnabled() const {return dynamic_reflections;}
bool isHDREnabled() const {return hdr_;}
bool isBloomEnabled() const {return bloom_;}
bool isMultisamplingEnabled() const {return msaa_;}
bool isFXAAEnabled() const {return fxaa_;}
bool isAccomodationEnabled() const {return accomodation_;}
QVariant feature(Feature f) const {return features_.value(int(f));}
QVariant setFeature(Feature f, const QVariant & value) {QVariant ret = features_.value(int(f)); features_[int(f)] = value; return ret;}
bool isFeatureEnabled(Feature f) const {return features_[int(f)].toBool();}
int renderMode() const {return (int)rmode;}
void setRenderMode(int mode) {rmode = (GLObjectBase::RenderMode)mode;}
double bloomFactor() const {return m_bloomFactor;}
int bloomRadius() const {return m_bloomRadius;}
double accomodationTime() const {return accom_time;}
double accomodationMaxSpeed() const {return accom_max_speed;}
double motionBlurFactor() const {return m_motionBlurFactor;}
int motionBlurSteps() const {return m_motionBlurSteps;}
void addObject(QGraphicsItem * o) {scene()->addItem(o);}
void addObject(QWidget * o, Qt::WindowFlags f = Qt::Widget);
void addObject(GLObjectBase * o);
@@ -211,16 +198,16 @@ protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
virtual void mousePressEvent(QMouseEvent * e);
virtual void mouseMoveEvent(QMouseEvent * e);
virtual void mouseReleaseEvent(QMouseEvent * e);
virtual void wheelEvent(QWheelEvent * e);
virtual void leaveEvent(QEvent * );
virtual void keyPressEvent(QKeyEvent * e) {emit glKeyPressEvent(e); if (e->key() > 0) keys_.insert(e->key());}
virtual void keyReleaseEvent(QKeyEvent * e) {emit glKeyReleaseEvent(e); keys_.remove(e->key());}
virtual void focusOutEvent(QFocusEvent *) {keys_.clear();}
void mousePressEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent * e);
void wheelEvent(QWheelEvent * e);
void leaveEvent(QEvent * );
void keyPressEvent(QKeyEvent * e) {emit glKeyPressEvent(e); if (e->key() > 0) keys_.insert(e->key());}
void keyReleaseEvent(QKeyEvent * e) {emit glKeyReleaseEvent(e); keys_.remove(e->key());}
void focusOutEvent(QFocusEvent *) {keys_.clear();}
inline void applyFog();
void applyFog();
void renderSelection();
void renderShadow();
@@ -232,7 +219,7 @@ private:
void objectsCountInternal(int * cnt, GLObjectBase * where) {++(*cnt); foreach (GLObjectBase * i, where->children_) objectsCountInternal(cnt, i);}
void removeObjectInternal(GLObjectBase * o, GLObjectBase * where) {foreach (GLObjectBase * i, where->children_) {if (o == i) where->removeChild(i); else removeObjectInternal(o, i);}}
void renderSingleSelection(GLObjectBase & o);
void renderSingleShadow(GLObjectBase & o);
//void renderSingleShadow(GLObjectBase & o);
void renderHalo(const GLObjectBase * obj, const int iid, const QColor & color, const double & fill);
QList<QGraphicsItem * > collectGraphicItems();
void collectGraphicItems(QList<QGraphicsItem * > & list, QGraphicsItem * o);
@@ -253,25 +240,24 @@ private:
QTime time, ktm_;
QPen sel_pen;
QBrush sel_brush;
GLint max_anisotropic, anisotropicLevel_;
GLint max_anisotropic, max_texture_chanels;
GLObjectBase::RenderMode rmode;
//LightingMode lmode;
GLObjectBase * sel_obj, * hov_obj;
GLFramebuffer fbo_selection;
QGLShaderProgram * shader_select, * shader_halo;
QStringList sh_lm_diff, sh_lm_spec;
GLRendererBase * renderer_;
SelectionMode sel_mode;
Qt::MouseButton sel_button;
Qt::KeyboardModifier sel_mod;
GLRendererBase::RenderingParameters start_rp;
double lineWidth_, linearFiltering_, accom_time, accom_max_speed, cur_luminance, m_bloomFactor;
QHash<int, QVariant> features_;
double lineWidth_;
double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor;
int timer, fps_cnt, sh_id_loc, shadow_map_size, dynamic_cubemap_size, motion_blur_steps, m_motionBlurSteps, m_bloomRadius;
int timer, fps_cnt, sh_id_loc;
bool is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_;
bool shaders_supported, changed_, cameraOrbit_;
bool hoverHalo_, selectionHalo_, mouseThis_, shaders_bind, shadows_, shadows_soft, selecting_;
bool dynamic_reflections, hdr_, bloom_, msaa_, fxaa_, accomodation_, m_motionBlurEnabled;
bool hoverHalo_, selectionHalo_, mouseThis_, shaders_bind, selecting_;
public slots:
void setBackColor(const QColor & arg) {backColor_ = arg;}
@@ -279,8 +265,6 @@ public slots:
void setFOV(const double & arg) {camera().fov_ = arg;}
void setDepthStart(const double & arg) {camera().depth_start = arg;}
void setDepthEnd(const double & arg) {camera().depth_end = arg;}
void setLinearFiltering(const bool & arg) {linearFiltering_ = arg;}
void setAnisotropicLevel(const int & arg) {anisotropicLevel_ = arg;}
void setAmbientColor(const QColor & arg) {ambientColor_ = arg;}
void setFogColor(const QColor & arg) {fogColor_ = arg;}
void setFogDensity(const double & arg) {fogDensity_ = arg;}
@@ -301,23 +285,6 @@ public slots:
void setSelectionHaloColor(const QColor & arg) {selectionHaloColor_ = arg;}
void setSelectionHaloFillAlpha(const double & arg) {selectionHaloFill_ = arg;}
//void setLightingMode(const LightingMode & arg) {lmode = arg;}
void setShadowsEnabled(const bool & arg) {shadows_ = arg;}
void setSoftShadowsEnabled(const bool & arg) {shadows_soft = arg;}
void setShadowMapSize(const int & arg) {shadow_map_size = arg; changed_ = true;}
void setDynamicReflectionsMapSize(const int & arg) {dynamic_cubemap_size = arg; changed_ = true;}
void setAccomodationTime(const double & arg) {accom_time = arg;}
void setAccomodationMaxSpeed(const double & arg) {accom_max_speed = arg;}
void setDynamicReflectionsEnabled(const bool & arg) {dynamic_reflections = arg;}
void setHDREnabled(const bool & arg) {hdr_ = arg; changed_ = true;}
void setBloomEnabled(const bool & arg) {bloom_ = arg; changed_ = true;}
void setMultisamplingEnabled(const bool & arg) {msaa_ = arg;}
void setFXAAEnabled(const bool & arg) {fxaa_ = arg;}
void setAccomodationEnabled(const bool & arg) {accomodation_ = arg;}
void setBloomFactor(double bloomFactor) {m_bloomFactor = bloomFactor;}
void setBloomRadius(int bloomRadius) {m_bloomRadius = bloomRadius;}
void setMotionBlurEnabled(bool motionBlurEnabled) {m_motionBlurEnabled = motionBlurEnabled;}
void setMotionBlurFactor(double motionBlurFactor) {m_motionBlurFactor = motionBlurFactor;}
void setMotionBlurSteps(int motionBlurSteps) {m_motionBlurSteps = motionBlurSteps;}
void reloadShaders() {if (renderer_ != 0) renderer_->reloadShaders(); reloadThisShaders();}
void deselect() {sel_obj = 0;}

View File

@@ -157,7 +157,7 @@ void RendererDeferredShading::renderScene() {
glActiveTextureChannel(0);
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
if (view.isAccomodationEnabled()) {
if (view.isFeatureEnabled(QGLView::qglEyeAccomodationEnabled)) {
fbo_hsmall.bind();
fbo_hsmall.setWriteBuffer(0);
shader_small->bind();
@@ -176,8 +176,8 @@ void RendererDeferredShading::renderScene() {
if (max[2] < hcontent[i].z) max[2] = hcontent[i].z;
}
GLfloat mluma = (0.299 * max[0]) + (0.587 * max[1]) + (0.114 * max[2]);
double nexp = mluma / 16., dexp = nexp - exposure_, mestep = exposure_ * view.accomodationMaxSpeed();
dexp /= view.accomodationTime();
double nexp = mluma / 16., dexp = nexp - exposure_, mestep = exposure_ * view.feature(QGLView::qglEyeAccomodationMaxSpeed).toDouble();
dexp /= view.feature(QGLView::qglEyeAccomodationTime).toDouble();
if (dexp > 0. && dexp > mestep/4) dexp = mestep/4;
if (dexp < 0. && dexp < -mestep) dexp = -mestep;
exposure_ += dexp;
@@ -198,7 +198,7 @@ void RendererDeferredShading::renderScene() {
piSwap<int>(wi, ri);
}
if (view.isMotionBlurEnabled()) {
if (view.isFeatureEnabled(QGLView::qglMotionBlurEnabled)) {
fbo_out.setWriteBuffer(wi);
glActiveTextureChannel(1);
glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(4));
@@ -207,15 +207,15 @@ void RendererDeferredShading::renderScene() {
shader_motion_blur->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height()));
shader_motion_blur->setUniformValue("t0", 0);
shader_motion_blur->setUniformValue("ts", 1);
shader_motion_blur->setUniformValue("factor", GLfloat(view.motionBlurFactor()));
shader_motion_blur->setUniformValue("steps", view.motionBlurSteps());
shader_motion_blur->setUniformValue("factor", GLfloat(view.feature(QGLView::qglMotionBlurFactor).toDouble()));
shader_motion_blur->setUniformValue("steps", view.feature(QGLView::qglMotionBlurSteps).toInt());
glDrawQuad(shader_motion_blur);
glActiveTextureChannel(0);
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
piSwap<int>(wi, ri);
}
if (view.isBloomEnabled()) {
if (view.isFeatureEnabled(QGLView::qglBloomEnabled)) {
fbo_out.setWriteBuffer(2);
fbo_out.setReadBuffer(ri);
glBlitFramebuffer(0, 0, fbo_out.width(), fbo_out.height(), 0, 0, fbo_out.width(), fbo_out.height(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
@@ -223,7 +223,8 @@ void RendererDeferredShading::renderScene() {
fbo_out.setWriteBuffer(wi);
shader_bloom_0->bind();
shader_bloom_0->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
shader_bloom_0->setUniformValue("factor", GLfloat(view.bloomFactor()));
shader_bloom_0->setUniformValue("factor", GLfloat(view.feature(QGLView::qglBloomFactor).toDouble()));
shader_bloom_0->setUniformValue("threshold", GLfloat(view.feature(QGLView::qglBloomThreshold).toDouble()));
shader_bloom_0->setUniformValue("t0", 0);
glDrawQuad(shader_bloom_0);
glActiveTextureChannel(0);
@@ -231,13 +232,16 @@ void RendererDeferredShading::renderScene() {
shader_bloom_1->bind();
shader_bloom_1->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
shader_bloom_1->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height()));
shader_bloom_1->setUniformValue("t0", 0);
int radius = view.bloomRadius();
int radius = view.feature(QGLView::qglBloomRadius).toInt();
int passes = qMax<int>(int(ceil(log2(radius))), 1);
int crad = 1;
for (int p = 0; p < passes; ++p) {
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
fbo_out.setWriteBuffer(wi);
if (p == passes - 1)
crad = piMax(1, radius - crad);
shader_bloom_1->setUniformValue("radius", crad);
glDrawQuad(shader_bloom_1);
piSwap<int>(wi, ri);
@@ -262,7 +266,7 @@ void RendererDeferredShading::renderScene() {
glReleaseShaders();
fbo_out.release();
if (view.isFXAAEnabled()) {
if (view.isFeatureEnabled(QGLView::qglFXAA)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
shader_fxaa->bind();
@@ -272,7 +276,7 @@ void RendererDeferredShading::renderScene() {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
glDrawQuad();
if (view.isFXAAEnabled())
if (view.isFeatureEnabled(QGLView::qglFXAA))
shader_fxaa->release();
prev_proj = mproj;
prev_view = mview;

View File

@@ -42,7 +42,7 @@ protected:
private:
typedef QPair<QString, QGLShaderProgram **> ShaderPair;
int cplc, BUG[8], lights_per_pass;
int cplc, lights_per_pass;
double exposure_;
GLFramebuffer fbo_g, fbo_out, fbo_hsmall;
QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;

View File

@@ -48,10 +48,10 @@ void RendererSimple::resizeFBO(int w, int h) {
void RendererSimple::renderScene() {
int passes = (view.lightsCount() - 1) / 8 + 1;
//QMatrix4x4 pm = getGLMatrix(GL_PROJECTION_MATRIX), mvm = getGLMatrix(GL_MODELVIEW_MATRIX), pmvm = pm * mvm, lpm, lmvm, lpmvm;
glSetCapEnabled(GL_MULTISAMPLE, view.isMultisamplingEnabled());
glSetCapEnabled(GL_MULTISAMPLE, view.isFeatureEnabled(QGLView::qglMSAA));
if (passes < 1) passes = 1;
//glEnable(GL_FOG);
if (view.isFXAAEnabled()) fbo.bind();
if (view.isFeatureEnabled(QGLView::qglFXAA)) fbo.bind();
//glEnable(GL_TEXTURE_2D);
if (passes > 1) {
fbo.bind();
@@ -104,7 +104,7 @@ void RendererSimple::renderScene() {
glDrawQuad();
}
}
if (view.isFXAAEnabled() || passes > 1) {
if (view.isFeatureEnabled(QGLView::qglFXAA) || passes > 1) {
fbo.release();
//glClearFramebuffer();
glActiveTextureChannel(0);
@@ -112,7 +112,7 @@ void RendererSimple::renderScene() {
glSetLightEnabled(false);
glSetCapEnabled(GL_BLEND, false);
glDisableDepth();
if (view.isFXAAEnabled()) {
if (view.isFeatureEnabled(QGLView::qglFXAA)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
shader_fxaa->bind();

View File

@@ -1,8 +1,8 @@
#version 150
uniform sampler2D t0;
uniform float factor = 1.;
uniform float factor = 1., threshold = 0.8;
void main(void) {
qgl_FragData[0].rgb = max(texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb - vec3(0.8), vec3(0.)) * factor;
qgl_FragData[0].rgb = max(texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb - vec3(threshold), vec3(0.)) * factor;
}

View File

@@ -2,12 +2,34 @@
uniform sampler2D t0;
uniform int radius = 2;
uniform vec2 dt;
void main(void) {
ivec2 tc = ivec2(gl_FragCoord.xy);
vec2 tc = qgl_FragTexture.xy;
float r = float(radius);
int o = radius, o2 = radius * 2;
vec3 scol = (texelFetch(t0, tc, 0).rgb * 3. +
vec3 scol = (texture(t0, tc).rgb * 3. +
texture(t0, tc + dt * vec2( o, 0 )).rgb * 2. +
texture(t0, tc + dt * vec2( 0, o )).rgb * 2. +
texture(t0, tc + dt * vec2( -o, 0 )).rgb * 2. +
texture(t0, tc + dt * vec2( 0, -o)).rgb * 2. +
texture(t0, tc + dt * vec2( o, o )).rgb * 1.5 +
texture(t0, tc + dt * vec2( o, -o)).rgb * 1.5 +
texture(t0, tc + dt * vec2( -o, -o )).rgb * 1.5 +
texture(t0, tc + dt * vec2( -o, o )).rgb * 1.5 +
texture(t0, tc + dt * vec2( o2, 0 )).rgb +
texture(t0, tc + dt * vec2( 0, o2)).rgb +
texture(t0, tc + dt * vec2(-o2, 0 )).rgb +
texture(t0, tc + dt * vec2( 0, -o2)).rgb +
texture(t0, tc + dt * vec2( o2, o )).rgb +
texture(t0, tc + dt * vec2( o2, -o)).rgb +
texture(t0, tc + dt * vec2(-o2, -o )).rgb +
texture(t0, tc + dt * vec2(-o2, o )).rgb +
texture(t0, tc + dt * vec2( o, o2)).rgb +
texture(t0, tc + dt * vec2( o, -o2)).rgb +
texture(t0, tc + dt * vec2( -o, -o2)).rgb +
texture(t0, tc + dt * vec2( -o, o2)).rgb) / 29.;
/*vec3 scol = (texelFetch(t0, tc, 0).rgb * 3. +
texelFetch(t0, tc + ivec2( o, 0 ), 0).rgb * 2. +
texelFetch(t0, tc + ivec2( 0, o ), 0).rgb * 2. +
texelFetch(t0, tc + ivec2( -o, 0 ), 0).rgb * 2. +
@@ -27,7 +49,7 @@ void main(void) {
texelFetch(t0, tc + ivec2( o, o2), 0).rgb +
texelFetch(t0, tc + ivec2( o, -o2), 0).rgb +
texelFetch(t0, tc + ivec2( -o, -o2), 0).rgb +
texelFetch(t0, tc + ivec2( -o, o2), 0).rgb) / 29.;
texelFetch(t0, tc + ivec2( -o, o2), 0).rgb) / 29.;*/
qgl_FragData[0].rgb = scol;
//qgl_FragData[0].rgb = vec3(r/10.);
}

View File

@@ -49,7 +49,7 @@ void main(void) {
qgl_FragData[1] = vec4(n.xyz / 2. + vec3(0.5), specularity);
qgl_FragData[2] = vec4(spec.rgb, hei);
qgl_FragData[3] = vec4(self.rgb, pos.w);
qgl_FragData[4] = vec4(speed,0);
qgl_FragData[4] = vec4(speed.xy, 0, 0);
//gl_FragData[0] = vec4(et.xyz, pos.w);
//gl_FragDepth = gl_FragCoord.z - clamp(hei / pos.z / pos.z / (abs(n.z) + 1), -0.01, 0.01);

View File

@@ -72,11 +72,11 @@ void main(void) {
//li = vec3(0.);
si = vec3(0.);
float posz = z_near * z_far / (texture2D(td, tc).r * (z_far - z_near) - z_far);
float posz = z_near * z_far / (texelFetch(td, tc, 0).r * (z_far - z_near) - z_far);
pos = vec4(sp, 0., 1) * mat_proji;
pos.xy *= v3.w;
pos.z = posz;
pos.xyz += n * height;
//pos.xyz += n * height;
//pos.xyz = v3.xyz;
//pos = v3;
//pos = vec4(sp, 0, 1.) * mat_proji;
@@ -88,12 +88,12 @@ void main(void) {
sh_pow = 1. / max((1. - v1.w), 0.0001);
sh_mul = max(1. - v1.w, 0.0001);
for (int i = 0; i < 16; ++i)
for (int i = 0; i < 1; ++i)
calcLight(i, n, v, v2);
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texture(t_pp, tc).rgb;
//qgl_FragData[0].rgb = vec3(abs(lpos.xyz - pos.xyz)/10);
//qgl_FragData[0].rgb = si.rgb;
//qgl_FragData[0].rgb = vec3(ldist/1000);
//qgl_FragData[0].rgb = vec3(length(v4.xyz)/10);
//qgl_FragData[0].a = 0.;
}

View File

@@ -16,12 +16,14 @@ vec3 Uncharted2Tonemap(vec3 x) {
}
void main(void) {
qgl_FragData[0].rgb = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb;
return;
vec3 inColor = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb;
inColor *= exposure;
float ExposureBias = 1;
vec3 curr = Uncharted2Tonemap(ExposureBias*inColor);
vec3 whiteScale = 1 / Uncharted2Tonemap(vec3(tW));
vec3 color = curr * whiteScale;
vec3 retColor = pow(color, vec3(1 / 2.2));
vec3 retColor = pow(color, vec3(1 / 1.2));
qgl_FragData[0].rgb = retColor;
}