I’m following QQuickFramebufferObject example and now I’m editing logorenderer class to render single texture that rotates in 3D and it only renders black square. Could you help me, please? Thank you.
My code:
logorenderer.cpp
#include "logorenderer.h"
#include <QDebug>
LogoRenderer::LogoRenderer()
{
}
LogoRenderer::~LogoRenderer()
{
}
void LogoRenderer::paintQtLogo()
{
program1.enableAttributeArray(vertexAttr);
program1.enableAttributeArray(positionAttr);
program1.setAttributeArray(vertexAttr, vertices.constData());
program1.setAttributeArray(positionAttr, positions.constData());
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
program1.disableAttributeArray(vertexAttr);
program1.disableAttributeArray(positionAttr);
}
void LogoRenderer::initialize()
{
initializeGLFunctions();
glClearColor(0.1f, 0.1f, 0.2f, 1.0f);
QOpenGLShader *vshader1 = new QOpenGLShader(QOpenGLShader::Vertex, &program1);
const char *vsrc1 =
"attribute vec4 vertex;\n"
"uniform mat4 matrix;\n"
"attribute vec2 position;\n"
"varying vec2 texcoord;\n"
"void main(void)"
"{"
" texcoord = position;"
" gl_Position = matrix * vertex;"
"}";
vshader1->compileSourceCode(vsrc1);
QOpenGLShader *fshader1 = new QOpenGLShader(QOpenGLShader::Fragment, &program1);
const char *fsrc1 =
"uniform sampler2D tex;\n"
"varying vec2 texcoord;"
"void main()"
"{"
" gl_FragColor = texture2D(tex, texcoord);"
//" gl_FragColor = vec4(texcoord.x,texcoord.y,0,1);"
"}";;
fshader1->compileSourceCode(fsrc1);
program1.addShader(vshader1);
program1.addShader(fshader1);
program1.link();
vertexAttr = program1.attributeLocation("vertex");
matrixUniform1 = program1.uniformLocation("matrix");
positionAttr = program1.attributeLocation("position");
textureUniform = program1.uniformLocation("tex");
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
m_fAngle = 0;
createGeometry();
loadTexture(QString::fromUtf8("://img/texture.png"), backgroundID);
}
void LogoRenderer::render()
{
glDepthMask(true);
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glFrontFace(GL_CW);
glCullFace(GL_FRONT);
glEnable(GL_DEPTH_TEST);
QMatrix4x4 modelview;
modelview.rotate(m_fAngle, 0.0f, 1.0f, 0.0f);
modelview.rotate(10, 1.0f, 0.0f, 0.0f);
modelview.rotate(10, 0.0f, 1.0f, 0.0f);
program1.bind();
program1.setUniformValue(matrixUniform1, modelview);
program1.setUniformValue(textureUniform, backgroundID);
paintQtLogo();
program1.release();
glDisable(GL_DEPTH_TEST);
m_fAngle += 2.0f;
}
void LogoRenderer::createGeometry()
{
vertices.clear();
quad(QVector3D(-.5, -.5, -.5),
QVector3D(.5, -.5, -.5),
QVector3D(.5, .5, -.5),
QVector3D(-.5, .5, -.5));
positions << QVector2D(0,0);
positions << QVector2D(1,0);
positions << QVector2D(1,1);
positions << QVector2D(1,0);
positions << QVector2D(1,1);
positions << QVector2D(0,1);
}
void LogoRenderer::quad(QVector3D p1, QVector3D p2, QVector3D p3, QVector3D p4)
{
vertices << p1;
vertices << p2;
vertices << p3;
vertices << p1;
vertices << p3;
vertices << p4;
}
void LogoRenderer::loadTexture(QString filename, GLuint &textureID)
{
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
QImage im(filename);
QImage tex = QGLWidget::convertToGLFormat(im);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
glDisable(GL_TEXTURE_2D);
}
logorenderer.h
#ifndef LOGORENDERER_H
#define LOGORENDERER_H
#include <QtGui/qvector3d.h>
#include <QtGui/qmatrix4x4.h>
#include <QtGui/qopenglshaderprogram.h>
#include <QVector>
#include <QGLFunctions>
class LogoRenderer: private QGLFunctions {
public:
LogoRenderer();
~LogoRenderer();
void render();
void initialize();
private:
qreal m_fAngle;
void paintQtLogo();
void createGeometry();
void quad(QVector3D p1, QVector3D p2, QVector3D p3, QVector3D p4);
void loadTexture (QString filename, GLuint &textureID);
QVector<QVector3D> vertices;
QVector<QVector2D> positions;
QOpenGLShaderProgram program1;
int vertexAttr;
int matrixUniform1;
int positionAttr;
int textureUniform;
GLuint backgroundID;
};
#endif
↧