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

This commit is contained in:
2019-09-18 13:59:18 +00:00
parent b103b76f2d
commit 3766876655
6 changed files with 34 additions and 63 deletions

View File

@@ -20,7 +20,7 @@
#include "qglview.h"
const char qgl_vertex_head[] =
"in vec3 _qgl_Vertex;\n"
//"in vec3 _qgl_Vertex;\n"
"in vec3 qgl_Normal;\n"
"in vec3 qgl_Tangent;\n"
"in vec3 qgl_Bitangent;\n"
@@ -28,8 +28,9 @@ const char qgl_vertex_head[] =
"in vec4 qgl_Color;\n"
"out vec2 qgl_FragTexture;\n"
"out vec4 qgl_FragColor;\n"
"vec4 qgl_Vertex = vec4(_qgl_Vertex, 1.);\n"
"vec4 qgl_ftransform() {return qgl_ModelViewProjectionMatrix * qgl_Vertex;}\n";
//"vec4 qgl_Vertex = vec4(_qgl_Vertex, 1);\n"
"in vec3 qgl_Vertex;\n"
"vec4 qgl_ftransform() {return qgl_ModelViewProjectionMatrix * vec4(qgl_Vertex, 1);}\n";
const char qgl_fragment_head[] =
"in vec2 qgl_FragTexture;\n"

View File

@@ -53,51 +53,40 @@ QString findFile(const QString & file, const QStringList & pathes) {
}
void quadProgPoint(QOpenGLFunctions * glFuncs, QOpenGLShaderProgram * prog, QVector4D * corner_dirs,
GLfloat x, GLfloat y, GLfloat tx, GLfloat ty, int locv, int loct, int locc, int index) {
if (prog) {
if (corner_dirs)
prog->setAttributeValue(locc, corner_dirs[index]);
glFuncs->glVertexAttrib2f(loct, tx, ty);
glFuncs->glVertexAttrib2f(locv, x, y);
} else {
glTexCoord2f(tx, ty);
glVertex2f(x, y);
}
}
void glDrawQuad(QOpenGLShaderProgram * prog, QVector4D * corner_dirs, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
glResetAllTransforms();
glSetPolygonMode(GL_FILL);
int loc = prog ? prog->attributeLocation("qgl_Color") : 0,
locv = prog ? prog->attributeLocation("qgl_Vertex") : 0,
loct = prog ? prog->attributeLocation("qgl_Texture") : 0,
locc = prog ? prog->attributeLocation("view_corner") : 0;
int loc = prog ? prog->attributeLocation("qgl_Color") : -1,
locv = prog ? prog->attributeLocation("qgl_Vertex") : -1,
loct = prog ? prog->attributeLocation("qgl_Texture") : -1,
locc = prog ? prog->attributeLocation("view_corner") : -1;
if (prog) {
}
//if (prog)
//qDebug() << loc << locv << loct << locc;
glBegin(GL_QUADS);
QOpenGLFunctions *glFuncs = QOpenGLContext::currentContext()->functions();
if (prog) {
glFuncs->glVertexAttrib3f(loc, 1.f, 1.f, 1.f);
}
glColor3f(1.f, 1.f, 1.f);
if (prog) {
if (corner_dirs)
prog->setAttributeValue(locc, corner_dirs[0]);
glFuncs->glVertexAttrib2f(loct, 0.f, 0.f);
glFuncs->glVertexAttrib2f(locv, x, y);
}
glTexCoord2f(0.f, 0.f);
glVertex2f(x, y);
if (prog) {
if (corner_dirs)
prog->setAttributeValue(locc, corner_dirs[1]);
glFuncs->glVertexAttrib2f(loct, 1.f, 0.f);
glFuncs->glVertexAttrib2f(locv, x + w, y);
}
glTexCoord2f(1.f, 0.f);
glVertex2f(x + w, y);
if (prog) {
if (corner_dirs)
prog->setAttributeValue(locc, corner_dirs[2]);
glFuncs->glVertexAttrib2f(loct, 1.f, 1.f);
glFuncs->glVertexAttrib2f(locv, x + w, y + h);
}
glTexCoord2f(1.f, 1.f);
glVertex2f(x + w, y + h);
if (prog) {
if (corner_dirs)
prog->setAttributeValue(locc, corner_dirs[3]);
glFuncs->glVertexAttrib2f(loct, 0.f, 1.f);
glFuncs->glVertexAttrib2f(locv, x, y + h);
}
glTexCoord2f(0.f, 1.f);
glVertex2f(x, y + h);
quadProgPoint(glFuncs, prog, corner_dirs, x , y , 0.f, 0.f, locv, loct, locc, 0);
quadProgPoint(glFuncs, prog, corner_dirs, x+w, y , 1.f, 0.f, locv, loct, locc, 1);
quadProgPoint(glFuncs, prog, corner_dirs, x+w, y+h, 1.f, 1.f, locv, loct, locc, 2);
quadProgPoint(glFuncs, prog, corner_dirs, x , y+h, 0.f, 1.f, locv, loct, locc, 3);
glEnd();
}

