QT+OPenGL绘图例子
qt实现菜单功能和绘图功能的调用程序运行结果图片

qt实现菜单功能和绘图功能的调用程序运行结果图片我可以为您提供一份示例代码,帮助您实现菜单和绘图功能的调用程序。
以下是一个简单的Qt示例程序:```cpp#include <QtWidgets>class MyWidget : public QWidget {public:MyWidget(QWidget *parent = nullptr) : QWidget(parent) { }protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);painter.setPen(Qt::black);painter.setBrush(Qt::red);painter.drawRect(50, 50, 100, 100);}};int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow mainWindow;QMenu *menu = new QMenu("Menu");QAction *action = new QAction("Draw Rectangle", &mainWindow);menu->addAction(action);mainWindow.menuBar()->addMenu(menu);MyWidget *widget = new MyWidget(&mainWindow);mainWindow.setCentralWidget(widget);QObject::connect(action, &QAction::triggered, widget, [&]() {widget->update();});mainWindow.show();return app.exec();}```这是一个基本的Qt应用程序,它创建了一个主窗口,包含一个菜单和一个绘图区域。
《QTCreator快速入门》第十二章:3D绘图

《QTCreator快速⼊门》第⼗⼆章:3D绘图OpenGL是⼀套跨平台的⽤来渲染3D图形的API。
OpenGL⾃⾝是⼀个巨⼤的状态机:⼀系列的变量描述OpenGL此刻应当如何运⾏,OpenGL的状态通常被称为OpenGL上下⽂(Context)。
我们通常使⽤如下途径去更改OpenGL状态:设置选项,操作缓冲,最后,我们使⽤当前OpenGL上下⽂来渲染。
假设当我们想告诉OpenGL去画线段⽽不是三⾓形的时候,我们通过改变⼀些上下⽂变量来改变OpenGL状态,从⽽告诉OpenGL如何去绘图。
⼀旦我们改变了OpenGL的状态为绘制线段,下⼀个绘制命令就会画出线段⽽不是三⾓形。
当使⽤OpenGL的时候,我们会遇到⼀些状态设置函数,这类函数将会改变上下⽂。
以及状态使⽤函数,这类函数会根据当前OpenGL的状态执⾏⼀些操作。
⽐如下⾯例⼦中的glClearColor()函数是⼀个状态设置函数,⽽glClear()函数则是⼀个状态使⽤的函数,它使⽤了当前的状态来获取应该清除为的颜⾊。
Qt中的QtOpenGL模块提供了使⽤OpenGL的⽅法,使⽤它需要在.pro项⽬⽂件中添加QT+=opengl。
QGLWidget是QtOpenGL模块中的⼀个类,它是⼀个⽤来渲染OpenGL图形的部件,可以继承该类后来像使⽤其它QWidget部件⼀样使⽤它。
QGLWidget提供了3个虚函数重写它们来实现指定操作:initializeGL():设置OpenGL渲染环境,定义显⽰列表等,只在resizeGL()、paintGL()之前被调⽤⼀次。
resizeGL():设置OpenGL的视⼝,投影等,部件⼤⼩改变的时候被调⽤。
paintGL():渲染OpenGL场景,当部件需要更新时被调⽤。
Qt中有⼀个Hello GL⽰例程序,它在OpenGL分类中。
1、基本绘制下⾯代码使⽤QGLWidget绘制了⼀个直线、三⾓形、⽂本,其中的MyGLWidget继承⾃QGLWidget:#include <QApplication>#include "myglwidget.h"int main(int argc, char**argv){QApplication app(argc, argv);MyGLWidget w;w.resize(600, 400);w.show();return app.exec();}View Code#ifndef MYGLWIDGET_H#define MYGLWIDGET_H#include <QGLWidget>#include <GL/glu.h>class MyGLWidget: public QGLWidget{void initializeGL(){//void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);glClearColor(1.0, 0.0, 0.0, 0.0); //设置清除屏幕(glClear()⽅法)时使⽤的颜⾊为红⾊glShadeModel(GL_SMOOTH); //设置阴影平滑//void glClearDepth(GLclampd depth);glClearDepth(1.0); //设置深度缓存(深度缓冲区中每个像素需要的值)glEnable(GL_DEPTH_TEST); //启⽤深度测试功能,根据坐标的远近⾃动隐藏被遮住的图形(材料)}void resizeGL(int w, int h){//设置视⼝的⼤⼩:告诉OpenGL渲染窗⼝的尺⼨⼤⼩//也可以将视⼝的维度设置为⽐窗⼝的维度⼩,这样OpenGL渲染将会在⼀个⼩窗⼝中显⽰,这样⼦我们也可以将⼀些其它元素显⽰在OpenGL视⼝之外glViewport(0, 0, (GLint)w, (GLint)h);glMatrixMode(GL_PROJECTION); //投影矩阵模式glLoadIdentity(); //重置当前指定的矩阵为单位矩阵,这样可以将矩阵恢复到初始状态。
使用qwtplot3d实现三维曲线、轨迹绘制的例子

一、概述在科学研究、工程技术和数据可视化等领域,三维曲线和轨迹的绘制是一项非常重要的任务。
通过可视化三维曲线和轨迹,可以更直观地展现数据之间的关联和趋势,进而帮助人们更深入地理解数据的特征和规律。
QwtPlot3D是一个强大的开源三维数据可视化库,它能够方便、快捷地实现三维曲线和轨迹的绘制,为研究人员和工程师提供了很大的便利。
二、QwtPlot3D简介QwtPlot3D是一个基于Qt和OpenGL的数据可视化库,它提供了丰富的API和功能,用于绘制各种类型的三维图形。
QwtPlot3D支持绘制曲线、散点图、网格图、表面图等多种图形,并提供了灵活的交互和定制能力。
三、QwtPlot3D的安装与配置1. 下载QwtPlot3D库需要从冠方全球信息站或源代码仓库下载QwtPlot3D的最新版本,并解压到本地目录。
2. 配置Qt环境在使用QwtPlot3D之前,需要先配置好Qt开发环境,并确保能够顺利编译和运行基本的Qt程序。
3. 编译和安装QwtPlot3D进入QwtPlot3D的源代码目录,按照README文件中的指引进行编译和安装。
通常情况下,只需要执行几条简单的命令即可完成编译和安装过程。
四、使用QwtPlot3D绘制三维曲线以下是一个使用QwtPlot3D绘制三维曲线的简单示例,演示了如何使用QwtPlot3D库创建一个简单的三维曲线图。
```cpp#include <qwt3d_surfaceplot.h>int m本人n(int argc, char *argv[]){// 创建一个Qwt3D::SurfacePlot对象Qwt3D::SurfacePlot plot;// 设置绘图区域的大小plot.create();// 设置曲线的数据点Qwt3D::TripleVector data;for (double x = -1.0; x <= 1.0; x += 0.1) {for (double y = -1.0; y <= 1.0; y += 0.1) {double z = sin(x * y);data.push_back(Qwt3D::Triple(x, y, z));}}// 添加曲线数据并绘制plot.setCoordinateStyle(Qwt3D::BOX);plot.setData(data);plot.makeCurrent();plot.updateData();return 0;}```五、使用QwtPlot3D绘制三维轨迹除了绘制三维曲线,QwtPlot3D还能够绘制三维轨迹,下面是一个使用QwtPlot3D绘制三维轨迹的简单示例。
osgqopenglwidget用法

