Bcb中使用Opengl的学习经历.doc_第1页
Bcb中使用Opengl的学习经历.doc_第2页
Bcb中使用Opengl的学习经历.doc_第3页
Bcb中使用Opengl的学习经历.doc_第4页
Bcb中使用Opengl的学习经历.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Bcb中使用Opengl的学习经历作者:太乙散数摘要:用一个简单的例子,阐述了bcb中使用opengl的简单方法,包括初始化框架、旋转和平移图形、清除图像、初始化背景色以及在刷新时保持图像。关键词:bcb6 opengl 旋转 清除 平移 到今天,终于把bcb6中应用Opengl的基本流程等弄清楚了,想想学之费时费力,特总结出来让后来者方便!网上有很多Opengl应用的书和帖子,我也从中吸取了很多经验,但总感觉这些书和帖子没有把新手最想知道的最基础的东西讲明白。为了浅显易懂,以一个例子来讲整个流程。首先创建一个新的Form(Form1 在后面的代码中我是这么定义的),然后在上面放置一个panel(Panel1)和 7个Button(具体见图1)。其中,Button1是绘图按钮,button2是清除按钮,button3是平移图像按钮,button47分别左旋、右旋、上旋、下旋按钮(担心图片不能上传,故唠叨几句)。这个例子的功能就是:在panel1上用opengl绘图,然后用7个button操作图形。图1 opengl应用实例下面介绍具体的操作流程:1)设置opengl的绘图环境。在bcb6中,只需在头文件中加入#include 、#include 两个命令即可。2)设置hDC,即绘图区的句柄或指针,目的使程序知道你想在那那个区域绘画。首先需要在头文件中声明HDC hDC,然后在TForm(Owner)函数下面初始化,本文的绘图区为Panel,所以hDC= hDC=GetDC(Form1-Panel1-Handle); 接着要对hDC的像素格式进行设置,SetDCPixelFormat(hDC),其实初学者大可不理会这个函数。3) 设置RC(Rendering Context),老妖翻译为“图像操作描述表”,很晦涩。我认为就是与Opengl的绘图功能连接的一个通道,建议翻译为“背景通道”。首先要在头文件中声明HGLRC hRC;然后在TForm(Owner)函数下面初始化,要紧跟在hDC初始化之后: hRC=wglCreateContext(hDC);wglMakeCurrent(hDC,hRC)。hRC只在此处有使用,后面就不会应用到。4)在bcb中还有个比较特别的函数需要提前声明,那就是void _fastcall TForm1:IdleLoop(TObject*, bool& done),这个函数的功能就是控制屏幕刷新时绘图区的的情况。这个函数是个自定义函数在头文件中需要先声明。然后把Application-OnIdle = IdleLoop放入TForm(Owner),要放在第一句。这样就可以调用这个IdleLoop函数,为什么这样能调用,我不是很明白?可参考bcb中自带的opengl例子。5)在绘图之前,还得对初始化的量hRC、hDC进行关闭设置,在FormDestroy(TObject *Sender)函数中设置。 6)opengl绘图。我把opengl的绘图语句放在button1的单击事件里。首先清除背景色,或者说叫重设背景色:glClearColor(0.5,0.7,0.9,1.0)、 glClear(GL_COLOR_BUFFER_BIT); 然后用glBegin和glEnd之间语句绘图;最后刷新缓存SwapBuffers(hDC)。后面的程序把绘图语句全放入RenderScence()函数里,所以在Button1Click(TObject *Sender)函数中只需调用RenderScence()。注:要保证绘图后图形一直存在,除非自己清除,那么就必须在IdleLoop函数写入if(Sender=Button1) Button1Click(Sender); 7)很简单吧,图像能够绘制了!然后就需要对图像进行操作设置了。首先清除图像,只需在button2中重新刷新背景色;然后平移图像,只需在button3中写入glTranslatef(0.25,0,0)(这个命令的意思是将图形右移动0.25个单位。有时在0.25后加f,即0.25f,是指0.25是一个float类型的数),注意接着要重新画图形即调用RenderScence()。左右上下旋转与此雷同,就不一一介绍了。旋转的函数为glRotatef(-5, 1.0, 0.0, 0.0)(这个命令的意思是向上旋转5,也就是说你点击一下,即向上旋转5)。8)文中还有一个功能,就是在一开始就把panel1的背景色绘上,但不绘图。要实现这功能,必须FormCreate(TObject *Sender) 、FormPaint(TObject *Sender)配合使用,为什么要这样未搞清楚!9)很好,可以画图,可以简单操作了。后续还有很多工作要做,比如窗口的设置、光源的设置、图像的大小设置等等,但只要入了门,看相关的书籍就容易多了,祝大家学习轻松、学习快乐!希望本文能对你有一点点帮助。附件:源程序头文件程序*.h/-#ifndef openglexamH#define openglexamH/-#include #include #include #include #include #include #include /-class TForm1 : public TForm_published:/ IDE-managed Components TButton *Button1; TPanel *Panel1; TButton *Button2; TButton *Button3; TButton *Button4; TButton *Button5; TButton *Button6; TButton *Button7; void _fastcall FormPaint(TObject *Sender); void _fastcall FormDestroy(TObject *Sender); void _fastcall FormResize(TObject *Sender); void _fastcall Button1Click(TObject *Sender); void _fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void _fastcall Button2Click(TObject *Sender); void _fastcall FormCreate(TObject *Sender); void _fastcall Button3Click(TObject *Sender);private:/ User declarationspublic:/ User declarations _fastcall TForm1(TComponent* Owner); HGLRC hRC; HDC hDC; void _fastcall IdleLoop(TObject*, bool&); void _fastcall SetDCPixelFormat(HDC hDC); void _fastcall RenderScence();/-extern PACKAGE TForm1 *Form1;/-#endifCpp文件源代码:/-#include #pragma hdrstop#include openglexam.h/-#pragma package(smart_init)#pragma resource *.dfmTForm1 *Form1;/-_fastcall TForm1:TForm1(TComponent* Owner) : TForm(Owner) Application-OnIdle = IdleLoop; hDC=GetDC(Form1-Panel1-Handle);/获取一个DC, SetDCPixelFormat(hDC); /调整该DC的象素格式 hRC=wglCreateContext(hDC); /用这种DC去创建一个RC wglMakeCurrent(hDC,hRC); /指定当前DC、当前RC为hDC、hRC/-void _fastcall TForm1:IdleLoop(TObject*, bool& done) done = false; TObject *Sender; if(Sender=Button1) Button1Click(Sender);/-void _fastcall TForm1:SetDCPixelFormat(HDC hDC) /本函数用于调整DC的象素格式,如缓冲区、颜色数等 /先不深究,只要知道它的作用就行 int nPixelFormat; static PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / Size of this structure 1, / Version of this structure PFD_DRAW_TO_WINDOW | / Draw to Window (not to bitmap) PFD_SUPPORT_OPENGL | / Support OpenGL calls in window PFD_DOUBLEBUFFER, / Double buffered mode PFD_TYPE_RGBA, / RGBA Color mode 24, / Want 24bit color 0,0,0,0,0,0, / Not used to select mode 0,0, / Not used to select mode 0,0,0,0,0, / Not used to select mode 32, / Size of depth buffer 0, / Not used to select mode 0, / Not used to select mode PFD_MAIN_PLANE, / Draw in main plane 0, / Not used to select mode 0,0,0 ; / Not used to select mode / Choose a pixel format that best matches that described in pfd nPixelFormat = ChoosePixelFormat(hDC, &pfd); / Set the pixel format for the device context SetPixelFormat(hDC, nPixelFormat, &pfd);/-void _fastcall TForm1:FormPaint(TObject *Sender) glClearColor(0.5,0.7,0.9,1.0); /指定背景颜色(依次为RGBA) glClear(GL_COLOR_BUFFER_BIT); SwapBuffers(hDC);/-void _fastcall TForm1:FormDestroy(TObject *Sender) wglMakeCurrent(NULL,NULL);/取消当前RC和当前DC wglDeleteContext(hRC);/删除该RC DeleteObject(hDC);/删除Windows DC。/-void _fastcall TForm1:RenderScence()glClearColor(0.5,0.7,0.9,1.0); /指定背景颜色(依次为RGBA)glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);glColor3f(1.0,0.0,0.0);glVertex3f(-1.0,0.0,0.0);glColor3f(0.0,1.0,0.0);glVertex3f(0.0,1.0,0.0);glColor3f(0.0,0.0,1.0);glVertex3f(1.0,0.0,0.0);glEnd();SwapBuffers(hDC);/-void _fastcall TForm1:Button1Click(TObject *Sender) RenderScence();/-void _fastcall TForm1:Button2Click(TObject *Sender) glClearColor(0.5,0.7,0.9,1.0); /指定背景颜色(依次为RGBA) glClear(GL_COLOR_BUFFER_BIT); /用背景色清窗口 SwapBuffers(hDC);/-void _fastcall TForm1:FormCreate(TObject *Sender) glClearColor(0.5,0.7,0.9,1.0); /指定背景颜色(依次为RGBA) glClear(GL_COLOR_BUFFER_BIT); /用背景色清窗口 /glFlush(); SwapBuffers(hDC);/-void _fastcall TForm1:Button3Click(TObject *Sender) glTranslatef(0.25,0,0); RenderScence();/-void _fastcall TForm1:Button6Click(TObject *Sender) glRotatef(-5, 1.0, 0.0, 0.0); RenderScence();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论