测试代码 thecanvas.cpp
#include "GLee.h"
#include <QtGui>
//#include <QtOpenGL>
#include <gl/glu.h>
//#include <glut.h>
#include "thecanvas.h"
GLfloat verts[8][3]={
{-1.0,-1.0,1.0},
{1.0,-1.0,1.0},
{1.0,1.0,1.0},
{-1.0,1.0,1.0},
{1.0,-1.0,-1.0},
{1.0,1.0,-1.0},
{-1.0,1.0,-1.0},
{-1.0,-1.0,-1.0}};
GLushort indexes[6][4]={
{0,1,2,3},
{1,4,5,2},
{4,7,6,5},
{7,0,3,6},
{2,5,6,3},
{0,1,4,7}};
GLuint dataOBVID; //顶点缓冲区对象
GLuint indexOBVID; //索引缓冲区对象
void RenderScene1(); //用顶点数组方式画立方体并用renderText()写文本。
void RenderScene2(); //用顶点缓冲区对象方式画立方体并用renderText()写文本。
TheCanvas::TheCanvas(QWidget *parent) :
QGLWidget(parent)
{
//本语句必须放这里,若放到initializeGL()会导致窗口不能正常关闭。
setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer | QGL::SampleBuffers));
timer=new QTimer(this);
timer->setInterval(10);
timer->setSingleShot(false);
connect(timer,SIGNAL(timeout()),this,SLOT(updateGL()));
}
TheCanvas::~TheCanvas()
{
glDeleteBuffers(1,&dataOBVID);
glDeleteBuffers(1,&indexOBVID);
}
void TheCanvas::initializeGL()
{
glClearColor(0.0f,0.0f,0.0f,1.0f);//设置glClear()函数使用的背景颜色
glShadeModel(GL_FLAT); //单调着色模式GL_FLAT用多边形最后一个顶点的颜色着色,不插值;光滑明暗处理GL_SMOOTH插值计算顶点间颜色
glEnable(GL_DEPTH_TEST); //启用深度测试(即Z缓冲)
//glEnable(GL_STENCIL_TEST); //启用模版缓冲测试
//glEnable(GL_CULL_FACE); //启用背面剔除模式
glEnable(GL_NORMALIZE); //让OpenGL自动把法向量规范化
glEnable(GL_MULTISAMPLE); //启动反走样
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//以线框模式绘制一切物体
//glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//支持双缓冲(在Qt中由setFormat代替了)
//--设置雾效------------------------------------------
glFogi(GL_FOG_MODE,GL_EXP);//设置雾方程(共三种方程:GL_LINEAR,GL_EXP,GL_EXP2)
GLfloat fogColor[4]={0.5,0.5,0.5,1.0};
glFogfv(GL_FOG_COLOR,fogColor); //设置雾的颜色
glFogf(GL_FOG_DENSITY,0.1f); //设置雾的浓度(默认1.0f)
glFogf(GL_FOG_START,600.0); //设置雾的起始位置
glFogf(GL_FOG_END,10000.0f); //设置雾的结束位置
glHint(GL_FOG_HINT,GL_DONT_CARE);//规定雾化的质量(GL_FASTEST:速度最快;GL_NICEST:最高质量;GL_DONT_CARE:对选项不做考虑)
//glEnable(GL_FOG); //打开雾效
glDisable(GL_FOG); //关闭雾效
//---------------------------------------------------
//---初始化顶点缓冲区对象------------------------------
glGenBuffers(1,&dataOBVID);
glBindBuffer(GL_ARRAY_BUFFER,dataOBVID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*8*3, verts, GL_STATIC_DRAW);
glGenBuffers(1,&indexOBVID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexOBVID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(GLfloat)*6*4,indexes,GL_STATIC_DRAW);
//--------------------------------------------------
}
void TheCanvas::paintGL()
{
//清除缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//RenderScene1();
RenderScene2();
if(!timer->isActive()) timer->start(); //开启计时器连续渲染
}
void RenderScene1()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY);
glTranslatef(0.0f,0.0,-10.0f);
glRotatef(15.0f,0.0,1.0,0.0);
glRotatef(15.0f,1.0,0.0,0.0);
glVertexPointer(3,GL_FLOAT,0,verts);
glDrawElements(GL_QUADS,6*4,GL_UNSIGNED_SHORT,indexes);
glDisableClientState(GL_VERTEX_ARRAY);
canvas->setFont(QFont("Times",14));
glColor3ub(178,0,0);
canvas->renderText(0,18,QString("AAAAAAAAAAA"));
}
void RenderScene2()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY);
glTranslatef(0.0f,0.0,-10.0f);
glRotatef(15.0f,0.0,1.0,0.0);
glRotatef(15.0f,1.0,0.0,0.0);
glBindBuffer(GL_ARRAY_BUFFER,dataOBVID);
glVertexPointer(3,GL_FLOAT,0,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexOBVID);
glVertexPointer(3,GL_FLOAT,0,0);
glDrawElements(GL_QUADS,6*4,GL_UNSIGNED_SHORT,0);
glDisableClientState(GL_VERTEX_ARRAY);
canvas->setFont(QFont("Times",14));
glColor3ub(178,0,0);
canvas->renderText(0,18,QString("AAAAAAAAAAA"));
}
void TheCanvas::resizeGL(int width, int height)
{
//根据窗口大小设置视口
glViewport(0,0,width,height);
//重置投影矩阵堆栈
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//建立裁减区域
/* GLfloat nRangle=100.0f;
if(width<=height){
glOrtho(-nRangle,nRangle,-nRangle*height/width,nRangle*height/width,
-nRangle,nRangle);
}else{
glOrtho(-nRangle*width/height,nRangle*width/height,-nRangle,nRangle,
-nRangle,nRangle);
}
*/
GLfloat xRatio=GLfloat(width)/height;
//glFrustum(-xRatio,+xRatio,-1.0,+1.0,0.0,150.0);
gluPerspective(60.0,xRatio,1.0,1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}