osgqopenglwidget用法osgQtOpenGLWidget是OpenSceneGraph(OSG)库与Qt框架结合的一个小部件,用于在Qt应用程序中显示和渲染3D图形。
下面是osgQtOpenGLWidget的用法示例:1. 首先,确保你的项目已经正确设置了OpenSceneGraph和Qt的依赖关系。
2. 在你的Qt应用程序中创建一个Qt窗口或对话框,用于放置osgQtOpenGLWidget 小部件。
3. 在你的窗口或对话框的头文件中引入osgQtOpenGLWidget的头文件:```cpp#include <osgQt/GraphicsWindowQt>#include <osgViewer/Viewer>#include <osgViewer/ViewerEventHandlers>```4. 创建一个osgViewer::Viewer对象和一个osgQt::GraphicsWindowQt对象:```cpposg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;QWidget* container = new QWidget(this);osgQt::GraphicsWindowQt* graphicsWindow = newosgQt::GraphicsWindowQt(container);```5. 在容器窗口中设置layout,并将osgQtOpenGLWidget添加到layout中:```cppQVBoxLayout* layout = new QVBoxLayout;layout->addWidget(graphicsWindow->getGLWidget());container->setLayout(layout);```6. 创建一个osg::Node对象,它代表你想要渲染的3D场景,例如一个模型或一个场景图。
Qt+OpenGL教程

Qt OpenGL教程Qt OpenGL的准备工作第三课:上色第四课:旋转第一课:创建一个OpenGL窗口第二课:你的第一个多边形第五课:向三维进军第六课:纹理映射第七课:纹理滤波、光源和键盘控制第八课:融合第九课:在三维空间中移动位图第十课:载入一个三维世界并在其中移动第十一课:旗的效果(波动纹理)第十二课:显示列表第十三课:位图字体第十四课:轮廓字体第十五课:使用纹理映射的轮廓字体第十六课:看起来很棒的雾因为本教程是从NeHe的OpenGL教程迁移过来的,代码变为Qt实现的。
所以有的课程一时还没有实现成功,所以可能有些教程是跳跃的。
因本人时间有限,所以难免有错误出现,如果您发现了这些错误,或者有什么建议,请来信指教,谢谢。
Qt OpenGL的准备工作因为Qt存在很多版本,另外它支持的平台也很多,到目前为止我只实验了几个组合,所以就先把这些列出来吧,欢迎大家补充。
Unix/X11LinuxQt:自由版或者企业版都支持OpenGL模块,而专业版则不能。
我现在使用的是3.1.0自由版和企业版。
gcc:编译器。
我现在使用的是3.2。
X:Linux下的图形环境。
我现在使用的是4.2.0。
Mesa:自由的OpenGL。
我现在使用的是5.0。
WindowsQt:企业版支持OpenGL模块,而专业版则不能。
我现在使用的是3.1.0企业版。
Microsoft Visual Studio:编译器。
我现在使用的是6.0。
创建一个OpenGL窗口我假设您对Qt编程已经有了一定的了解,如果您还没有熟悉Qt编程,建议您先学习一下Qt编程的基础知识。
Qt中已经包含了OpenGL模块,具体情况您可以参考Qt OpenGL模块的相关内容。
NeHeWidget类这就是我们继承QGLWidget类得到的OpenGL窗口部件类。
(由nehewidget.h展开。
)#include <qgl.h>class NeHeWidget : public QGLWidget{Q_OBJECT因为QGLWidget类被包含在qgl.h头文件中,所以我们的类就需要包含这个头文件。
OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)

OpenGL_Qt学习笔记之_02(绘制简单平⾯⼏何图形)本⽂来讲讲怎样使⽤opengl来画平⾯⼏何图形,这⼀节本来是很简单的,因为某些问题都弄⼤半天了。
当然,这还是按照NeHe的教程来的学习的。
这次实现的功能是在窗⼝中画⼀个三⾓形,⼀个矩形,⼀个圆形。
⾸先来简单的看⼀下opengl中的基本坐标规则,如下图所⽰:假设左下⾓那个点是⼈的眼睛观察的位置,则向左为x正⽅向,向上为y的正⽅向(这点与opencv中不同),向⾥为z的正⽅向。
下⾯来看看怎么绘制平⾯⼏何图形。
在设置好需要画的⼏何图形的属性后,⽐如颜⾊信息,就以glBegin()开始,以glEnd()结束,glBegin()中的参数为所画⼏何图形的类型,⽐如说GL_ TRIANGLES代表三⾓形,GL_QUADS为矩形等等。
在glBegin()和glEnd()之间是放的点,这⾥是三维的点,这些点是对应所画矩形的类型的。
画圆的话稍微⿇烦⼀点,因为opengl中没有直接对应的类型,⼀般都是采⽤三⾓形来逼近,其它很多⼏何图形也是类似的。
在⽤三⾓形逼近时,是⽤的画连续三⾓形,⼀般有2种类型。
GL_TRIANGLE_STRIP和GL_TRIANGLE_PAN,这2者的区别⾸先来看个⽰意图:如果给定有顺序的点v0,v1,v2,v3,v4,v5,则采⽤GL_TRIANGLE_STRIP模式时,所画的连续三⾓形应该依次为:(v0,v1,v2),(v1, v2, v3), (v2, v3, v4),(v3, v4, v5);如果采⽤的是GL_TRIANGLE_PAN模式,则第⼀个点是固定的,且后⾯每次都要跳⼀个顶点,所以它的结果为(v0, v1, v2), (v0, v2, v3), (v0, v3, v4),(v0, v4, v5)。
因此我这⾥要画圆盘的话,就采⽤的GL_TRIANGLE_PAN模式了,⼤家可以⼿动画⼀下就知道,具体可以参考后⾯给出的代码。
每次绘⼀个⼏何图形,都会移动当前的焦点,采⽤的函数是glTranslatef,⽽⽹上的教程给该函数的参数时,都是类似这样的glTranslatef(-1.5f, 0.0f, -6.0f);NeHe的教程中也是⼀样,他的解释是移动多少个单位,⽐如说-1.5f就是向左移动1.5个单位,我⼀开始也在程序中这么弄,结果调试了4个多⼩时,就是不显⽰三⾓形,在⽹上找了很多⽅法,都试过了还不⾏。
第16讲Opengl真实感绘制编程实例

实例一 光照 实例二 加载3D世界
电子与信息工程学院 计算机科学与技术系
实例一 光照编程实例
加入光照
电子与信息工程学院 计算机科学与技术系
光照编程实例
使用键盘移动场景中的对象
电子与信息工程学院 计算机科学与技术系
光照编程实例
#include <windows.h> // Windows的头文件 #include <stdio.h> // 标准输入/输出的头文件 #include <gl\gl.h> // OpenGL32库的头文件 #include <gl\glu.h> // GLu32库的头文件 #include <gl\glaux.h> // GLaux库的头文件 HDC hDC=NULL; // 私有GDI设备描述表 HGLRC hRC=NULL; // 永久着色描述表 HWND hWnd=NULL; // 保存我们的窗口句柄 HINSTANCE hInstance; // 保存程序的实例 bool keys[256]; // 用于键盘例程的数组 bool active=TRUE; // 窗口的活动标志,缺省为TRUE bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
(1,1,-1)
(1,-1,-1)
(-1,-1,1)
(1,-1,1)
电子与信息工程学院 计算机科学与技术系
// 前侧面 glNormal3f( 0.0f, 0.0f, 1.0f); // 法线指向观察者 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
QT实例讲解绘图

