第二个QOpenGLWidget程序修改版

      依然是参考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);
}


      出来的颜色效果跟例子差不多,为什么会这样就不知道了



你可能感兴趣的:(第二个QOpenGLWidget程序修改版)