1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include "glwidget.h"
#include <QDebug>
GLWidget::GLWidget(QWidget *parent)
: QGLWidget(parent),
_uniformBuffer((QGLBuffer::Type)GL_UNIFORM_BUFFER)
{
}
GLWidget::~GLWidget()
{
delete _shader;
}
void GLWidget::initializeGL()
{
_shader = new QGLShaderProgram(context(), this);
_shader->addShaderFromSourceFile(QGLShader::Vertex, ":/glsl.vert");
_shader->addShaderFromSourceFile(QGLShader::Fragment, ":/glsl.frag");
_shader->bindAttributeLocation("vertex", 0);
_shader->link();
_shader->bind();
const QGLContext *ctx = context();
PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = 0;
PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = 0;
glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) ctx->getProcAddress("glGetUniformBlockIndex");
glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) ctx->getProcAddress("glUniformBlockBinding");
if (glGetUniformBlockIndex == 0 || glUniformBlockBinding == 0)
qDebug("ERROR getProcAddress");
GLuint uniformIndex = glGetUniformBlockIndex(_shader->programId(), "test");
qDebug() << uniformIndex << (glGetError() == GL_NO_ERROR);
static GLfloat const triangleColors[] = {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f
};
_uniformBuffer.create();
_uniformBuffer.bind();
_uniformBuffer.allocate(triangleColors, 3 * 4 * sizeof (GLfloat));
glUniformBlockBinding(_shader->programId(), uniformIndex, 0);
_uniformBuffer.release();
}
void GLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
static GLfloat const triangleVertices[] = {
0.0, 1.0, 0.0, 1.0,
-1.0, 0.0, 0.0, 1.0,
1.0, -1.0, 0.0, 1.0,
};
_shader->setAttributeArray(0, triangleVertices, 4);
_shader->enableAttributeArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
_shader->disableAttributeArray(0);
} |
Partager