在前面的几节实验中,并没有涉及到与画图相关的内容,那是因为Qt 已经为我们做好了。
在本此实验中,我们将回到图形上来,考察一下基本的画图方法。
在一个窗口画图可以有不同的方法,最简单的方法是直接在窗口中放入一幅位图,这里不讨论这种方式。
另外一种是使用的基本的API 函数进行画线、画点操作。
:实验代码:drawdemo.h:#ifndef DRAWDEMO_H#define DRAWDEMO_H#include <qwidget.h>#include <qcolor.h>#include <qpainter.h>#include <qtimer.h>#include <qframe.h>#include <math.h>class DrawDemo: public QWidget{Q_O B J E C Tpublic:DrawDemo( QWidget *parent=0, const char *name=0 );protected:virtual void paintEvent( QPaintEvent * );private slots:void flushBuff();private:int buffer[200];QTimer *timer;QFrame *frame;};#endifdrawdemo.cpp:#define PI 3.1415926#include <stdio.h>#include "drawdemo.h"DrawDemo::DrawDemo( QWidget *parent, const char *name ):QWidget( parent, name ){setCaption( "OURS_qt_Example" );frame = new QFrame( this, "frame" );frame->setBackgroundColor( black );frame->setGeometry( QRect( 40, 40, 402, 252 ) );for( int i=0; i<200; i++ ) {buffer[i] = ( int )( sin( (i*PI) /100 ) * 100 );}QTimer *timer = new QTimer( this, "timer" );connect( timer, SIGNAL( timeout() ), this, SLOT( flushBuff() ) );timer->start( 30 );}void DrawDemo::flushBuff(){int tmp = buffer[0];int i;for( i=0; i<200; i++ ) {buffer[i] = buffer[i+1];}buffer[199] = tmp;repaint( 0, 0, 480, 320, TRUE );}void DrawDemo::paintEvent( QPaintEvent * ){frame->erase( 0, 0, 400, 320 );QPainter painter( frame );QPoint beginPoint;QPoint endPoint;painter.setPen( blue );for( int i=0; i<199; i++ ) {beginPoint.setX( 2*i );beginPoint.setY( buffer[i] +125 );endPoint.setX( 2*i+1 );endPoint.setY( buffer[i+1] +125 );painter.drawLine( beginPoint, endPoint );}}main.cpp:#include <qapplication.h>#include "drawdemo.h"int main( int argc, char **argv ){QApplication app( argc, argv );DrawDemo *drawdemo = new DrawDemo( 0 );drawdemo->setGeometry(10, 20, 480, 320 );app.setMainWidget( drawdemo );drawdemo->show();int result = app.exec();return result;}实验原理:一行一行的解释,在drawdemo.h 中,在protected 成员中:virtual void paintEvent( QPaintEvent * ),在前面介绍QEvent 的时候,我们曾经提及到QPaintEvent。
QT+OpenGL描绘简单图形

QT+OpenGL描绘简单图形初学opengl,绕了很多弯路,继承于QOpenGLWindow,描画出来。
新建类myopengl,头⽂件如下:#ifndef MYOPENGL_H#define MYOPENGL_H#include <QWidget>#include <QOpenGLWidget>#include <QOpenGLWindow>#include <QGLWidget>#include <QGLFunctions>#include <QOpenGLFunctions>#include <QtOpenGL>#include <QOpenGLBuffer>#include <QOpenGLShaderProgram>#include <QMatrix4x4>#include <GL/glu.h>class myopenGL:public QOpenGLWindow, protected QOpenGLFunctions{Q_OBJECTpublic:explicit myopenGL(QWindow *parent = 0);~myopenGL();protected:void initializeGL() override;void paintGL() override;void resizeGL(int width, int height) override;void loadGLTextures();protected:GLfloat rTri;GLfloat rQuad;GLfloat xRot, yRot, zRot;GLuint texture[1];private:};#endif// MYOPENGL_Hmyopengl.cpp 代码如下:#include "myopengl.h"#include <QImage>#include <QDebug>myopenGL::myopenGL(QWindow *parent){rTri = 0.0;rQuad = 0.0;xRot = yRot = zRot = 0.0;}myopenGL::~myopenGL(){}void myopenGL::loadGLTextures(){QImage tex, buf;if ( !buf.load( "./msbg_blue.png" ) ){qWarning( "Could not read image file, using single-color instead." );QImage dummy( 128, 128, QImage::Format_RGB32 );dummy.fill( Qt::green );buf = dummy;}tex = QGLWidget::convertToGLFormat( buf );glGenTextures( 1, &texture[0] );glBindTexture( GL_TEXTURE_2D, texture[0] );glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );}//初始化opengl窗⼝部件void myopenGL::initializeGL(){initializeOpenGLFunctions();glClearColor(0.0,0.0,0.0,1.0);glShadeModel(GL_SMOOTH);glClearDepth(1.0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); }//绘制opengl窗⼝void myopenGL::paintGL(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();glTranslatef(-1.5f,0.0f,-6.0f);glRotatef( rTri, 0.0, 1.0, 0.0 );glBegin(GL_TRIANGLES);glColor3f( 1.0, 0.0, 0.0 );glVertex3f( 0.0, 1.0, 0.0 );glColor3f( 0.0, 1.0, 0.0 );glVertex3f( -1.0, -1.0, 1.0 );glColor3f( 0.0, 0.0, 1.0 );glVertex3f( 1.0, -1.0, 1.0 );glColor3f( 1.0, 0.0, 0.0 );glVertex3f( 0.0, 1.0, 0.0 );glColor3f( 0.0, 0.0, 1.0 );glVertex3f( 1.0, -1.0, 1.0 );glColor3f( 0.0, 1.0, 0.0 );glVertex3f( 1.0, -1.0, -1.0 );glColor3f( 1.0, 0.0, 0.0 );glVertex3f( 0.0, 1.0, 0.0 );glColor3f( 0.0, 1.0, 0.0 );glVertex3f( 1.0, -1.0, -1.0 );glColor3f( 0.0, 0.0, 1.0 );glVertex3f( -1.0, -1.0, -1.0 );glColor3f( 1.0, 0.0, 0.0 );glVertex3f( 0.0, 1.0, 0.0 );glColor3f( 0.0, 0.0, 1.0 );glVertex3f( -1.0, -1.0, -1.0 );glColor3f( 0.0, 1.0, 0.0 );glVertex3f( -1.0, -1.0, 1.0 );glEnd();glTranslatef(3.0f,0.0f,-7.0f);glRotatef( rQuad, 0.0, 0.0, 1.0 );glRotatef( rTri, 0.0, 1.0, 0.0 );glRotatef( rQuad, 0.0, 0.0, 1.0 );glBegin(GL_QUADS);glColor3f( 0.0, 1.0, 0.0 );glVertex3f( 1.0, 1.0, -1.0 );glVertex3f( -1.0, 1.0, -1.0 );glVertex3f( -1.0, 1.0, 1.0 );glVertex3f( 1.0, 1.0, 1.0 );glColor3f( 1.0, 0.5, 0.0 );glVertex3f( 1.0, -1.0, 1.0 );glVertex3f( -1.0, -1.0, 1.0 );glVertex3f( -1.0, -1.0, -1.0 );glVertex3f( 1.0, -1.0, -1.0 );glColor3f( 1.0, 0.0, 0.0 );glVertex3f( 1.0, 1.0, 1.0 );glVertex3f( -1.0, 1.0, 1.0 );glVertex3f( -1.0, -1.0, 1.0 );glVertex3f( 1.0, -1.0, 1.0 );glColor3f( 1.0, 1.0, 0.0 );glVertex3f( 1.0, -1.0, -1.0 );glVertex3f( -1.0, -1.0, -1.0 );glVertex3f( -1.0, 1.0, -1.0 );glVertex3f( 1.0, 1.0, -1.0 );glColor3f( 0.0, 0.0, 1.0 );glVertex3f( -1.0, 1.0, 1.0 );glVertex3f( -1.0, 1.0, -1.0 );glVertex3f( -1.0, -1.0, -1.0 );glVertex3f( -1.0, -1.0, 1.0 );glColor3f( 1.0, 0.0, 1.0 );glVertex3f( 1.0, 1.0, -1.0 );glVertex3f( 1.0, 1.0, 1.0 );glVertex3f( 1.0, -1.0, 1.0 );glVertex3f( 1.0, -1.0, -1.0 );glEnd();rTri += 0.2;rQuad -= 0.15;}//处理窗⼝⼤⼩void myopenGL::resizeGL(int width, int height){glViewport(0,0,(GLint)width,(GLint)height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0);glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵glLoadIdentity(); //重置模型观察矩阵}main.cpp修改代码如下:#include "myopengl.h"#include <QGuiApplication>#include <QPushButton>int main(int argc, char *argv[]){QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);QGuiApplication a(argc, argv);myopenGL w;w.resize(QSize(1280,720));//QPushButton ptn(&w);w.show();return a.exec();}效果图:这么简单的效果⽤了就⾛了好多弯路。
OpenGL基本图形的绘制

