如何使用glew

时间:2016-08-02 11:30:38

标签: c++ qt opengl

我试图在QGLWidget(Qt5.7)中渲染一个三角形,但由于某种原因,我无法在屏幕上显示三角形,只显示蓝色背景。

myapp.pro文件:

QT += core gui opengl

CONFIG += c++11

TARGET = myapp
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

INCLUDEPATH += ../../libs/glew/include

SOURCES += main.cpp \
    ../../libs/glew/src/glew.c \
    glwindow.cpp

HEADERS += \
    ../../libs/glew/include/GL/glew.h \
    glwindow.h

这是主要功能:

#include <QApplication>
#include <glwindow.h>

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  glwindow v;
  v.show();
  return app.exec();
}

窗口标题:

#include <QtOpenGL/QGLWidget>

class glwindow : public QGLWidget
{
public:
  glwindow();
protected:
  void initializeGL() override;
  void paintGL() override;
};

cpp文件:

#include <GL/glew.h>
#include <glwindow.h>

GLfloat vertices[] = {
  +0.0f, +1.0f,
  -1.0f, -1.0f,
  +1.0f, -1.0f
};

glwindow::glwindow()
{}

void setupGeometry()
{
  GLuint buffer_id;
  glGenBuffers(1, &buffer_id);
  glBindBuffer(GL_ARRAY_BUFFER, buffer_id);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  glEnableVertexAttribArray(0);
  glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
}

void glwindow::initializeGL()
{
  glewInit();
  setupGeometry();
}

void glwindow::paintGL()
{
  glClearColor(0.0, 0.0, 1.0, 1.0);
  glClear(GL_COLOR_BUFFER_BIT);

  glDrawArrays(GL_TRIANGLES, 0, 3);
}

更新1: 添加了着色器代码:

const GLchar *vs = "#version 150 // Specify which version of GLSL we are using."
                 "in  vec2 in_Position;"
                 "void main() "
                 "{"
                 "    gl_Position = vec4(in_Position.x, in_Position.y, 0.5, 1.0);"
                 "}";
const GLchar *fs = "#version 150 // Specify which version of GLSL we are using."
                 "precision highp float; // Video card drivers require this line to function properly"
                 "out vec4 fragColor;"
                 "void main()"
                 "{"
                 "    fragColor = vec4(1.0,1.0,1.0,1.0); //Set colour of each fragment to WHITE"
                 "}";

设置着色器的功能是:

void checkShader(GLuint ID)
{
  GLint compile_status = 0;
  glGetShaderiv(ID, GL_COMPILE_STATUS, &compile_status);
  if(compile_status != GL_TRUE)
    {
      GLint info_length;
      GLsizei buffer_size;
      glGetShaderiv(ID, GL_INFO_LOG_LENGTH, &info_length);
      GLchar *message = new GLchar[info_length];
      glGetShaderInfoLog(ID, info_length, &buffer_size, message);
      delete[] message;
    }
}

void initShader()
{
  GLuint program_id;
  GLuint vs_id, fs_id;

  vs_id = glCreateShader(GL_VERTEX_SHADER);
  fs_id = glCreateShader(GL_FRAGMENT_SHADER);

  const char *adapter[1];
  adapter[0] = vs;
  glShaderSource(vs_id, 1, adapter, 0);
  adapter[1] = fs;
  glShaderSource(fs_id, 1, adapter, 0);

  glCompileShader(vs_id);
  checkShader(vs_id);

  glCompileShader(fs_id);
  checkShader(fs_id);

  program_id = glCreateProgram();
  glAttachShader(program_id, vs_id);
  glAttachShader(program_id, fs_id);

  glLinkProgram(program_id);
  glUseProgram(program_id);
}

因此,init函数更改为

void glview::initializeGL()
{
  glewInit();
  initGeometry();
  initShader();
}

着色器初始化失败,并显示错误消息: (GLchar *)0x7efe21 \“:1(10):错误:不支持GLSL 1.50。支持的版本为:1.10,1.20,1.30,1.00 ES和3.00 ES \ n \”

1 个答案:

答案 0 :(得分:0)

Qt 5.7仅支持glsl 1.3.0。因此,如果ppl想要使用glsl 4.3,请尝试使用glfw或SDL。