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

This commit is contained in:
2019-12-06 10:27:33 +00:00
parent edfe165f90
commit fa5c3e9b3d
13 changed files with 209 additions and 57 deletions

View File

@@ -49,6 +49,7 @@ void Buffer::destroy(QOpenGLExtraFunctions * f) {
void Buffer::bind(QOpenGLExtraFunctions * f) {
//qDebug() << "bind" << target_ << buffer_;
f->glBindBuffer(target_, buffer_);
}

View File

@@ -43,6 +43,8 @@ public:
GLuint ID() const {return buffer_;}
GLenum usage() const {return usage_;}
GLenum target() const {return target_;}
void setTarget(GLenum t) {target_ = t;}
bool isInit() const {return buffer_ != 0;}
private:

View File

@@ -68,8 +68,8 @@ void Framebuffer::resize(int width, int height, bool force) {
for (int i = 0; i < colors.size(); ++i) {
deleteGLTexture(f, colors[i]);
createGLTexture(f, colors[i], width, height, color_formats[i], target_);
f->glTexParameteri(target_, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
f->glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
f->glTexParameteri(target_, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
f->glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
f->glTexParameteri(target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
f->glTexParameteri(target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
f->glTexParameteri(target_, GL_TEXTURE_MAX_LEVEL, 4);
@@ -102,8 +102,6 @@ void Framebuffer::resize(int width, int height, bool force) {
QImage Framebuffer::grab() const {
//glReadPixels(0, 0, wid, hei, GL_RGBA, );
//QImage ret();
return QImage();
}
@@ -114,12 +112,10 @@ void Framebuffer::queryPoint(int index, QPoint p) {
if (!rect().contains(p) || !pbo.isInit()) return;
f->glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
f->glReadBuffer(GL_COLOR_ATTACHMENT0 + index);
//QTime tm; tm.restart();
pbo.bind(f);
f->glReadPixels(p.x(), height() - p.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0);
pbo_queried = 1;
pbo.release(f);
//qDebug() << tm.elapsed();
}
@@ -130,12 +126,10 @@ void Framebuffer::queryPoints(int index, QRect rect_) {
if (rect_.isEmpty() || !pbo.isInit()) return;
f->glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
f->glReadBuffer(GL_COLOR_ATTACHMENT0 + index);
//QTime tm; tm.restart();
pbo.bind(f);
f->glReadPixels(rect_.x(), height() - rect_.bottom(), rect_.width(), rect_.height(), GL_RGBA, GL_UNSIGNED_BYTE, 0);
pbo_queried = rect_.width() * rect_.height();
pbo.release(f);
//qDebug() << tm.elapsed();
}
@@ -146,17 +140,13 @@ void Framebuffer::queryImage(int index) {
uint Framebuffer::getPoint() const {
if (!pbo.isInit() || (pbo_queried == 0)) return 0;
//QTime tm; tm.restart();
uint ret = 0;
pbo.bind(f);
//glClearError();
void * map = pbo.map(f, GL_MAP_READ_BIT, sizeof(uint));
//qDebug() << map << QString::number(glGetError(), 16);
if (map)
memcpy(&ret, map, sizeof(uint));
pbo.unmap(f);
pbo.release(f);
//qDebug() << tm.elapsed();
return ret;
}
@@ -165,16 +155,12 @@ QVector<uint> Framebuffer::getPoints() const {
QVector<uint> ret;
if (!pbo.isInit() || (pbo_queried == 0)) return ret;
ret.resize(pbo_queried);
//QTime tm; tm.restart();
pbo.bind(f);
//glClearError();
void * map = pbo.map(f, GL_MAP_READ_BIT, pbo_queried * sizeof(uint));
//qDebug() << map << QString::number(glGetError(), 16);
if (map)
memcpy(ret.data(), map, pbo_queried * sizeof(uint));
pbo.unmap(f);
pbo.release(f);
//qDebug() << tm.elapsed();
return ret;
}
@@ -184,16 +170,12 @@ QImage Framebuffer::getImage() const {
if (!pbo.isInit() || (pbo_queried == 0)) return ret;
ret = QImage(size(), QImage::Format_RGBA8888);
int bytes = width() * height() * 4;
//QTime tm; tm.restart();
pbo.bind(f);
//glClearError();
void * map = pbo.map(f, GL_MAP_READ_BIT, bytes);
//qDebug() << map << QString::number(glGetError(), 16);
if (map)
memcpy(ret.bits(), map, bytes);
pbo.unmap(f);
pbo.release(f);
//qDebug() << tm.elapsed();
return ret;
}
@@ -279,6 +261,13 @@ void Framebuffer::enablePixelBuffer() {
}
void Framebuffer::setColorTextureFiltering(int index, GLenum filter) {
bindColorTexture(index);
f->glTexParameteri(target_, GL_TEXTURE_MIN_FILTER, filter);
f->glTexParameteri(target_, GL_TEXTURE_MAG_FILTER, filter);
}
void Framebuffer::bindColorTexture(int index, int channel) {
if (index < 0 || index >= colors.size()) return;
f->glActiveTexture(GL_TEXTURE0 + channel);

View File

@@ -47,7 +47,7 @@ public:
QVector<uint> getPoints() const;
QImage getImage() const;
int queriedPoints() const {return pbo_queried;}
void blit(int index_from, GLuint fb_to, int index_to, QRect from, QRect to, GLbitfield mask = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST );
void blit(int index_from, GLuint fb_to, int index_to, QRect from, QRect to, GLbitfield mask = GL_COLOR_BUFFER_BIT, GLenum filter = GL_NEAREST);
void resize(int width, int height, bool force = false);
void bind();
@@ -59,6 +59,7 @@ public:
void unsetWriteBuffers();
//void setColorFormat(GLenum format) {color_format = format; is_changed = true;}
void enablePixelBuffer();
void setColorTextureFiltering(int index, GLenum filter);
void copyDepthFrom(GLuint tex) {;}
void bindColorTexture(int index, int channel = 0);

View File

@@ -24,24 +24,26 @@
using namespace QGLEngineShaders;
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, const QString & defs) {
bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QString & content, const QString & file, bool add_qgl, const QString & defs) {
if (type == 0 || content.isEmpty()) {
content.clear();
return true;
}
//qDebug() << "[QGLView] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ...";
switch (type) {
case QOpenGLShader::Fragment:
content.prepend(qgl_fragment_head);
content.prepend(qgl_uniform);
content.prepend(qgl_structs);
break;
case QOpenGLShader::Vertex :
content.prepend(qgl_vertex_head );
break;
case QOpenGLShader::Geometry:
content.prepend(qgl_geometry_head);
break;
if (add_qgl) {
switch (type) {
case QOpenGLShader::Fragment:
content.prepend(qgl_fragment_head);
content.prepend(qgl_uniform);
content.prepend(qgl_structs);
break;
case QOpenGLShader::Vertex :
content.prepend(qgl_vertex_head );
break;
case QOpenGLShader::Geometry:
content.prepend(qgl_geometry_head);
break;
}
}
content.prepend(defs);
content.prepend(qgl_common_head);
@@ -61,7 +63,7 @@ QString prepareDefines(const QStringList & defines) {
}
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, const QStringList & defines) {
bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, bool add_qgl, const QStringList & defines) {
if (!prog)
prog = new QOpenGLShaderProgram();
prog->removeAllShaders();
@@ -78,34 +80,34 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr
pl = line.trimmed().remove(' ').remove('\t').mid(2).toLower();
pl.chop(2);
if (pl == "vertex" || pl == "vert") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::Vertex;
continue;
}
if (pl == "fragment" || pl == "frag") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::Fragment;
continue;
}
if (pl == "geometry" || pl == "geom") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::Geometry;
continue;
}
if (pl == "tessellation_control") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::TessellationControl;
continue;
}
if (pl == "tessellation_evaluation") {
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
type = QOpenGLShader::TessellationEvaluation;
continue;
}
cur_shader.append("\n");
cur_shader.append(line);
}
if (!addShader(prog, type, cur_shader, file, defs)) return false;
if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false;
if (!prog->link()) {
qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log();
return false;

View File

@@ -23,7 +23,7 @@
namespace QGLEngineShaders {
bool loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, const QStringList & defines = QStringList());
bool loadShadersMulti(QOpenGLShaderProgram *& prog, const QString & file, bool add_qgl = true, const QStringList & defines = QStringList());
void setUniformMatrices(QOpenGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj = QMatrix4x4(), QMatrix4x4 prevview = QMatrix4x4());
void setUniformLights(QOpenGLShaderProgram * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, int shadow_start);

View File

@@ -26,7 +26,6 @@ const int max_lights = 64 ;
const char qgl_common_head[] =
"#version 400 core\n"
//"#extension GL_EXT_texture_aray: require\n"
"";
const char qgl_vertex_head[] =