OpenGL基本图形的绘制1.使用glColor,glPointSize函数绘制三个不同颜色和大小的点// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0);glVertex2f(0.3f,0.5f);glEnd();glPointSize(8.0f);glBegin(GL_POINTS);glColor3f(0.0,1.0,0.0);glVertex2f(0.0f,0.0f);glEnd();glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(0.0,0.0,1.0);glVertex2f(-0.3f,-0.5f);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB); glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Three Point");glutDisplayFunc(&Display);glutMainLoop();return 0;}2.使用glColor,glLineWidth,glLineStripple函数绘制实心、虚线及渐变色线(1)实心线// T.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(2,0xFFFF);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Solid Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(2)虚线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(4,0xAAAA);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Dotted Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(3)渐变线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includeGLuint Line;void Initial(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);Line = glGenLists(1);glNewList(Line, GL_COMPILE);glTranslatef(-50.0, 20.0, 0.0);glColor3f(255.0, 0.0, 0.0);glLineWidth(2);glBegin(GL_LINES);glColor3f(255.0, 0.0, 0.0);glVertex2i(0,-20);glColor3f(0.0, 0.0, 255.0);glVertex2i(100,-20);glEnd();glEndList();void ChangeSize(int w, int h) {glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void) {glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Line);glFlush();}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600,450);glutInitWindowPosition(100,100);glutCreateWindow("渐变色线");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}3.使用glColor,glPolygonMode函数绘制纯色、渐变色、轮廓多边形(1)纯色六边形// a.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("纯色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(2)渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(3)轮廓渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0); glPolygonMode (GL_FRONT_AND_BACK,GL_LINE); gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); glutCreateWindow("轮廓渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop(); }。
计算机图形学实验——利用OpenGL函数绘制五角星

计算机图形学实验——利⽤OpenGL函数绘制五⾓星⼀、实验名称:五⾓星的绘制⼆、实验⽬的:了解 OpenGL 程序设计结构,掌握编程环三、境的设置,掌握绘制线段的⽅法。
四、实验内容:1.在 VC++ 环境下,练习利⽤ OpenGL 绘制三⾓形的程序。
2.编程实现绘制⼀个五⾓星。
(传统 OpenGL 或者 Shader)五、实验所需基本函数1.线段绘制glBegin(GL_LINES);//绘制参数GL_LINESglVertex2f(30,30);//起始点坐标glVertex2f(100,100);//终点坐标(两个为⼀组)glEnd();2.填充图像glBegin(GL_POLYGON);//绘制参数GL_POLYGONglVertex2f(x0, y0);//顶点坐标1glVertex2f(x1, y1);//2glVertex2f(cx, cy);//3glEnd();结果为对三个顶点组成的图像进⾏填充3.绘制颜⾊设置glColor3f(0.92, 0.89, 0.41);//⾦黄⾊六、实验原理根据⼩圆半径加⾓度算出第⼀个坐标然后⼤圆根据半径加⼀个⾓度算出第⼆个点坐标,然后旋转改变⾓度寻找所有顶点。
代码如下:1void DrawStar(float cx, float cy, float R,float r,float o)//五⾓星中⼼坐标x,y,⼤圆半径,⼩圆半径,初始⾓度2 {34float x0, y0, x1, y1;//5float o0 = o;//⼤圆对应⾓度6float o1 = o + 0.2 * 3.14;//⼩圆对应⾓度7for (int i = 0;i <10;i++)8 {9 x0 = cx+R * cos(o0);//⼤圆对应的x坐标10 y0 = cy+R * sin(o0);//⼤圆对应y坐标11 x1 = cx+r * cos(o1);//⼩圆对应x坐标12 y1 = cy+r * sin(o1);//⼩圆对应y坐标13if (i % 2 == 0)14 {15 glColor3f(1, 0, 0);16 }17else18 {19 glColor3f(0.92, 0.89, 0.41);20 }2122 glBegin(GL_POLYGON);//绘制23 glVertex2f(x0, y0);24 glVertex2f(x1, y1);25 glVertex2f(cx, cy);26 glEnd();27if (i % 2 == 0)28 {29 o0 = o0 + 0.4 * 3.14;//⼤圆对应⾓度变换30 }31else32 {33 o1 = o1 + 0.4 * 3.14;//⼩圆对应⾓度变换34 }3536 }37383940 }七、绘制结果⼋、附件所有代码1// OpenGLOld.cpp : 定义控制台应⽤程序的⼊⼝点。
OpenGL一个简单的例子

先编译运行一个简单的例子,这样我们可以有一个直观的印象。
从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。
除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序。
例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。
图一:一个彩色的三角形首先创建工程,其步骤如下:1)创建一个Win32 Console Application。
2)链接OpenGL libraries。
在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE改为__WINDOWS。
最后单击OK。
现在你可以把下面的例子拷贝到工程中去,编译运行。
你可以看到一个彩色的三角形。
我们先看看main函数。
函数中以glut开头的函数都包含在glut.h中。
GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。
·glutInit用来初始化GLUT库并同窗口系统对话协商。
·glutInitDisplayMode用来确定所创建窗口的显示模式。
本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。
参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。
·glutInitWindowSize初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。
·glutInitWindowPosition设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。
实验一OpenGL直线,圆的绘制

