依然是参考openglwindow这个例子,
myglwidget.cpp
#include "myglwidget.h"
#include <QPainter>
#include <QPen>
#include <QDebug>
/*
* 最后摘录《编程指南》
* *********************************************
* 创建和编译着色器
* 第 1 步 创建着色器
* 第 2 步 提供着色器源码
* 第 3 步 编译
* 创建和链接项目
* 准备渲染
* *********************************************
* 着色器是 OpenGL ES 2.0 API 核心的基础。
* 每个 OpenGL ES 2.0程序要求一个顶点着色器和一个片段着色器去渲染一个图形
*/
MyGLWidget::MyGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
setWindowTitle("My OpenGL Widget");
resize(600, 400);
}
MyGLWidget::~MyGLWidget()
{
}
/* 1.1 着色器代码 */
/* *********************************************
* 摘录自 《编程指南》
* varying:
* 顶点着色器的输出叫做 varying 变量
* 在最初的光栅化阶段,这些变量被计算,作为片段着色器的输入,
* 从顶点着色器的矩阵使用插补的方法产生片段着色器的变量
*
* attribute:
* 在顶点着色器中,一个变量被使用限定词 attribute 声明为顶点属性
* 这个限定词仅仅在顶点着色器中使用
* 如果被用于片段着色器,片段着色器编译时将会产生错误
* ******************************************** */
/* 顶点着色器 */
static const char *vertexShaderSourceCore =
"#version 150\n"
"in vec4 vPosition;\n"
"attribute lowp vec4 a_color;\n"
"varying lowp vec4 v_color;\n"
"void main() {\n"
" v_color = a_color;\n"
" gl_Position = vPosition;\n"
"}\n";
/* 片段着色器 */
static const char *fragmentShaderSourceCore =
"#version 150\n"
"varying lowp vec4 v_color;\n"
"out highp vec4 fragColor;\n"
"void main() {\n"
" fragColor = v_color;\n"
"}\n";
void MyGLWidget::initializeGL()
{
qDebug("+++ initializeGL +++");
/* 0. 初始化函数,使得函数可以使用 */
initializeOpenGLFunctions();
/* 创建项目对象链接着色器 */
/* 1. 初始化最大的任务是装载顶点和片段着色器 */
program = new QOpenGLShaderProgram;
/* 1.2 加载 */
program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSourceCore);
program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSourceCore);
/* 1.3 传值 (这样说明,不知道合不合适) */ /* 错误说明 */
/* 1.3 设置属性位置,将vPosition属性设置为位置0 */
program->bindAttributeLocation("vPosition", 0);
/* 1.4 链接项目检查错误 */
program->link();
}
/* 2. 回调绘画 */
void MyGLWidget::paintGL()
{
/* 1.5 为使用项目对象去渲染,需要绑定 */
program->bind();
/* 2.1 viewport 设定窗口的原点 origin (x, y)、宽度和高度 */
glViewport(0, 0, width(), height());
/* 2.2 缓冲区将被用 glClearColor 函数的颜色参数值清除 */
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
/* 2.3 三角形顶点的坐标 */
GLfloat vVertices[] = {0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f};
/* 2.4 Load the vertex data */
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
/* 获取属性a_color的位置 */
GLuint a_color = program->attributeLocation("a_color");
GLfloat colors[] = {1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f};
/* 装载到a_color */
glVertexAttribPointer(a_color, 3, GL_FLOAT, GL_FALSE, 0, colors);
/* 使能 */
glEnableVertexAttribArray(a_color);
/* 最后一步是调用 OpenGL ES 去绘制基元 */
/* 使用 glDrawArrays 函数绘制三角形、直线或带状物等基元 */
glDrawArrays(GL_TRIANGLES, 0, 3);
program->release();
glFlush();
}
void MyGLWidget::resizeGL(int w ,int h)
{
p.setToIdentity();
p.perspective(35.0f, float(w)/float(h), 1.0f, 30.0f);
}
出来的颜色效果跟例子差不多,为什么会这样就不知道了