История изменений
Исправление KivApple, (текущая версия) :
Добавил шейдеры, они не компилировались, потому что конкретно OpenGL 3.3 оно не хотело, только другие версии. Изменил версию OpenGL в шейдере на OpenGL 3.0 ES, оно начало ругаться, что не указана точность для vec3 в фрагментном шейдере. Поставил точность meduim. И наконец-то получился красный треугольник. Код получился таким:
class ImuStateWidget : public QOpenGLWidget
{
public:
ImuStateWidget(QWidget *parent);
~ImuStateWidget();
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
private:
GLuint vertex_buffer;
GLuint program;
};
ImuStateWidget::ImuStateWidget(QWidget *parent = 0) : QOpenGLWidget(parent)
{
// Nothing to do
}
ImuStateWidget::~ImuStateWidget()
{
// Nothing to do
}
void ImuStateWidget::initializeGL() {
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClearColor(0.0, 0.0, 0.0, 1.0);
GLuint vertex_shader = f->glCreateShader(GL_VERTEX_SHADER);
GLuint fragment_shader = f->glCreateShader(GL_FRAGMENT_SHADER);
static const char vertex_shader_src[] = "#version 300 es\nlayout(location = 0) in vec3 vertexPosition_modelspace;\nvoid main(){\ngl_Position.xyz = vertexPosition_modelspace;\ngl_Position.w = 1.0;\n}\n";
static const char fragment_shader_src[] = "#version 300 es\nout mediump vec3 color;\nvoid main(){\ncolor = vec3(1,0,0);\n}\n";
static const char *vertex_shader_src_ptr = vertex_shader_src;
static const char *fragment_shader_src_ptr = fragment_shader_src;
f->glShaderSource(vertex_shader, 1, &vertex_shader_src_ptr, NULL);
f->glCompileShader(vertex_shader);
{
GLint len;
f->glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &len);
char log[len];
f->glGetShaderInfoLog(vertex_shader, len, NULL, log);
qDebug() << "Vertex shader compile log:";
qDebug() << log;
}
f->glShaderSource(fragment_shader, 1, &fragment_shader_src_ptr, NULL);
f->glCompileShader(fragment_shader);
{
GLint len;
f->glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &len);
char log[len];
f->glGetShaderInfoLog(fragment_shader, len, NULL, log);
qDebug() << "Fragment shader compile log:";
qDebug() << log;
}
program = f->glCreateProgram();
f->glAttachShader(program, vertex_shader);
f->glAttachShader(program, fragment_shader);
f->glLinkProgram(program);
{
GLint len;
f->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
char log[len];
f->glGetProgramInfoLog(program, len, NULL, log);
qDebug() << "Program compile log:";
qDebug() << log;
}
f->glDeleteShader(vertex_shader);
f->glDeleteShader(fragment_shader);
static const GLfloat vertex_buffer_data[] = {
0.0, 0.8, 0.0,
-0.8, -0.8, 0.0,
0.8, -0.8, 0.0
};
f->glGenBuffers(1, &vertex_buffer);
f->glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
f->glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STATIC_DRAW);
}
void ImuStateWidget::resizeGL(int w, int h) {
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glViewport(0, 0, w, h);
}
void ImuStateWidget::paintGL() {
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
f->glUseProgram(program);
f->glEnableVertexAttribArray(0);
f->glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
f->glDrawArrays(GL_TRIANGLES, 0, 3);
f->glDisableVertexAttribArray(0);
}
Конечно, теперь я в некотором замешательстве после моего прошлого опыта работы с OpenGL, когда мне хватало glBegin, glEnd, glColor и glVertex.
Исходная версия KivApple, :
Добавил шейдеры, они не компилировались, потому что конкретно OpenGL 3.3 оно не хотело, только другие версии. Изменил версию OpenGL в шейдере на OpenGL 3.0 ES, оно начало ругаться, что не указана точность для vec3 в фрагментном шейдере. Поставил точность meduim. И наконец-то получился красный треугольник. Код получился таким:
class ImuStateWidget : public QOpenGLWidget
{
public:
ImuStateWidget(QWidget *parent);
~ImuStateWidget();
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
private:
GLuint vertex_buffer;
GLuint program;
};
ImuStateWidget::ImuStateWidget(QWidget *parent = 0) : QOpenGLWidget(parent)
{
// Nothing to do
}
ImuStateWidget::~ImuStateWidget()
{
// Nothing to do
}
void ImuStateWidget::initializeGL() {
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClearColor(0.0, 0.0, 0.0, 1.0);
GLuint vertex_shader = f->glCreateShader(GL_VERTEX_SHADER);
GLuint fragment_shader = f->glCreateShader(GL_FRAGMENT_SHADER);
static const char vertex_shader_src[] = "#version 300 es\nlayout(location = 0) in vec3 vertexPosition_modelspace;\nvoid main(){\ngl_Position.xyz = vertexPosition_modelspace;\ngl_Position.w = 1.0;\n}\n";
static const char fragment_shader_src[] = "#version 300 es\nout mediump vec3 color;\nvoid main(){\ncolor = vec3(1,0,0);\n}\n";
static const char *vertex_shader_src_ptr = vertex_shader_src;
static const char *fragment_shader_src_ptr = fragment_shader_src;
f->glShaderSource(vertex_shader, 1, &vertex_shader_src_ptr, NULL);
f->glCompileShader(vertex_shader);
{
GLint len;
f->glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &len);
char log[len];
f->glGetShaderInfoLog(vertex_shader, len, NULL, log);
qDebug() << "Vertex shader compile log:";
qDebug() << log;
}
f->glShaderSource(fragment_shader, 1, &fragment_shader_src_ptr, NULL);
f->glCompileShader(fragment_shader);
{
GLint len;
f->glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &len);
char log[len];
f->glGetShaderInfoLog(fragment_shader, len, NULL, log);
qDebug() << "Fragment shader compile log:";
qDebug() << log;
}
program = f->glCreateProgram();
f->glAttachShader(program, vertex_shader);
f->glAttachShader(program, fragment_shader);
f->glLinkProgram(program);
{
GLint len;
f->glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
char log[len];
f->glGetProgramInfoLog(program, len, NULL, log);
qDebug() << "Program compile log:";
qDebug() << log;
}
f->glDeleteShader(vertex_shader);
f->glDeleteShader(fragment_shader);
static const GLfloat vertex_buffer_data[] = {
0.0, 0.8, 0.0,
-0.8, -0.8, 0.0,
0.8, -0.8, 0.0
};
f->glGenBuffers(1, &vertex_buffer);
f->glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
f->glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STATIC_DRAW);
}
void ImuStateWidget::resizeGL(int w, int h) {
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glViewport(0, 0, w, h);
}
void ImuStateWidget::paintGL() {
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
f->glUseProgram(program);
f->glEnableVertexAttribArray(0);
f->glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
f->glDrawArrays(GL_TRIANGLES, 0, 3);
f->glDisableVertexAttribArray(0);
}