实验一、Ope nGL直线、圆的绘制1、实验目的1)了解OpenGL图形库的功能和结构;2)学习了解OpenGL程序的基本结构,及常用函数;3 )学习使用OpenGL绘制基本图形(线、圆);2、实验内容1 )使用OpenGL编写一个简单的C++程序,使该程序能够绘制出直线。
2 )使用OpenGL编写一个简单的C++程序,使该程序能够绘制出圆。
3、实验过程1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件);2)使用Visual V++6.0新建一个C++文档,并创建相应的工程;3)在文档中引入OpenG啲头文件,编辑代码实现鼠标拖动画直线,画圆。
4、实验结果可单击鼠标左键,然后拖动鼠标画出两条直线,并同时画出圆; 可单击鼠标右键,然后拖动鼠标画出两个圆,并同时画出直线。
结果截图:1.鼠标左键主要控制绘制的直线:石Open诂L直找和园的锭制5、实验代码1. #in elude vgl/glut.h>2. #in elude <math.h>3.3. // GLint pNum = 0;4. GLint px1, py1, px2, py2, ex, cy, r;5. GLint winWidth=600, winHeight=600;-/25.} 26.7. 8. llllllllllllllllll 画直线 llllllllllll 9. void Draw_Brese nham(i nt pStartx,i nt pStarty,i nt 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.27. pEn dx,i nt pEndy) {ll 用Bresenham 算法画直线 int i; if(pStartx==pE ndx) ll 为竖线 if(pStartyv=pE ndy) for(i=pStarty;i<=pE ndy;i++) glVertex2f(pStartx,i); else for(i=pE ndy;i<=pStarty;i++) glVertex2f(pStartx,i); return;-/// 为横线 if(pStarty==pE ndy) { if(pStartx<=pE ndx) { for(i=pStartx;i<=pE ndx;i++) glVertex2f(i,pStarty);} else { for(i=pE ndx;i<=pStartx;i++) glVertex2f(i,pStarty); } return; } // 为斜线 float m=(pE ndy-pStarty)*1.0/(pE ndx-pStartx); 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.-/ float p;}else-/p=2*m-1; if(m>0 && m<=1) { if(pStartx<pE ndx) { while(pStartx<=pE ndx) { glVertex2f(pStartx++,pStarty); if(p>=0) { p+=2*m-2; pStarty++; } else p+=2*m; } { while(pE ndx<=pStartx) {50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.} else glVertex2f(pE ndx++,pE ndy); if(p>=0) { p+=2*m-2; pEndy++; } else p+=2*m; } } return; } p=-2*m-1; if(m<0 && m>=-1) { if(pStartx<pE ndx) { while(pStartx<=pE ndx) { glVertex2f(pStartx++,pStarty);72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93.} elseif(p>=0) { p+=-2*m-2; pStarty--; } else p+=-2*m; } } else { while(pE ndx<=pStartx) { glVertex2f(pE ndx++,pE ndy); if(p>=0) { p+=-2*m-2; pEn dy--; p+=-2*m;94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.} else } return; } p=2/m-1; if(m>1) { if(pStartyvpE ndy) { while(pStartyv=pE ndy) { glVertex2f(pStartx,pStarty++); if(p>=0) { p+=2/m-2; pStartx++; p+=2/m; }116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137.-/else {while(pE ndyv=pStarty) {glVertex2f(pE ndx,pE ndy++); if(p>=0) {p+=2/m-2; pEndx++; } else p+=2/m; } }return;} p=-2/m-1; if(pStarty<pE ndy) { while(pStarty<=pE ndy)138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153.154. 155. 156. 157. 158. 159.-/181.{glVertex2f(pStartx,pStarty++);if(p>=0){p+=-2/m-2;pStartx--;}elsep+=-2/m;}}else{while(pE ndyv=pStarty){glVertex2f(pE ndx,pE ndy++);if(p>=0){p+=-2/m-2;pEn dx--;}else160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180.-/203. }182.p+=-2/m; 183. }184. }185. }186.187.////////////////// 画圆//////////// 188. /////////其他象限绘制189. void CirclePoi nts(i nt x,i nt y){190.// 第1象限191.glVertex2f(x,y); 192.glVertex2f(y,x);193.// 第2象限194.glVertex2f(-x,y); 195.glVertex2f(-y,x);196.// 第3象限197.glVertex2f(-y,-x); 198.glVertex2f(-x,-y);199.// 第4象限200.glVertex2f(x,-y); 201.glVertex2f(y,-x);202.-/void DrawCircle(i nt cx,i nt cy,i nt radis){ glPushMatrix(); gITra nslatef(cx,cy,0); glPoi ntSize(1);glColor3f(0.5f, 0.5f, 1.0f); glBegi n( GL_POINTS);int x,y; double p; x=0; y=radis; p=1.25-radis; while(x<=y+1) {CirclePoi nts(x,y); x++; if(p>=0) { y--;p+=2.0*(x-y)+5;204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225.〃////////中点算法画圆-/} else p+=2*x+3; }glE nd(); glPopMatrix(); }////////// 绘制坐标轴 void DrawOx(){ glColor3f(0.95, 0.7, 0.8); glPoi ntSize(1); glBeg in (GL_LINES); glVertex2f(-wi nWidth/2,0); glVertex2f(wi nWidth/2,0); glVertex2f(0,wi nH eight/2); glVertex2f(0,-wi nH eight/2); glE nd(); }226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243.244. 245. 246. 247.////////// 显示函数-/ 248. void Display(){249. 〃//////GL_COLOR_BUFFER_BIT(用背景颜色填充) 250. glClear(GL_COLOR_BUFFER_BIT);251.251. DrawOx();253.252. glColor3f(0.0,0.0,1.0);255.253. glBegi n( GL_POINTS);254. //Brese nhamL in e(px1, py1, px2, py2);255. Draw_Brese nham(px1, py1,px2, py2);256. glE nd();257. glBegi n( GL_POINTS);258. Draw_Brese nham(py1, px1,py2, px2);259. glE nd();260. //glBegi n(GL_LINES);261. 〃glVertex2f(px1,py1);262. 〃glVertex2f(px2,py2);263. 〃glVertex2f(py1,px1);264. 〃glVertex2f(py2,px2);265. //glE nd();269.270. DrawCircle(cx,cy,r);271. DrawCircle(cy,cx,r);272.273. III 交换缓冲区274. glutSwapBuffers();275. 〃glFlush();〃刷新绘图命令276. }277.278.279. II 设置渲染状态(听起来满下人,实际上很简单)280. void SetupRC(void)281. {282. II清除颜色(这里为黑色,为了方便找画的那个点)可以理解成背景颜色283. II和glColor4f(1.0f, O.Of, O.Of , 1.0f) 一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的284. II最后的那个1.0f是透明度,0.0f表示全透明,1.0f 是完全不透明285. glClearColor(1.0f, 1.0f, 1.0f,1.0f);286. }287.287. II当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,288. //几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧290. void Chan geSize(i nt w, i nt h)291. {292. wi nWidth = w;293. wi nH eight = h;294. //设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)295. glViewport(0,0,w,h);296. //重置坐标系统,指定设置投影参数297. glMatrixMode(GL_PROJECTION);298. /////// 调用单位矩阵,去掉以前的投影参数设置299. glLoadIde ntity();300. ////// 设置投影参数301. gluOrtho2D(-w/2,w/2,-h/2,h/2);302. }303.304. ///////////////// 鼠标点击305. void MousePlot(GLi nt butto n,GL int actio n,GL int xMouse,GLi nt yMouse){306. if(butto n==GLUT_LEFT_BUTTON &&-/324.307. px1 = xMouse - win Width/2; 308. py1 = winH eight/2 - yMouse;309. }310.if(butto n==GLUT_LEFT_BUTTONactio n==GLUT_UP){311. px2 = xMouse - win Width/2; 312. py2 = winH eight/2 - yMouse; 313. glutPostRedisplay();314. }315.if(butto n==GLUT_RIGHT_BUTTONactio n==GLUT_DOWN){316. cx=xMouse-wi nWidth/2; 317. cy=wi nH eight/2-yMouse; 318. }319. }320. //////////////// 鼠标移动321.void MouseMove(GLi nt xMouse,GL int yMouse){ 322. px2 = xMouse - win Width/2; 323. py2 = winH eight/2 - yMouse;actio n==GLUT_DOWN){ &&&&r=sqrt(pow((xMouse-wi nWidth/2-cx),2)+pow((wi nH eig-/ ht/2-yMouse-cy),2));325. glutPostRedisplay();326. }327.327. //主函数328. int main (i nt argc, char* argv[])329. {330. glutI ni t(&argc, argv);331. //设置显示模式332. glutI ni tDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);333. //设置窗口大小像素334. glutI nitWin dowSize(600, 600);335. ////设置窗口出现在屏幕的位置336. glutI nitWin dowPositio n(300,160);337. //建立一个叫OpenGL的窗口338. glutCreateWi ndow("Ope nGL-Li ne");340.339. //调用函数Display进行绘制340. glutDisplayF un c(Display);341. ////// 调用鼠标移动函数-/ 342. //glutPassiveMotio nFun c(PassiveMouseMove);-/ 357. } 345. glutMotio nFun c(MouseMove); 346. ... 调用鼠标点击函数 347. glutMouseFu nc(MousePlot); 348. 349.//如果窗口大小改变则调用函数 绘制 350. glutReshapeF un c(Cha ngeSize); 351. //清屏 352. SetupRC(); 353. //循环绘制 354. glutMai nLoop(); 355. 356.return 0; ChangeSize 重新进行。
详解Qt写OpenGL入门示例

