version 1.2.0
fixed framebuffer size feature
This commit is contained in:
@@ -26,7 +26,7 @@ else()
|
||||
include(SHSTKQtMacros)
|
||||
|
||||
set(QGLEngine_MAJOR 1)
|
||||
set(QGLEngine_MINOR 1)
|
||||
set(QGLEngine_MINOR 2)
|
||||
set(QGLEngine_REVISION 0)
|
||||
set(QGLEngine_SUFFIX "rc")
|
||||
set(QGLEngine_COMPANY SHS)
|
||||
|
||||
15
shaders/rescale.glsl
Normal file
15
shaders/rescale.glsl
Normal file
@@ -0,0 +1,15 @@
|
||||
// vert //
|
||||
|
||||
void main(void) {
|
||||
qgl_FragTexture = qgl_Texture;
|
||||
gl_Position = qgl_ftransform();
|
||||
}
|
||||
|
||||
|
||||
// frag //
|
||||
|
||||
uniform sampler2D tex_0;
|
||||
|
||||
void main(void) {
|
||||
qgl_FragColor = texture(tex_0, qgl_FragTexture.xy);
|
||||
}
|
||||
@@ -11,9 +11,10 @@ void main(void) {
|
||||
uniform sampler2D fb_out, fb_hover, fb_select;
|
||||
|
||||
void main(void) {
|
||||
ivec2 tc = ivec2(gl_FragCoord.xy);
|
||||
//ivec2 tc = ivec2(gl_FragCoord.xy);
|
||||
//vec4 src = texelFetch(fb_out , tc, 0);
|
||||
vec2 stc = qgl_FragTexture.xy;
|
||||
vec4 src = texelFetch(fb_out , tc, 0);
|
||||
vec4 src = texture(fb_out , stc);
|
||||
vec4 hov = texture(fb_hover , stc);
|
||||
vec4 sel = texture(fb_select, stc);
|
||||
src.rgb = clamp(src.rgb, vec3(0), vec3(1));
|
||||
|
||||
@@ -98,6 +98,8 @@ Renderer::Renderer(QGLView * view_)
|
||||
shader_files[srShadowConePass] = "shadow.glsl";
|
||||
shader_files[srShadowOmniPass] = "shadow.glsl";
|
||||
|
||||
shader_files[srRescale] = "rescale.glsl";
|
||||
|
||||
shader_defines[srGeometrySolidPass] << "SOLID";
|
||||
shader_defines[srLightSpotPass] << "SPOT";
|
||||
shader_defines[srShadowOmniPass] << "OMNI";
|
||||
@@ -136,7 +138,7 @@ void Renderer::init(int width, int height) {
|
||||
depth_maps_cone.reinit();
|
||||
depth_maps_omni.reinit();
|
||||
resize(width, height);
|
||||
rend_mat.init(width, height);
|
||||
rend_mat.init(256, 256);
|
||||
rend_service.init(width, height);
|
||||
rend_selection.init(width, height);
|
||||
tone_proc.init();
|
||||
@@ -151,7 +153,7 @@ void Renderer::init(int width, int height) {
|
||||
|
||||
|
||||
void Renderer::resize(int width, int height) {
|
||||
rend_mat.resize(width, height);
|
||||
rend_mat.resize(256, 256);
|
||||
rend_service.resize(width, height);
|
||||
rend_selection.resize(width, height);
|
||||
fbo_ds.resize(width, height);
|
||||
@@ -244,6 +246,9 @@ void Renderer::initShaders() {
|
||||
prog->setUniformValue("tex_0", 0);
|
||||
prog->setUniformValue("tex_sum", 1);
|
||||
}
|
||||
if (bindShader(srRescale, &prog)) {
|
||||
prog->setUniformValue("tex_0", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -351,8 +356,8 @@ void Renderer::renderLight(int first_wr_buff, bool clear_only) {
|
||||
glClearFramebuffer(back, false);
|
||||
back = QColor(0, 0, 0, 0);
|
||||
if (clear_only) continue;
|
||||
setUniformCamera(prog, cam);
|
||||
setUniformViewCorners(prog, cam);
|
||||
setUniformCamera(prog, cam, true, fbo_ds.size());
|
||||
setUniformViewCorners(prog, cam, fbo_ds.size());
|
||||
prog->setUniformValue("lights_start", lights_start[pass.second]);
|
||||
prog->setUniformValue("lights_count", (int)cur_lights[pass.second].size());
|
||||
prog->setUniformValue("fog_color", color2vector(view->fogColor()) / 2.);
|
||||
@@ -571,7 +576,7 @@ void Renderer::renderScene() {
|
||||
glEnableDepth();
|
||||
glClearFramebuffer();
|
||||
if (bindShader(srGeometrySolidPass, &prog)) {
|
||||
setUniformCamera(prog, cam);
|
||||
setUniformCamera(prog, cam, true, fbo_ds.size());
|
||||
textures_empty.bind(f, tarEmpty);
|
||||
textures_maps.bind(f, tarMaps);
|
||||
prog->setUniformValue("out_index_normal", dbrNormalZSolid);
|
||||
@@ -600,7 +605,7 @@ void Renderer::renderScene() {
|
||||
glClearFramebuffer(Qt::black, false);
|
||||
fbo_ds.setWriteBuffers();
|
||||
if (bindShader(srGeometryTransparentPass, &prog)) {
|
||||
setUniformCamera(prog, cam);
|
||||
setUniformCamera(prog, cam, true, fbo_ds.size());
|
||||
textures_empty.bind(f, tarEmpty);
|
||||
textures_maps.bind(f, tarMaps);
|
||||
prog->setUniformValue("out_index_normal", dbrNormalZ);
|
||||
@@ -672,6 +677,7 @@ void Renderer::renderScene() {
|
||||
}
|
||||
|
||||
fbo_out.release();
|
||||
glViewport(0, 0, view->pixelWidth(), view->pixelHeight());
|
||||
|
||||
/// apply hovers and selection frame
|
||||
if (edit_mode) {
|
||||
@@ -680,7 +686,14 @@ void Renderer::renderScene() {
|
||||
rend_service.renderService();
|
||||
} else {
|
||||
phase.begin("blit to screen");
|
||||
fbo_out.blit(cur_write_plane, 0, 0, fbo_out.rect(), QRect(QPoint(), view->pixelSize()));
|
||||
if (fbo_out.rect() == view->pixelRect()) {
|
||||
fbo_out.blit(cur_write_plane, 0, 0, fbo_out.rect(), view->pixelRect());
|
||||
} else {
|
||||
if (bindShader(srRescale, &prog)) {
|
||||
fbo_out.bindColorTexture(cur_write_plane, 0);
|
||||
renderQuad(prog, quad);
|
||||
}
|
||||
}
|
||||
}
|
||||
phase.end();
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ class QGLENGINE_CORE_EXPORT Renderer: public RendererBase {
|
||||
srTonemapPass,
|
||||
srShadowConePass,
|
||||
srShadowOmniPass,
|
||||
srRescale
|
||||
};
|
||||
enum OutBufferRole {
|
||||
obrSolidOmni,
|
||||
|
||||
@@ -59,7 +59,7 @@ void RendererMaterial::init(int width, int height) {
|
||||
|
||||
void RendererMaterial::resize(int width, int height) {
|
||||
fbo_mat_thumb.enablePixelBuffer();
|
||||
fbo_mat_thumb.resize(256, 256);
|
||||
fbo_mat_thumb.resize(width, height);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
fbo_selection.setWriteBuffers();
|
||||
glEnableDepth();
|
||||
glClearFramebuffer(QColor(0, 0, 0, 0));
|
||||
r->setUniformCamera(prog, view->camera());
|
||||
r->setUniformCamera(prog, view->camera(), true, r->fbo_ds.size());
|
||||
r->renderObjects(scene, rpSolid);
|
||||
r->renderObjects(scene, rpTransparent);
|
||||
view->glClear(GL_DEPTH_BUFFER_BIT);
|
||||
@@ -138,10 +138,12 @@ void RendererSelection::renderSelection(Scene & scene) {
|
||||
rs.drawLights();
|
||||
rs.drawCameras();
|
||||
rs.drawCurrentHandleObjects();
|
||||
auto mapPoint = [this](QPoint p) { return (QPointF(p.x() * size_coeff.x(), p.y() * size_coeff.y()) * scale_).toPoint(); };
|
||||
auto mapSize = [this](QSize s) { return (QSizeF(s.width() * size_coeff.x(), s.height() * size_coeff.y()) * scale_).toSize(); };
|
||||
if (r->mouse_rect.isNull())
|
||||
fbo_selection.queryPoint(0, r->mouse_pos * scale_);
|
||||
fbo_selection.queryPoint(0, mapPoint(r->mouse_pos));
|
||||
else
|
||||
fbo_selection.queryPoints(0, QRect(r->mouse_rect.topLeft() * scale_, r->mouse_rect.size() * scale_));
|
||||
fbo_selection.queryPoints(0, QRect(mapPoint(r->mouse_rect.topLeft()), mapSize(r->mouse_rect.size())));
|
||||
|
||||
// qDebug() << id_hover;
|
||||
fbo_selection.bindColorTexture(sbrSrcHover, sbrSrcHover);
|
||||
|
||||
@@ -57,6 +57,7 @@ private:
|
||||
Framebuffer fbo_selection;
|
||||
Mesh * sel_frame;
|
||||
float line_thick_, scale_;
|
||||
QPointF size_coeff = {1., 1.};
|
||||
QVector<uchar> cur_selections_;
|
||||
QHash<uint, ObjectBase *> ids;
|
||||
QHash<uint, ObjectBase *> aim_ids;
|
||||
|
||||
@@ -474,7 +474,7 @@ void RendererService::renderService() {
|
||||
prog->setUniformValue("qgl_ProjMatrix", r->view->camera()->projectionMatrix(r->view->aspect));
|
||||
|
||||
/// lights
|
||||
r->setUniformCamera(prog, r->view->camera());
|
||||
r->setUniformCamera(prog, r->view->camera(), true, r->fbo_ds.size());
|
||||
|
||||
prog->setUniformValue("line_width", 2.f);
|
||||
prog->setUniformValue("z_offset", 0.f);
|
||||
@@ -486,7 +486,7 @@ void RendererService::renderService() {
|
||||
drawCamerasFrame(Qt::black);
|
||||
}
|
||||
if (r->bindShader(Renderer::srServiceLine, &prog)) {
|
||||
r->setUniformCamera(prog, r->view->camera());
|
||||
r->setUniformCamera(prog, r->view->camera(), true, r->fbo_ds.size());
|
||||
line_object.color = QColor2QVector(Qt::white);
|
||||
line_spot_f->loadObject(f, line_object);
|
||||
line_camera_f->loadObject(f, line_object);
|
||||
@@ -495,7 +495,7 @@ void RendererService::renderService() {
|
||||
}
|
||||
glEnable(GL_CULL_FACE);
|
||||
if (r->bindShader(Renderer::srServiceFill, &prog)) {
|
||||
r->setUniformCamera(prog, r->view->camera());
|
||||
r->setUniformCamera(prog, r->view->camera(), true, r->fbo_ds.size());
|
||||
|
||||
/// handles
|
||||
f->glEnable(GL_BLEND);
|
||||
@@ -504,13 +504,15 @@ void RendererService::renderService() {
|
||||
f->glDisable(GL_BLEND);
|
||||
|
||||
/// axis
|
||||
GLint prev_view[4];
|
||||
f->glGetIntegerv(GL_VIEWPORT, prev_view);
|
||||
f->glViewport(0, 0, axis_viewport.width(), axis_viewport.height());
|
||||
axis_camera->setPos(-r->view->camera()->direction() * 3.);
|
||||
axis_camera->setAim(QVector3D());
|
||||
axis_camera->setRotation(r->view->camera()->rotation());
|
||||
r->setUniformCamera(prog, axis_camera, true, axis_viewport);
|
||||
axis_mesh->draw(f, 3);
|
||||
f->glViewport(0, 0, r->view->pixelWidth(), r->view->pixelHeight());
|
||||
f->glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]);
|
||||
}
|
||||
f->glDisable(GL_MULTISAMPLE);
|
||||
}
|
||||
|
||||
@@ -16,5 +16,6 @@
|
||||
<file>../../shaders/service_line.glsl</file>
|
||||
<file>../../shaders/sum.glsl</file>
|
||||
<file>../../shaders/shadow.glsl</file>
|
||||
<file>../../shaders/rescale.glsl</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -103,7 +103,7 @@ void MouseController::mousePressEvent(QMouseEvent * e) {
|
||||
view->renderer_.mouse_rect = QRect();
|
||||
return;
|
||||
}
|
||||
if (!QRect(QPoint(), view->pixelSize()).contains(cpos)) return;
|
||||
if (!view->pixelRect().contains(cpos)) return;
|
||||
lastPos = cpos;
|
||||
downPos = cpos;
|
||||
emit view->glMousePressEvent(e);
|
||||
@@ -206,7 +206,7 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
QRect g_rect(QPoint(), view->pixelSize());
|
||||
QRect g_rect = view->pixelRect();
|
||||
if (mouseRotate_) {
|
||||
float dx = cpos.x() - lastPos.x();
|
||||
float dy = cpos.y() - lastPos.y();
|
||||
|
||||
@@ -81,6 +81,11 @@ QSize OpenGLWindow::pixelSize() const {
|
||||
}
|
||||
|
||||
|
||||
QRect OpenGLWindow::pixelRect() const {
|
||||
return QRect(0, 0, pixelWidth(), pixelHeight());
|
||||
}
|
||||
|
||||
|
||||
// void OpenGLWindow::setSamples(int samples) {
|
||||
// QSurfaceFormat f = requestedFormat();
|
||||
// if (f.samples() != samples) {
|
||||
|
||||
@@ -30,6 +30,7 @@ public:
|
||||
int pixelWidth() const;
|
||||
int pixelHeight() const;
|
||||
QSize pixelSize() const;
|
||||
QRect pixelRect() const;
|
||||
|
||||
public slots:
|
||||
void renderLater();
|
||||
|
||||
@@ -159,9 +159,13 @@ void QGLView::timerEvent(QTimerEvent *) {
|
||||
|
||||
|
||||
void QGLView::render() {
|
||||
resizeGL(pixelWidth(), pixelHeight());
|
||||
QSize render_size = pixelSize();
|
||||
if (framebuffer_size.isValid()) render_size = framebuffer_size;
|
||||
resizeGL(render_size.width(), render_size.height());
|
||||
emit glBeginPaint();
|
||||
renderer_.mouse_pos = mapFromGlobal(QCursor::pos()) * devicePixelRatio();
|
||||
QSizeF fbo_sz = renderer_.fbo_ds.size();
|
||||
renderer_.rend_selection.size_coeff = {double(fbo_sz.width()) / pixelWidth(), double(fbo_sz.height()) / pixelHeight()};
|
||||
renderer_.mouse_pos = mapFromGlobal(QCursor::pos()) * devicePixelRatio();
|
||||
renderer_.renderScene();
|
||||
emit glEndPaint();
|
||||
fps_tm = time.elapsed();
|
||||
|
||||
@@ -170,6 +170,10 @@ public:
|
||||
QSize shadowMapSize() const;
|
||||
QSize textureMapSize() const;
|
||||
|
||||
void setFramebufferSize(QSize sz) { framebuffer_size = sz; }
|
||||
void resetFramebufferSize() { framebuffer_size = QSize(); }
|
||||
QSize framebufferSize() const { return framebuffer_size; }
|
||||
|
||||
int softShadowsSamples() const { return soft_shadows_samples; }
|
||||
void setSoftShadowsSamples(int s) { soft_shadows_samples = s; }
|
||||
float softShadowsQuality() const { return soft_shadows_quality; }
|
||||
@@ -216,7 +220,7 @@ private:
|
||||
GLint max_anisotropic, max_texture_chanels;
|
||||
RenderMode render_mode;
|
||||
QFlags<Renderer::GrabFormat> grab_formats;
|
||||
QSize prev_size, shadow_map_size;
|
||||
QSize prev_size, shadow_map_size, framebuffer_size;
|
||||
float lineWidth_, soft_shadows_quality;
|
||||
float fps_, fps_tm, fogDensity_, fogDecay_;
|
||||
float hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor;
|
||||
|
||||
Reference in New Issue
Block a user