PDA

View Full Version : QGLWidget won't display GL calls



Zamaster
8th March 2014, 19:24
This is sort of a branch off of another thread now that the problem has changed. I have successfully initialized an QGLWidget, verified that the shaders loaded and linked, and that the textures loaded and were bound correctly. Now my OpenGL code displays only the clear color and not my glDrawElements call. Here is the QGLWidget object code and my shaders:



#include "myglwidget.h"
#include <QDebug>
#include <QString>
#include <QVector3D>
#include <QVector2D>
#include "locale.h"

#define BACK_TILE_S 48

struct VertexData
{
QVector3D position;
QVector2D texCoord;
};

MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent)
{

}

MyGLWidget::~MyGLWidget(){
glDeleteBuffers(2, vboid);
}

void MyGLWidget::initializeGL(){
VertexData verts[] = {
{QVector3D(0, 0, 0), QVector2D(0, 0)},
{QVector3D(0, 1, 0), QVector2D(1, 0)},
{QVector3D(1, 0, 0), QVector2D(0, 1)},
{QVector3D(1, 1, 0), QVector2D(1, 1)}
};
GLushort indices[] = {
0, 1, 2, 3
};
initializeGLFunctions();


setlocale(LC_NUMERIC, "C");

default_prog.addShaderFromSourceFile(QGLShader::Ve rtex, ":/shaders/default.vert");
default_prog.addShaderFromSourceFile(QGLShader::Fr agment, ":/shaders/default.frag");
default_prog.link();

default_prog.bind(); // this is in initgl since this is the
// only shader we use... FOR NOW, therefore
// we dont have to do it elsewhere
setlocale(LC_ALL, "");

glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glEnable(GL_TEXTURE_2D);
// normally here we would have the QImage buffered up already
// and would bind as needed, but again, this is the only
// texture we use for now
back_texture = bindTexture(QImage(":/gfx/gfx/back.png"));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


glGenBuffers(2, vboid);

glBindBuffer(GL_ARRAY_BUFFER, vboid[0]);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(VertexData), verts, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboid[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * sizeof(GLushort), indices, GL_STATIC_DRAW);
glClearColor(1,0,0,1);
}

void MyGLWidget::paintGL(){
int texw;
int texh;
QMatrix4x4 proj;
QMatrix2x2 scale;
quintptr offset;
int vertexLoc;
int texcoordLoc;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
texw = (floor(width / ((double) BACK_TILE_S)) + 1);
texh = (floor(height / ((double) BACK_TILE_S)) + 1);

proj.setToIdentity();
proj.scale(texw * BACK_TILE_S, texh * BACK_TILE_S);
proj.ortho(0, width, 0, height, -1, 1);

scale.setToIdentity();
scale(0,0) = texw;
scale(1,1) = texh;

default_prog.setUniformValue("texScale", scale);
default_prog.setUniformValue("mvp_matrix", proj);
default_prog.setUniformValue("texture", 0);

glBindBuffer(GL_ARRAY_BUFFER, vboid[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboid[1]);

offset = 0;

vertexLoc = default_prog.attributeLocation("a_position");
default_prog.enableAttributeArray(vertexLoc);
glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void*) offset);

offset += sizeof(QVector3D);

texcoordLoc = default_prog.attributeLocation("a_texcoord");
default_prog.enableAttributeArray(texcoordLoc);
glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void*) offset);

glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
}


void MyGLWidget::resizeGL(int w, int h){
this->width = w;
this->height = h;
// glViewport(0, 0, w, h);
}


default.vert

#version 150

uniform mat4x4 mvp_matrix;
uniform mat2x2 texScale;

in vec4 a_position;
in vec2 a_texcoord;

out vec2 v_texcoord;

void main() {
v_texcoord = a_texcoord * texScale;
gl_Position = mvp_matrix * a_position;
}


default.frag

#version 150

uniform sampler2D texture;

in vec2 v_texcoord;

void main()
{
gl_FragColor = texture2D(texture, v_texcoord);
}