详解 Qt 写 OpenGL 入门示例2011-07-01 17:12 佚名互联网字号: |本文介绍的是详解 Qt 写 OpenGL 入门示例,不多说,先来看详细内容。
AD:Qt 写OpenGL 入门示例是本文所介绍的内容。
其实我个人是很喜欢玩游戏的,为什么呢?只是因为我还无法制作游戏.所以,以前就看过一些...东西. 比如directx/opengl. 可惜无法入门,而当年拼命的记忆那个windows api版的hello world(vc++自动生成)...在一个星期后便忘记了.使得我对上的编程充满了阴影(在若干年后,我终于明白你不需要去记忆具体api, 因为环境会给你提示) - 都没入门, 怎么开始directx哦?(不过无数次的hello world,也有好处,就是让我明白了windows平台的消息循环机制...这让我在若干年后在看到qt 的()时,心有灵犀的想, 哦,进入了消息循环了...)后来自然就看看qt,看看c++、PHP就不说了,一直搞这个的)等. 还有有比如SDL一类的搞搞,但始终不得其门而入,qt有自带的提供给opengl的窗口类的. 在我以前, 反正也试过,这样那样的错误就放弃了...不过不知道为什么, 现在却很简单,(可能做任何事情都有简单和难的时候,只是未到时间吧).,假如你也想玩玩qt? opengl的话, 那么先具体下面一些东西:(1)OpenGL编程指南 (书, 里面有代码的,咋们参考一些)(2)装了qt库和环境(windows下qt里应该有自带opengl, 所以opengl的库就不提了)(3)编译器那么我们就开始了...反正是很简单的入门...写个, 如下1.yarco@coto?~/Documents/test/1?$?cat? ?2.#include?<QApplication>?3.#include?"" ?1.int?main(int?argc,?char*?argv[])?. ?2.yarco@coto?~/Documents/test/1?$?cat? ?3.#include?"" ?4.void?MyWidget::initializeGL() ?5.{ ?6.} ?7.void?MyWidget::resizeGL(int?w,?int?h) ?8.{ ?9.} ?10.void?MyWidget::paintGL() ?11.{ ?12.????????renderText(20,?100,?"Hello,?My?first?OpenGL?app."); ?13.} ?.(不详细描述)结果的效果图如下:小结:详解 Qt 写OpenGL 入门示例的内容介绍完了,希望本文对你有所帮助!。
Qt学习:三维绘图之OpenGL和Qt的结合(转)

Qt学习:三维绘图之OpenGL和Qt的结合(转)OpenGL是绘制三维图形的标准API。
Qt应⽤程序可以使⽤QtOpenGL模块绘制三维图形,该模块依赖于系统的OpenGL库。
Qt OpenGL 模块提供QGLWidget类,可以通过对它⼦类化,并使⽤OpenGL命令开发出⾃⼰的窗⼝部件。
对许多三维应⽤程序来说,这就⾜够了。
这节假设⼤家都已经学过OpenGL,这样我们就⽆后顾之忧了。
在Qt中绘制OpenGL通常需要做以下⼯作:1)、必须⼦类化QGLWidget;2)、实现⼏个虚函数:void initiallizeGL()void resizeGL(), void paintGL(), 这些都是在QGLWidget中实现的,还有⼀些和⽤户交互的虚函数,诸如void mouseMoveEvent()之类的,想必⼤家都⽐较熟了,这些虚函数是在Widget中实现的。
下⾯我们介绍⼀个例⼦。
先给出该程序的效果:菜单栏⾥的第⼀项可以完成⼀个⾃定义⼤⼩的抓图,即由⽤户⾃⼰决定抓图的⼤⼩,抓图会显⽰在右侧的⽅框⾥,注意这⾥只能设置图形的⼤⼩⼩⾬当前图形的尺⼨,如果⼤于当前图形尺⼨,则钳位到当前图形尺⼨。
效果看起来应该是这样:菜单栏第⼆项也是⼀个抓图功能,它返回⼀个当前图形尺⼨的图形,并填充到右侧。
第三项即清除右侧图形。
这个代码由以下部件构成:⼀个QMainWindow,我们通过⼦类化这个类来完成⾃⼰想要的⼀些功能。
⼀个QWidget,我们把它作为中央窗⼝,在其上添加⾃⼰想要的⼀些⼦部件。
两个QScrollBar,⽤来盛载⼀个QGLWidget和⼀个QLabel。
⼀个QGLWidget,我们通过⼦类化它并把它加进⼀个QScrollBar来实现三维绘图,即上图所⽰的左边窗⼝。
⼀个QLabel,同样,我们把这个QLabel加进⼀个QScrollBar来接收抓图后的显⽰效果。
三个QSlider,我们通过这三个滑动条控制所绘制的四⾯体沿x,y,z轴转动,同样⿏标拖动这个四⾯体也可以改变滑动条的值。
QT使用OpenGL进行3D绘图

QT使用OpenGL进行3D绘图目录一、成果展示:二、代码展示:1、main.cpp2、MyGLWidget.h3、MyGLWidget.cpp三、编译错误解析:1、gluPerspective 和 gluLookAt 找不到标识符2、error: LNK2019: 无法解析的外部符号 __imp_glBegin等一、成果展示:二、代码展示:1、main.cpp1.#include <QtWidgets/QApplication>2.3.#include "myglwidget.h"4.5.int main(int argc, char *argv[])6.{7.QApplication a(argc, argv);8.9.MyGLWidget w;10.w.resize(400, 300);11.w.show();12.13.return a.exec();14.}2、MyGLWidget.h1.#ifndef MYGLWIDGET_H2.#define MYGLWIDGET_H3.4.#include <QGLWidget>5.#include <GL/GLU.h>6.7.class MyGLWidget : public QGLWidget8.{9.Q_OBJECT10.public:11.explicit MyGLWidget(QWidget *parent = 0);12.13.protected:14.void initializeGL();15.void resizeGL(int w, int h);16.void paintGL();17.void keyPressEvent(QKeyEvent *);18.void paintEvent(QPaintEvent *);19.void setupViewport(int w, int h);20.21.private:22.GLfloat translate, xRot, yRot, zRot;23.GLuint textures[3];24.25.signals:26.27.public slots:28.29.};30.31.#endif // MYGLWIDGET_H3、MyGLWidget.cpp1.#include "myglwidget.h"2.#include <QKeyEvent>3.4.MyGLWidget::MyGLWidget(QWidget *parent) :5.QGLWidget(parent)6.{7.translate = -6.0;8.xRot = yRot = zRot = 0.0;9.10.// 关闭自动填充背景11.setAutoFillBackground(false);12.}13.14.// 初始化环境15.void MyGLWidget::initializeGL()16.{17.}18.19.// 调整视口大小20.void MyGLWidget::resizeGL(int w, int h)21.{22.setupViewport(w, h);23.}24.25.// 渲染场景26.void MyGLWidget::paintGL()27.{28.}29.30.void MyGLWidget::keyPressEvent(QKeyEvent *event)31.{32.switch (event->key())33.{34.case Qt::Key_Up :35.xRot += 10;36.break;37.case Qt::Key_Left :38.yRot += 10;39.break;40.case Qt::Key_Right :41.zRot += 10;42.break;43.case Qt::Key_Down :44.translate -= 1;45.if (translate <= -20)46.translate = -1;47.break;48.}49.//updateGL();50.update();51.QGLWidget::keyPressEvent(event);52.}53.54.void MyGLWidget::paintEvent(QPaintEvent *)55.{56.// 在当前窗口中进行OpenGL的绘制57.makeCurrent();58.// 将模型视图矩阵压入堆栈59.glMatrixMode(GL_MODELVIEW);60.glPushMatrix();61.62.// 以下是以前initializeGL()函数中的全部内容63.glClearColor(0.0, 0.0, 0.0, 0.0);64.glShadeModel(GL_SMOOTH);65.glClearDepth(1.0);66.glEnable(GL_DEPTH_TEST);67.68.textures[0] = bindTexture(QPixmap(":/LHCGraphicsView/Resources/side1.png "));69.textures[1] = bindTexture(QPixmap(":/LHCGraphicsView/Resources/side2.png "));70.textures[2] = bindTexture(QPixmap(":/LHCGraphicsView/Resources/side3.png "));71.glEnable(GL_TEXTURE_2D);72.73.// 该函数中是以前resizeGL()函数中的全部内容74.setupViewport(width(), height());75.76.// 以下是以前paintGL()函数中的全部内容77.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);78.glLoadIdentity();79.80.glTranslatef(0.0, 0.0, translate);81.glRotatef(xRot, 1.0, 0.0, 0.0);82.glRotatef(yRot, 0.0, 1.0, 0.0);83.glRotatef(zRot, 0.0, 0.0, 1.0);84.85.glBindTexture(GL_TEXTURE_2D, textures[2]);86.glBegin(GL_QUADS);87.glTexCoord2f(1.0, 0.0);88.glVertex3f(1.0, 1.0, 1.0);89.glTexCoord2f(1.0, 1.0);90.glVertex3f(1.0, 1.0, -1.0);91.glTexCoord2f(0.0, 1.0);92.glVertex3f(-1.0, 1.0, -1.0);93.glTexCoord2f(0.0, 0.0);94.glVertex3f(-1.0, 1.0, 1.0);95.glEnd();96.glBindTexture(GL_TEXTURE_2D, textures[1]);97.glBegin(GL_QUADS);98.glTexCoord2f(1.0, 0.0);99.glVertex3f(1.0, -1.0, 1.0);100.glTexCoord2f(1.0, 1.0);101.glVertex3f(1.0, -1.0, -1.0);102.glTexCoord2f(0.0, 1.0);103.glVertex3f(-1.0, -1.0, -1.0);104.glTexCoord2f(0.0, 0.0);105.glVertex3f(-1.0, -1.0, 1.0);106.glEnd();107.glBindTexture(GL_TEXTURE_2D, textures[0]); 108.glBegin(GL_QUADS);109.glTexCoord2f(1.0, 1.0);110.glVertex3f(1.0, 1.0, 1.0);111.glTexCoord2f(0.0, 1.0);112.glVertex3f(-1.0, 1.0, 1.0);113.glTexCoord2f(0.0, 0.0);114.glVertex3f(-1.0, -1.0, 1.0);115.glTexCoord2f(1.0, 0.0);116.glVertex3f(1.0, -1.0, 1.0);117.glEnd();118.119.// 关闭启用的功能并弹出模型视图矩阵120.glDisable(GL_DEPTH_TEST);121.glDisable(GL_TEXTURE_2D);122.glMatrixMode(GL_MODELVIEW);123.glPopMatrix();124.125.// 下面是2D绘图的内容126.QPainter painter(this);127.painter.setRenderHint(QPainter::Antialiasing);128.painter.setBrush(Qt::red);129.painter.drawRect(0, 0, 100, 100);130.painter.end();131.}132.133.void MyGLWidget::setupViewport(int w, int h)134.{135.glViewport(0, 0, (GLint)w, (GLint)h);136.glMatrixMode(GL_PROJECTION);137.glLoadIdentity();138.gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0);139.glMatrixMode(GL_MODELVIEW);140.glLoadIdentity();141.}4、图片资源三、编译错误解析:1、gluPerspective 和 gluLookAt 找不到标识符请添加头文件 #include <GL/glu.h>且,必须要加在 #include <QGLWidget> 的后面2、error: LNK2019: 无法解析的外部符号 __imp_glBegin等我用的 vs+qt 开发链接器-- 常规-- 附加库目录--添加D:\Windows Kits\10\Lib\10.0.17763.0\um 64 (vs其实已经继承了该路径。
opengl学习(三)----绘制简单图形(一)