View File

@@ -152,7 +152,7 @@ void GLVBO::draw(GLenum type, QOpenGLShaderProgram * prog, bool simplest) {
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
int loc = prog->attributeLocation("_qgl_Vertex");
int loc = prog->attributeLocation("qgl_Vertex");
glEnableVertexAttribArray(loc);
glVertexAttribPointer(loc, 3, GL_FLOAT, 0, 0, 0);
locs << loc;

View File

@@ -47,7 +47,7 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView
view->view()->setHoverHaloFillAlpha(0.);
view->view()->setSelectionHaloFillAlpha(0.);
view->view()->setBackColor(Qt::lightGray);
view->view()->setDepthStart(0.001);
view->view()->setDepthStart(0.1);
view->view()->setDepthEnd(100000.);
spinFOV->setValue(view->view()->FOV());

View File

@@ -63,37 +63,19 @@ void RendererSimple::renderScene() {
for (int l = 0; l < passes; ++l) {
if (passes > 1) fbo.setWriteBuffer(1);
if (l == 0) {
glClearFramebuffer(view.backColor());
glEnableDepth();
glClearFramebuffer(view.backColor());
} else {
glClearFramebuffer(Qt::black, false);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glDepthFunc(GL_EQUAL);
glClearFramebuffer(Qt::black, false);
}
//view.camera().apply(view.aspect);
rp.cam_offset_matrix = view.camera()->offsetMatrix();
rp.prepare();
setupLights(l, 8);
/*fbo_c.bind();
glClearFramebuffer();
//shader->bind(); /// WARNING
renderObjects(GLObjectBase::Solid, l, 0, true, view.isLightEnabled(), view.isFogEnabled());
//shader->release(); /// WARNING
if (QRect(QPoint(), fbo_c.size()).contains(mpos)) {
//qDebug() << mpos;
GLfloat data[4] = {0, 0, 0, 0};
glReadPixels(mpos.x(), fbo_c.height() - mpos.y(), 1, 1, GL_RGBA, GL_FLOAT, data);
//qDebug() << QVector3D(data[0], data[1], data[2]);
}
fbo_c.release();*/
//qDebug() << rp.viewproj_matrix << (getGLMatrix(GL_PROJECTION_MATRIX)*getGLMatrix(GL_MODELVIEW_MATRIX));
renderObjects(GLObjectBase::Solid, l, nullptr, true, view.isLightEnabled(), view.isFogEnabled());
//renderObjects(GLObjectBase::Solid, l, 0, true, true, view.isFogEnabled());
renderObjects(GLObjectBase::Transparent, l, nullptr, true, true, view.isFogEnabled());
if (passes > 1) {
glSetLightEnabled(false);
@@ -108,7 +90,6 @@ void RendererSimple::renderScene() {
}
if (view.isFeatureEnabled(QGLView::qglFXAA) || passes > 1) {
fbo.release();
//glClearFramebuffer();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo.colorTexture());
glSetLightEnabled(false);

View File

@@ -28,7 +28,7 @@ void main(void) {
qgl_FragTexture = qgl_Texture;
qgl_FragColor = qgl_Color;
//tp /= tp.w;
ppos = prev_ModelViewProjectioMatrix * qgl_Vertex;
ppos = prev_ModelViewProjectioMatrix * vec4(qgl_Vertex.xyz, 1);
//pos.w = pos.w;
//speed = tp - ppos;
//speed /= (abs(speed) + 1.);