详解Qt写 OpenGL入门示例
opengl入门教程
opengl入门教程OpenGL入门教程OpenGL是一种跨平台的图形库,可用于创建各种类型的图形和视觉效果。
本教程将带你入门使用OpenGL,并介绍一些基本的概念和技术。
安装OpenGL首先,你需要安装OpenGL的开发环境。
具体安装方法将因操作系统而异,以下是一些常见操作系统的安装指南。
- Windows: 在Windows上,你可以使用MinGW或者MSYS2安装OpenGL。
- macOS: OpenGL在macOS上是默认安装的,你只需要确保你的系统版本满足OpenGL的要求。
- Linux: 在Linux上,你可以使用包管理器安装OpenGL的开发环境,如apt-get (Ubuntu)或yum (Fedora)。
创建一个OpenGL窗口在开始编写OpenGL应用程序之前,你需要创建一个OpenGL 窗口来显示你的图形。
以下是使用GLUT创建一个简单窗口的例子。
```c++#include <GL/glut.h>void display() {glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);glVertex2f(-0.5, -0.5);glVertex2f(0.5, -0.5);glVertex2f(0.0, 0.5);glEnd();glFlush();}int main(int argc, char** argv) {glutInit(&argc, argv);glutCreateWindow("OpenGL Window");glutDisplayFunc(display);glutMainLoop();return 0;}```运行上述代码,你将看到一个简单的OpenGL窗口中显示了一个三角形。
绘制基本图形OpenGL提供了一组基本的绘图函数,可用于绘制各种类型的图形。
以下是一些常见的绘图函数:- `glBegin(GL_POINTS)`: 用于绘制点。
qt开发例程
qt开发例程全文共四篇示例,供读者参考第一篇示例:Qt是一个跨平台的C++应用程序框架,是由挪威的Trolltech公司开发的。
Qt具有一套完善的类库和工具,可以轻松地实现图形用户界面、数据库操作、网络通信等功能。
Qt的特点是跨平台、易用性高、扩展性强、灵活性大,因此备受开发者的青睐。
本文将介绍一些Qt的开发例程,帮助读者更快速、更简单地掌握Qt的开发方法。
一、简单的Hello World程序我们来看一个简单的Hello World程序,这是最基础的Qt开发示例。
创建一个新的Qt项目,选择Qt Widgets Application模板,命名为HelloQt。
```cpp#include <QApplication>#include <QLabel>QLabel label("Hello, Qt!");label.show();return app.exec();}```在这个程序中,我们首先包含了QApplication和QLabel两个类的头文件,分别是Qt应用程序的主类和一个用于显示文本的类。
然后,我们创建了一个QLabel对象,并将其内容设置为"Hello, Qt!",最后调用show()方法显示出来。
我们调用app.exec()方法让程序开始运行。
二、使用信号与槽实现按钮点击事件class MyWidget : public QWidget{public:MyWidget(QWidget *parent = 0) : QWidget(parent){QPushButton *button = new QPushButton("Click me", this);connect(button, &QPushButton::clicked, this,&MyWidget::showMessage);}MyWidget widget;widget.show();在这个程序中,我们从QWidget类派生出了一个自定义的MyWidget类,在构造函数中创建了一个按钮,并通过connect()方法将按钮的clicked信号与自定义的showMessage槽函数连接起来。
Qt_OpenGL_教程
(由 nehewidget.cpp 展开。 ) #include "nehewidget.h" NeHeWidget::NeHeWidget( QWidget* parent, const char* name, bool fs ) : QGLWidget( parent, name ) { fullscreen = fs; 保存窗口是否为全屏的状态。 setGeometry( 0, 0, 640, 480 ); 设置窗口的位置,即左上角为(0,0)点,大小为 640*480。 setCaption( "NeHe's OpenGL Framework" ); 设置窗口的标题为“NeHe's OpenGL Framework” 。 if ( fullscreen ) showFullScreen(); 如果 fullscreen 为真,那么就全屏显示这个窗口。 } 这个是构造函数,parent 就是父窗口部件的指针,name 就是这个窗口部件的名称,fs 就是 窗口是否最大化。 NeHeWidget::~NeHeWidget() { } 这个是析构函数。 void NeHeWidget::initializeGL() { glShadeModel( GL_SMOOTH ); 这一行启用 smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光 进行平滑。我将在另一个教程中更详细的解释阴影平滑。 glClearColor( 0.0, 0.0, 0.0, 0.0 ); 这一行设置清除屏幕时所用的颜色。 如果您对色彩的工作原理不清楚的话, 我快速解释一下。 色彩值的范围从 0.0 到 1.0。0.0 代表最黑的情况,1.0 就是最亮的情况。glClearColor 后的第 一个参数是红色,第二个是绿色,第三个是蓝色。最大值也是 1.0,代表特定颜色分量的最亮 情况。最后一个参数是 Alpha 值。当它用来清除屏幕的时候,我们不用关心第四个数字。现 在让它为 0.0。我会用另一个教程来解释这个参数。 通过混合三种原色(红、绿、蓝) ,您可以得到不同的色彩。希望您在学校里学过这些。因 此 , 当 您 使 用 glClearColor(0.0, 0.0,1.0, 0.0 ) , 您 将 用 亮 蓝 色 来 清 除 屏 幕 。 如 果 您 用 glClearColor(0.5, 0.0, 0.0, 0.0)的话,您将使用中红色来清除屏幕。不是最亮(1.0),也不是最 暗(0.0)。要得到白色背景,您应该将所有的颜色设成最亮(1.0)。要黑色背景的话,您该将所 有的颜色设为最暗(0.0)。 glClearDepth( 1.0 ); 设置深度缓存。 glEnable( GL_DEPTH_TEST ); 启用深度测试。 glDepthFunc( GL_LEQUAL ); 所作深度测试的类型。
OpenGL编程轻松入门之一个简单的例子
OpenGL编程轻松入门之一个简单的例子先编译运行一个简单的例子,这样我们可以有一个直观的印象。
从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。
除此以外,我们还可以看到典型的OpenGL程序结构及openGL 的运行顺序。
例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。
#include <stdlib.h>#include <GL/glut.h>void background(void){glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写glBegin(GL_TRIANGLES);//开始画三角形glShadeModel(GL_SMOOTH);//设置为光滑明暗模式glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色glV ertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色glV ertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色glV ertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)glEnd();//三角形结束glFlush();//强制OpenGL函数在有限时间内运行}void myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);//设置视口glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION glLoadIdentity();//将当前矩阵置换为单位阵if(w <= h)gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵elsegluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW }int main(int argc,char ** argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow("Triangle");/*绘制与显示*/background();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return(0);}图一:一个彩色的三角形首先创建工程,其步骤如下:1)创建一个Win32 Console Application。
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个多⼩时,就是不显⽰三⾓形,在⽹上找了很多⽅法,都试过了还不⾏。
QT编程技术详解.ppt
窗口操作函数,窗口初始化、窗口大小、窗 口位置等函数
回调函数。响应刷新消息、键盘消息、 鼠标消息、定时器函数等
创建复杂的三维物体 菜单函数
程序运行函数,glutMainLoop()
OpenGL的库
• 从核心库方面分析,OpenGL只是一个针对 显卡的软件接口,也就是说,单纯的 OpenGL除了绘制图形之外,没有任何的其 它的功能。而事实上,一个三维的程序不 可能是一副静态的图画,一个游戏不可能 不和用户进行交互,由于OpenGL本身不提 供这些功能,所以程序员需要一个可以应 用OpenGL的编程环境(比如VC、Qt)及应用 其核心之外的库。(因为OpenGL创建之初 的宗旨就是:让画家专注于绘画)
核心库包含 有115个函 数,函数名 的前缀为gl, 用于常规的、 核心的图形 处理.
矩阵操作、几何变换和投影变换的函数,如glPushMatrix() 颜色、光照和材质的函数,如设置颜色模式函数glColor*() 显示列表函数,如glNewList()、 glEndList() 纹理映射函数,如glTexImage1D()、glTexImage2D() 光栅化、象素操作函数,如glRasterPos*()、glLineWidth() 选择与反馈函数,如渲染模式glRenderMode() 曲线与曲面的绘制函数,如glMap*()、glMapGrid*()
2020/4/8
OpenGL绘图
• glBegin(GLenum mode)
Mode 的值
含义
GL_POINTS
一系列独立的点
GL_LINES
多组线段
GL_POLYGON
单个简单填充多边形
GL_TRIANGLES
多组独立填充三角形
OpenGL编程轻松入门之特殊效果操作Read
OpenGL编程轻松入门之特殊效果操作-Read————————————————————————————————作者:————————————————————————————————日期:OpenGL编程轻松入门之特殊效果操作每个物体在不同的环境在会有不同的视觉效果。
为了使效果更加真实需要增加特殊效果。
例8:绘制三个互相重叠的矩形,这三个矩形从左到右分别为绿、红、蓝。
其中红色、蓝色矩形的透明度分别为50%的透明度,即alpha值为0.5,如图九所示。
#include <stdlib.h>#include <GL/glut.h>void myInit(void){glClearColor(0.2,0.8,0.8,0.0);//将背景设置为湖蓝色glEnable(GL_BLEND);//激活GL_BLENDglBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//指定像素的数学算法glEnable(GL_FLAT);}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);/*绘制一个绿色的矩形alpha = 1.0*/glColor4f(0.0,1.0,0.0,1.0);glBegin(GL_POL YGON);glVertex3f(-0.75,0.5,0.0);glVertex3f(-0.75,-0.75,0.0);glVertex3f(0.5,-0.75,0.0);glVertex3f(0.5,0.5,0.0);glEnd();/*绘制一个红色的矩形alpha = 0.5*/glColor4f(1.0,0.0,0.0,0.5);glBegin(GL_POL YGON);glVertex3f(-0.25,1.0,0.0);glVertex3f(-0.25,-0.25,0.0);glVertex3f(1.0,-0.25,0.0);glVertex3f(1.0,1.0,0.0);glEnd();/*绘制一个蓝色的矩形alpha = 0.5*/glColor4f(0.0,0.0,1.0,0.5);glBegin(GL_POL YGON);glVertex3f(0.25,1.5,0.0);glVertex3f(0.25,0.25,0.0);glVertex3f(1.5,0.25,0.0);glVertex3f(1.5,1.5,0.0);glEnd();glFlush();}void myReshape(int w,int h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<h)glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5);elseglOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-1.5,1.5);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(-0.4,0.0,0.0);}int main(int argc,char ** argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow("BLEND POL YGON");/*绘制与显示*/myInit();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);/*进入GLUT事件处理循环*/glutMainLoop();return(0);}图九:三个互相重叠的矩形·glBlendFunc(GLenum sfactor,GLenum dfactor)指定像素算法。
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();}效果图:这么简单的效果⽤了就⾛了好多弯路。
qt5opengl编译
qt5opengl编译Qt5是一种跨平台的应用程序开发框架,而OpenGL是一种用于渲染2D和3D图形的图形库。
将这两者结合起来,可以实现更加强大和高效的图形渲染效果。
本文将介绍如何使用Qt5开发OpenGL应用程序,并讨论一些与Qt5和OpenGL相关的主题。
我们需要了解Qt5中的OpenGL模块。
Qt提供了一个名为QtOpenGL 的模块,它包含了与OpenGL相关的类和函数。
使用QtOpenGL,我们可以轻松地创建一个OpenGL窗口,并在其中绘制2D或3D图形。
在开始使用Qt5开发OpenGL应用程序之前,我们需要安装Qt开发环境。
可以从Qt官方网站上下载并安装Qt Creator,它是一个集成开发环境,可以方便地创建和管理Qt项目。
一旦安装好Qt Creator,我们就可以开始创建一个新的Qt项目。
选择“新建项目”选项,然后选择“Qt Widgets Application”模板。
接下来,我们可以选择项目的名称和位置,并点击“下一步”。
在下一个对话框中,我们可以选择所需的模块。
在这里,我们需要选择“Qt OpenGL”模块,并点击“下一步”。
最后,我们可以选择项目的构建目标和构建工具链,并点击“完成”按钮。
创建好项目后,我们可以打开主窗口的源文件(通常是mainwindow.cpp),并添加一些与OpenGL相关的代码。
首先,我们需要在主窗口类的构造函数中创建一个QOpenGLWidget对象,它是一个用于显示OpenGL图形的窗口部件。
我们可以使用setCentralWidget函数将该窗口部件设置为主窗口的中央部件。
接下来,我们需要重写QOpenGLWidget的initializeGL、paintGL 和resizeGL函数。
initializeGL函数在OpenGL上下文初始化时被调用,我们可以在这里进行一些初始化操作,如设置OpenGL的状态。
paintGL函数在窗口需要重新绘制时被调用,我们可以在这里进行绘制操作。
第8章 Qt+OpenGL
glVertex3f glVertex2i glVertex3dv
Underlying storage mode is the same Easy to create overloaded functions in C++ but issue is efficiency
initializeGL()函数
前三行是关于depthbuffer(深度缓存), 深度缓存不断的对物体进入屏幕内部有多深 进行跟踪。 本程序其实没有真正使用深度缓存,但几乎 所有在屏幕上显示 3D场景 OpenGL 程序都 使用深度缓存。它的排序决定那个物体先画 。这样就不会将一个圆形后面的正方形画到 圆形上来。深度缓存是 OpenGL 十分重要 的部分。
/sdk/docs/man/ Qt中已经包含了 OpenGL模块
#include <qgl> / #include <QtOpenGL> QT += opengl
/doc/qt4.8/qtopengl.html
GL (Graphics Library): Library of 2-D, 3-D drawing primitives and operations
API for 3-D hardware acceleration
GLU (GL Utilities): Miscellaneous functions dealing with camera set-up and higher-level shape descriptions GLUT (GL Utility Toolkit): Window-system independent toolkit with numerous utility functions, mostly dealing with user interface
Qt的Graphics-View框架和OpenGL结合详解
Qt的Graphics-View框架和OpenGL结合详解Qt的Graphics-View框架和OpenGL结合详解演⽰程序下载地址:程序源代码下载地址:这是⼀篇纯技术⽂,介绍了这⼀个⽉来我抽时间研究的成果。
Qt中有⼀个⾮常炫的例⼦:Boxes,它展⽰了Qt能够让其Graphics–View框架和Qt的OpenGL模块结合起来,渲染出⾮常出⾊的效果。
其实我私⾃认为凭这个程序,已经有很多游戏开发者关注Qt了,因为游戏开发⼀个⾮常常见的模块就是UI,⼀般情况下游戏引擎提供的UI模块⽐较弱,基本上都是游戏引擎+第三⽅GUI库进⾏结合的。
但是Qt以其Graphics–View框架能够⾮常轻松地将UI控件嵌⼊场景中,⽽且能够和OpenGL底层共存,更重要的是,凭借着Qt的qss,Qt可以定制许多GUI元素,这是⾮常具有吸引⼒的。
所以说,如果⼤家对游戏开发感兴趣,那么不妨看⼀下Qt。
好了,下⾯介绍⼀下前⼏天我制作并发布的⼀个demo。
这个demo是对Boxes这个例⼦进⾏模仿,结合学习《OpenGL超级宝典》,制作⽽成的,由于最近⽐较忙,所以总共花了将近⼀个⽉才完成,不得不说效率有点⼉低。
⾸先从MainWindow.cpp这个⽂件说起吧,⼀开始是要初始化MainWindow类的,这个类是继承QMainWindow的,这⾥重点说说它的构造函数:MainWindow::MainWindow(QWidget*pParent):QMainWindow(pParent){QGLWidget*pWidget=new QGLWidget(QGLFormat(QGL::SampleBuffers),this);pWidget->makeCurrent();//scene的内容GraphicsScene*pScene=new GraphicsScene(this);OpenGLView*pView=new OpenGLView(this);pView->setViewport(pWidget);pView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);pView->setScene(pScene);//选择不同的着⾊器的时候进⾏着⾊器连接connect(pScene,SIGNAL(SwitchShader(const QString&)),pView,SLOT(SwitchShader(const QString&)));connect(pScene,SIGNAL(SetLightPos(const QVector3D&)),pView,SLOT(SetLightPos(const QVector3D&)));setCentralWidget(pView);setWindowTitle(tr("Lightforshader"));resize(640,360);}⾸先在我们创建了⼀个QWidget,然后调⽤makeCurrent()成员函数,其实意思是让它的rendercontext设为当前的rendercontext。
osgqopenglwidget linux 编译-概述说明以及解释
osgqopenglwidget linux 编译-概述说明以及解释1.引言1.1 概述概述部分内容:引言部分的概述用于介绍文章的背景和内容。
本文将讨论关于在Linux系统上编译OSGQOpenGLWidget的方法以及可能的问题和解决方法。
OSGQOpenGLWidget是一种用于在Qt应用程序中集成OpenSceneGraph的插件。
OpenSceneGraph (OSG) 是一个开源的3D 图形库,可用于创建交互式的3D应用程序。
Qt是一种跨平台的C++图形用户界面应用程序开发框架,被广泛应用于软件开发领域。
本文首先对OSG和Qt进行简要介绍,包括它们的特点、用途和优势。
然后,我们将重点讨论在Linux系统上编译OSGQOpenGLWidget的具体方法和步骤。
我们将提供详细的操作指南和示例代码,以帮助读者顺利完成编译过程。
此外,我们还将探讨在编译过程中可能遇到的一些常见问题,并给出相应的解决方法。
这些问题可能涉及依赖项安装、环境配置、库文件链接等方面。
我们将提供一些实用的技巧和建议,帮助读者快速克服这些难题。
通过本文的阅读,读者将了解到在Linux系统上编译OSGQOpenGLWidget所需的基本知识和技能。
希望本文能为希望在Linux平台上开发3D图形应用程序的开发者提供一些有用的信息和帮助。
接下来,我们将详细介绍OSG (OpenSceneGraph) 的相关内容。
1.2 文章结构文章结构的部分应该包括以下内容:文章结构部分旨在介绍本篇文章的整体组织和内容安排,为读者提供一个清晰的导读,方便他们快速了解文章的结构和内容组成。
本文的结构主要包括引言、正文和结论三个部分。
在引言部分,我们先对该篇文章进行了概述,简要介绍了将要讨论的主题。
接着,我们详细说明了文章的结构,即引言、正文和结论三个部分。
通过明确的讲述结构,读者可以更好地理解文章的内容和逻辑顺序。
正文部分将从两个方面展开。
首先,我们将介绍OSG (OpenSceneGraph)的概念和基本特点,包括其在图形渲染方面的应用和优势。
QtQOpenGLWidget类讲解
QtQOpenGLWidget类讲解Detailed DescriptionQOpenGLWidget类是⽤于渲染OpenGL图形。
除了可以选择使⽤QPainter和标准的OpenGL渲染图形,QOpenGLWidget类提供了在Qt应⽤程序中显⽰OpenGL图形的功能。
它使⽤起来⾮常简单:新建类继承于QOpenGLWidget,使⽤⽅法就像继承于QWidget类⼦类⼀样。
QOpenGLWidget类提供了三个⽅便的虚函数,可以在新建的⼦类中重新实现以完成OpenGL的任务:paintGL()—渲染OpenGL场景,需要更新Widget时就会调⽤。
resizeGL()—设置OpenGL视⼝,投影等。
每当调整Widget的⼤⼩时(第⼀次显⽰窗⼝Widget时会调⽤它,因为所有新创建Widget 都会⾃动获得调整⼤⼩的事件)。
initializeGL()—建⽴OpenGL的资源和状态。
在第⼀次调⽤resizeGL()或paintGL()之前调⽤⼀次。
如果需要从paintGL()以外的地⽅触发重绘(⼀个典型的例⼦是使⽤定时器为场景设置动画),应该调⽤widget的update()函数来进⾏更新。
当调⽤paintGL(),resizeGL()或initializeGL()时,Widget的OpenGL渲染环境需要设为当前。
如果需要从其他位置调⽤标准OpenGL API 函数(例如,Widget的构造函数或⾃⼰的绘图函数中),则必须⾸先调⽤makeCurrent()。
所有渲染都发⽣在OpenGL帧缓冲对象中,makeCurrent()确保它在渲染环境中,在paintGL()中的渲染代码中创建和绑定其他帧缓冲对象时,不要使⽤ID 0重新绑定帧缓冲区,⽽是调⽤defaultFramebufferObject()来获取应该绑定的ID。
QOpenGLWidget允许在平台⽀持时使⽤不同的OpenGL版本和配置⽂件。
详解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其实已经继承了该路径。
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对象占用的资源。
qopenglwidget linux编译-概述说明以及解释
qopenglwidget linux编译-概述说明以及解释1.引言1.1 概述QOpenGLWidget是Qt框架中的一个重要模块,用于在Qt应用程序中集成OpenGL渲染功能。
在Linux系统下编译QOpenGLWidget需要一定的技术和步骤,本文将详细介绍这些内容。
首先,我们将介绍QOpenGLWidget的基本特性和作用,以及在Qt 应用程序中的使用场景。
然后,我们将重点讨论在Linux系统下如何编译QOpenGLWidget,包括所需的环境配置、依赖库的安装和编译步骤。
通过本文的学习,读者将掌握在Linux系统下使用QOpenGLWidget 的方法,加深对Qt框架和OpenGL渲染技术的理解,为自己的项目开发提供更多的可能性和选择。
1.2 文章结构本文主要分为引言、正文和结论三部分。
在引言部分,将会对QOpenGLWidget进行简要的概述,介绍文章的结构和目的。
在正文部分,将详细介绍QOpenGLWidget的特点,以及在Linux下编译QOpenGLWidget的具体步骤。
同时,还将分享一些问题解决与调试技巧,帮助读者更好地应对可能遇到的困难。
最后,在结论部分,将对全文进行总结,展望QOpenGLWidget在未来的应用前景,并附上一些结束语,为全文画上一个完美的句号。
整个文章结构清晰,逻辑性强,希望读者能从中获得充分的收获和启发。
1.3 目的目的部分的内容应该主要介绍撰写这篇文章的目的和意义。
在这篇文章中,我们的主要目的是帮助读者了解如何在Linux系统上编译QOpenGLWidget。
通过详细介绍QOpenGLWidget的简介、编译步骤和问题解决与调试技巧,我们旨在提供读者一个全面的指南,让他们能够顺利地在Linux系统上使用QOpenGLWidget。
同时,本文也致力于推广并促进QOpenGLWidget在Linux系统中的应用,希望能够为开发人员提供更多更好的工具和资源,同时促进OpenGL技术在Linux系统中的发展。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解 Qt 写 OpenGL 入门示例
2011-07-01 17:12 佚名互联网我要评论(0)字号:T | T
本文介绍的是详解 Qt 写 OpenGL 入门示例,不多说,先来看详细内容。
AD:
Qt 写OpenGL 入门示例是本文所介绍的内容。
其实我个人是很喜欢玩游戏的,为什么呢?只是因为我还无法制作游戏.所以,以前就看过一些...东西. 比如directx/opengl. 可惜无法入门,而当年拼命的记忆那个windows api版的hello world(vc++自动生成)...在一个星期后便忘记了.使得我对windows上的编程充满了阴影(在若干年后,我终于明白你不需要去记忆具体api, 因为环境会给你提示) - windows都没入门, 怎么开始directx哦?(不过无数次的hello world,也有好处,就是让我明白了windows平台的消息循环机制...这让我在若干年后在看到qt的app.exec()时,心有灵犀的想, 哦,进入了消息循环了...)
后来自然就看看qt,看看c++、PHP就不说了,一直搞这个的)等. 还有有比如SDL一类的搞搞,但始终不得其门而入,qt有自带的提供给opengl的窗口类的. 在我以前, 反正也试过,这样那样的错误就放弃了...
不过不知道为什么, 现在却很简单,(可能做任何事情都有简单和难的时候,只是未到时间吧).,假如你也想玩玩qt? opengl的话, 那么先具体下面一些东西:
(1)OpenGL编程指南 (书, 里面有代码的,咋们参考一些)
(2)装了qt库和环境(windows下qt里应该有自带opengl, 所以opengl的库就不提了)
(3)编译器
那么我们就开始了...反正是很简单的入门...写个main.cpp, 如下
1.yarco@coto?~/Documents/test/1?$?cat?main.cpp ?
2.#include?<QApplication>?
3.#include?"MyWidget.h" ?
4.int?main(int?argc,?char*?argv[])?//?感慨一下:?万年不变的argc,?argv阿,让
每个程序员都感到亲切 ?
5.{ ?
6.????????QApplication?app(argc,?argv); ?
7.????????MyWidget?w; ?
8.????????w.show(); ?
9.????????return?app.exec(); ?
10.}?
然后就是我们自己定义的类MyWidget:
1.yarco@coto?~/Documents/test/1?$?cat?MyWidget.h ?
2.#include?<QGLWidget>?
3.class?MyWidget?:?public?QGLWidget ?
4.{ ?
5.public: ?
6.????????MyWidget(QWidget*?parent?=?0)?:?QGLWidget(parent)?{} ?
7.protected: ?
8.????????void?initializeGL(); ?
9.????????void?resizeGL(int?w,?int?h); ?
10.????????void?paintGL(); ?
11.}; ?
12.//?qt文档里的哦 ?
13.//?三个xxxGL必须实现 ?
14.//?也就是在这里,我们就可以使用opengl的指令了哦... ?
15.yarco@coto?~/Documents/test/1?$?cat?MyWidget.cpp ?
16.#include?"MyWidget.h" ?
17.void?MyWidget::initializeGL() ?
18.{ ?
19.} ?
20.void?MyWidget::resizeGL(int?w,?int?h) ?
21.{ ?
22.} ?
23.void?MyWidget::paintGL() ?
24.{ ?
25.????????renderText(20,?100,?"Hello,?My?first?OpenGL?app."); ?
26.} ?
27.//?啥都没有,只有调用qt提供的renderText来输出文字?
然后就是qt的编译步骤了...(不详细描述)
结果的效果图如下:
小结:详解 Qt 写OpenGL 入门示例的内容介绍完了,希望本文对你有所帮助!。