opengl学习(三)----绘制简单图形(⼀)今天说⼀说⼏种简单的图元。
所有的⼏何图元都是根据它们的顶点来描绘的。
⽽顶点就是它们在屏幕上的坐标位置。
我喜欢把这⼏个简单的图元称为点线⾯。
点,可以看到⼀个顶点;线,就是两个顶点指定的⼀条有限长度的线段;⾯,其实更准确讲是⼀个凸多边形。
opengl⾥所讲的多边形是内部⽤颜⾊填充的,视觉上称为⾯我个⼈认为是更贴近的。
当然,多边形也是由指定的顶点组成的。
需要注意的是,要想被opengl按照设计被绘制必须正确的认识到,所谓的多边形是顶点都处于⼀个平⾯上,凸多边形。
凸多边形不能理解的,请问度娘。
来看⼀个例⼦:C++代码1. glBegin(GL_POLYGON);2. glVertex2f(0.0, 0.0);3. glVertex2f(0.0, 3.0);4. glVertex2f(4.0, 3.0);5. glVertex2f(6.0, 1.5);6. glVertex2f(4.0, 0.0);7. glEnd();先不去关⼼代码本⾝,这段代码最终的结果是要指定5个顶点绘制⼀个凸五边形。
注意,不是5条线段⽽是⼀个凸五边形的平⾯。
不管是点线⾯的哪⼀种,都是需要指定⼀组顶点的。
如何判定顶点指定的开始和结束就是glBegin和glEnd的⼯作。
引⽤void glBegin(Glenum mode);标志着⼀个顶点数据列表的开始,它描述了⼀个⼏何图元。
mode参数指定了图元的类型。
void glEnd(void);标志着⼀个顶点数据列表的结束。
mode设置的不同,代表着将要绘制的图元也不同。
下⾯这个表就是图元的名称和含义:值含义GL_POINTS 单个的点GL_LINES ⼀对顶点被解释为⼀条直线GL_LINE_STRIP ⼀系列的连接直线GL_LINE_LOOP 和上⾯相同,但第⼀个顶点和最后⼀个顶点彼此相连GL_TRIANGLES 3个顶点被解释为⼀个三⾓形GL_TRIANGLES_STRIP 三⾓形的连接串GL_TRIANGLES_FAN 连接成扇形的三⾓形系列GL_QUADS 4个顶点被解释为⼀个四边形GL_QUADS_STRIP 四边形的连接串GL_POLYGON 简单的凸多边形的边界试想着,如果将glBegin(GL_POLYGON)修改为glBegin(GL_POINTS),绘制出来的将是什么图形呢? 哈哈,那就是5个点⽽已么。
linux下的qt中qopenglfunctions下函数的用法

linux下的qt中qopenglfunctions下函数的用法一、QOpenGLFunctions概述QOpenGLFunctions是一个用于处理OpenGL函数调用的类,它在Qt框架中提供了一组用于访问OpenGL功能的接口。
通过使用QOpenGLFunctions,开发者可以在Qt应用程序中轻松地调用OpenGL 函数,而不必关心底层细节。
1. 获取QOpenGLFunctions对象要使用QOpenGLFunctions,首先需要获取一个QOpenGLFunctions 对象。
可以通过调用QOpenGLContext类的functions()函数来获取该对象。
示例如下:```scssQOpenGLContext *context = ... // 获取OpenGL上下文对象QOpenGLFunctions *functions = context->functions();```2. 注册OpenGL函数为了使用QOpenGLFunctions调用OpenGL函数,需要将所需的函数名称注册到该对象中。
可以使用registerFunctions()函数来完成此操作。
示例如下:```scssfunctions->registerFunctions(QOpenGLContext::Functions::AllFunctions);```这将注册所有OpenGL函数,以便后续调用。
3. 调用OpenGL函数一旦获得了QOpenGLFunctions对象并注册了所需的函数,就可以使用该对象来调用OpenGL函数了。
可以使用该对象的方法来执行各种OpenGL操作,例如绘制几何图形、设置着色器参数等。
示例如下:```scss// 绘制矩形functions->glDrawArrays(GL_TRIANGLES, 0, 3);// 设置着色器程序functions->glUseProgram(shaderProgram);```4. 清理资源完成OpenGL函数的调用后,记得释放QOpenGLFunctions对象占用的资源。
几个opengl立方体绘制案例

⼏个opengl⽴⽅体绘制案例⼀ OpenGL 绘制⼀个⽴⽅体代码#include<GL/glut.h>// 绘制⽴⽅体// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯static const float vertex_list[][3] ={-0.5f, -0.5f, -0.5f,0.5f, -0.5f, -0.5f,-0.5f, 0.5f, -0.5f,0.5f, 0.5f, -0.5f,-0.5f, -0.5f, 0.5f,0.5f, -0.5f, 0.5f,-0.5f, 0.5f, 0.5f,0.5f, 0.5f, 0.5f,};// 将要使⽤的顶点的序号保存到⼀个数组⾥⾯static const GLint index_list[][2] ={{0, 1},{2, 3},{4, 5},{6, 7},{0, 2},{1, 3},{4, 6},{5, 7},{0, 4},{1, 5},{7, 3},{2, 6}};// 绘制⽴⽅体void DrawCube(void){int i,j;glBegin(GL_LINES);for(i=0; i<12; ++i) // 12 条线段{for(j=0; j<2; ++j) // 每条线段 2个顶点{glVertex3fv(vertex_list[index_list[i][j]]);}}glEnd();}static float rotate = 0;static int times = 0;void renderScene(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glPushMatrix();//glTranslatef(-0.2, 0, 0); // 平移//glScalef(2, 1, 1); // 缩放times++;if(times > 100){times = 0;}if(times % 100 == 0){rotate += 0.3;}glRotatef(rotate, 0, 1, 0);glRotatef(rotate, 1, 0, 0);glColor3f(0, 0, 1);DrawCube();glPopMatrix();glutSwapBuffers();}void main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100,100);glutInitWindowSize(500, 500);glutCreateWindow("GLDemo");glutDisplayFunc(renderScene);glutIdleFunc(renderScene);glutMainLoop();}效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//灯 glLightfv(GL_LIGHT1,GL_AMBIENT,lightAmbient); glLightfv(GL_LIGHT1,GL_DIFFUSE,lightDiffuse); glLightfv(GL_LIGHT1,GL_POSITION,lightPosition); glEnable(GL_LIGHT1);
void drawSphere();//画球体 int drawGLobject();
void initializeGL();//初始化 QpenGL 窗口部件 void paintGL();//绘制 QPenGL 窗口,有更新发生,函数就会被调用 void resizeGL(int w, int h);//处理窗口大小变化,w 和 h 是新状态下的宽和高,完成后自 动刷新屏幕 //void keyPressEvent(QKeyEvent *e);//鼠标按下事件处理函数 void timerEvent(QTimerEvent *);//实现窗口部件的定时操作 void mousePressEvent(QMouseEvent *e);//鼠标单击事件 void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件 void mouseReleaseEvent(QMouseEvent *e);//鼠标释放事件 void wheelEvent(QWheelEvent *e);//鼠标滚轮事件
//雾 glFogi(GL_FOG_MODE,fogMode[fogFilter]); glFogfv(GL_FOG_COLOR,fogColor); glFogf(GL_FOG_DENSITY,0.1);//雾的浓度 glHint(GL_FOG_HINT,GL_DONT_CARE);// 确 定 雾 的 渲 染 方 式 , 不 关 心 建 议 值 , GL_NICEST 极棒的,每一像素渲染,GL_FASTEST 对每一顶点渲染,速度快 glFogf(GL_FOG_START,1.0);//雾离屏幕的距离 glFogf(GL_FOG_END,5.0); //glEnable(GL_FOG);
GLfloat sphere_x,sphere_y;
bool light; bool blend;
float points[45][45][3];//存放网格各顶点独立地(x,y,z)坐标 int wiggle_count;//指定波浪的速度
GLuint fogFilter;//选择雾的类型 GLuint filter;//储存纹理变量 QPoint lastPos; GLUquadric *qobj;//二次方程对象
//雾的设定 GLuint fogMode[3] = {GL_EXP,GL_EXP2,GL_LINEAR};//三种雾的效果,依次递进 GLfloat fogColor[4] = {0.5,0.5,1.0,0.3};
glutttt::glutttt(QWidget *parent) : QGLWidget(parent) {
sphere_x = 2.0; sphere_y = 0;
obj =0;
p1 = 0; p2 = 1; part1 = 0; part2 = 0;
setGeometry(50,50,800,600); if (fullScreen) {
showFullScreen(); } startTimer(5); } void glutttt::initializeGL() { loadGLTextures();//先载入纹理 buildLists();//建立列表 glEnable(GL_TEXTURE_2D);//启用纹理 glShadeModel(GL_SMOOTH);//阴影平滑 glClearColor(0.0,0.0,0.0,0.5);//设置清除屏幕时所使用的颜色 glClearDepth(1.0);//设置深度缓存 glEnable(GL_DEPTH_TEST);//启用深度测试 glDepthFunc(GL_LEQUAL);//所做深度测试的类型 glEnable(GL_COLOR_MATERIAL);//可以用颜色来帖纹理 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//投影修正
//第三个 glNormal3f(0.0,0.0,-1.0); glTexCoord2f(1.0,0.0);glVertex3f(-1.0,-1.0,-1.0); glTexCoord2f(1.0,1.0);glVertex3f(-1.0,1.0,-1.0); glTexCoord2f(0.0,1.0);glVertex3f(1.0,1.0,-1.0); glTexCoord2f(0.0,0.0);glVertex3f(1.0,-1.0,-1.0); //第四个 glNormal3f(1.0,0.0,0.0); glTexCoord2f(1.0,0.0);glVertex3f(1.0,-1.0,-1.0); glTexCoord2f(1.0,1.0);glVertex3f(1.0,1.0,-1.0); glTexCoord2f(0.0,1.0);glVertex3f(1.0,1.0,1.0); glTexCoord2f(0.0,0.0);glVertex3f(1.0,-1.0,1.0); //第五个 glNormal3f(-1.0,0.0,0.0); glTexCoord2f(0.0,0.0);glVertex3f(-1.0,-1.0,-1.0); glTexCoord2f(1.0,0.0);glVertex3f(-1.0,-1.0,1.0); glTexCoord2f(1.0,1.0);glVertex3f(-1.0,1.0,1.0); glTexCoord2f(0.0,1.0);glVertex3f(-1.0,1.0,-1.0);
//融合 glColor4f(1.0,1.0,1.0,0.5); glBlendFunc(GL_SRC_ALPHA,GL_ONE);
//初始化网格的点,整数循环可以消除浮点数运算取整造成的脉冲锯齿出现 for (int x=0;x<45;x++) {
for (int y=0;y<45;y++) {
points[x][y][0] = float((x/5.0)-5.0);//使波浪居中【-4.5~4.5】 points[x][y][1] = float((y/5.0)-5.0); points[x][y][2] = float(sin((((x/5.0)*40.0)/360.0)*3.141592654*2.0)); } } }
Q_OBJECT public:
glutttt(QWidget *parent = 0); ~glutttt(); void loadGLTextures();//载入纹理 void buildLists();//创建列表 void drawList();//画列表 void drawFlag();//画旗子
int part1;//圆盘的起始角度 int part2;//圆盘的结束角度 int p1;//增量 int p2;//增量 GLuint obj;//要画的对象
bool sp;//空格键是否按下 };
#endif // glutttt_H
//************** glutttt.cpp
QT OPengl 画图例子源码 by liulihuo
环境:Qt4.7.3 + VS2008 效果图:
//*************** glutttt.h
#ifndef GLUTTTT_H #define GLUTTTT_H #include <QtGui/QWidget> #include <qgl.h> #include <QKeyevent> #include <QtOpenGL/glut> #pragma comment(lib, "glaux.lib") class glutttt : public QGLWidget {
bool fullScreen; GLfloat xrot,yrot,zrot; GLfloat zoom; GLfloat hold;//存放用来对旗光滑的浮点数 GLuint texture[4];//四个纹理 GLuint box,top,tri;//存放显示列表的指针 GLuint xLoop,yLoop;//表示两个立方体位置的变量
glEnd(); glEndList();//完成了一个显示列表 top = box + 1;//上一个显示列表的指针加 1,得到第二个显示列表,列表指针为 top glNewList(top,GL_COMPILE); glBegin(GL_QUADS); glNormal3f(0.0,1.0,0.0); glTexCoord2f(0.0,1.0);glVertex3f(-1.0,1.0,-1.0); glTexCoord2f(0.0,0.0);glVertex3f(-1.0,1.0,1.0); glTexCoord2f(1.0,0.0);glVertex3f(1.0,1.0,1.0); glTexCoord2f(1.0,1.0);glVertex3f(1.0,1.0,-1.0); glEnd(); glEndList();//第二个显示列表完毕
{0.5,0.0,0.0}, {0.5,0.25,0.0}, {0.5,0.5,0.0}, {0.5,0.0,0.0}, {0.0,0.5,0.5} t lightAmbient[4] = {0.5,0.5,0.5,1.0}; GLfloat lightDiffuse[4] = {1.0,1.0,1.0,1.0}; GLfloat lightPosition[4] = {0.0,0.0,2.0,1.0};