Bcb中使用Opengl的学习经历
OpenGL学习记录

OpenGL学习记录(二)---键盘控制GLUT允许我们编写程序,在里面加入键盘输入控制,包括了普通键,和其他特殊键(如F 1,UP)。
在这一章里我们将学习如何去检测哪个键被按下,可以从GLUT里得到些什么信息,和如何处理键盘输入。
处理按键消息,我们必须使用GLUT通知窗口系统,当某个键被按下时,哪个函数将完成所要求的操作。
我们同样是调用一个函数注册相关的回调函数。
当你按下一个键后,GLUT提供了两个函数为这个键盘消息注册回调。
第一个是glutKeyb oardFunc。
这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息。
普通键是指字母,数字,和其他可以用ASCII代码表示的键。
函数原型如下:void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y));参数:func: 处理普通按键消息的函数的名称。
如果传递NULL,则表示GLUT忽略普通按键消息。
这个作为glutKeyboardFunc函数参数的函数需要有三个形参。
第一个表示按下的键的A SCII码,其余两个提供了,当键按下时当前的鼠标位置。
鼠标位置是相对于当前客户窗口的左上角而言的。
一个经常的用法是当按下ESCAPE键时退出应用程序。
注意,我们提到过,glutMainLoo p函数产生的是一个永无止境的循环。
唯一的跳出循环的方法就是调用系统exit函数。
这就是我们函数要做的,当按下ESCAPE键调用exit函数终止应用程序(同时要记住在源代码包含头文件stdlib.h)。
下面就是这个函数的代码:void processNormalKeys(unsigned char key,int x,int y){if(key==27)Exit(0);}下面让我们控制特殊键的按键消息。
GLUT提供函数glutSpecialFunc以便当有特殊键按下的消息时,你能注册你的函数。
Opengl实验报告及源代码实验三 着色器编程

实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称实验三着色器编程二、实验内容1.利用OpenGL的顶点数组对象、顶点缓冲对象和索引缓冲对象组织图元数据,设置图元属性,进行核心模式的图元渲染。
2.编写顶点着色器、片段着色器代码,进行代码的编译和链接形成着色器程序,采用核心模式绘制OpenGL几何图元。
3.采用文件形式保存着色器代码,编写着色器类,在着色器类中实现着色器代码的加载、编译和链接。
三、实验目的1.掌握顶点数组对象、顶点缓冲对象和索引缓冲对象的创建、数据缓存、属性设置和绑定方法。
2.掌握顶点着色器和片段着色器的定义、代码加载、程序编译方法,着色器程序的定义、链接和使用方法。
3.掌握如何采用面向对象方法封装着色器的代码加载、程序编译方法和链接方法。
四、实验步骤1.新建项目OPengl02,在项目下添加opengl02.cpp文件和glad.c文件;2.在opengl02.cpp文件中,添加代码:(1)定义几何图元的顶点数据和索引数据GLfloat vertices[] = {0.5f, 0.5f, 0.0f, // Top Right0.5f, -0.5f, 0.0f, // Bottom Right-0.5f, -0.5f, 0.0f, // Bottom Left-0.5f, 0.5f, 0.0f // Top Left};GLuint indices[] = { // Note that we start from 0!0, 1, 3, // First Triangle1, 2, 3 // Second Triangle};(2)创建顶点数组对象、顶点缓冲对象和索引缓冲对象,绑定相关对象,缓存数据、设置顶点属性。
GLuint VBO, VAO, EBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenBuffers(1, &EBO);// Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);// Note that this is allowed, the call to glVertexAttribPointer registered VBO as thecurrently bound vertex buffer object so afterwards we can safely unbindglBindVertexArray(0);// Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs), remember: do NOT unbind the EBO, keep it bound to this VAO(3)编写顶点着色器、片段着色器代码。
实验二OpenGL的简单动画

实验⼆OpenGL的简单动画实验⼆ OpenGL的简单动画Lab2_animation⼀、实验⽬的1、掌握OpenGL的闲置函数2、掌握OpenGL的时间函数3、掌握OpenGL的简单动画功能。
4、掌握OpenGL的闲置函数与简单动画。
5、了解OpengGL裁剪窗⼝、视区、显⽰窗⼝的概念和它们之间的关系。
6、进⼀步掌握OpenGL的基本图元的绘制。
⼆、实验环境硬件要求:PC机,主流配置,最好为独⽴显卡,显存512M以上。
软件环境:操作系统:Windows XP。
语⾔开发⼯具:Microsoft Visual studio 2008,Visual C++。
三、实验内容与要求要求:实验课上⽼师要求的效果截图、及其相应代码拷贝到实验报告⽂档⾥。
WORD⽂档命名⽅式:学号姓名-实验序号-实验名称。
内容:1、闲置函数的使⽤与简单动画。
(1) 旋转的六边形,如图3-1所⽰阅读五 ,5.1)中旋转的六边形样本框架程序,分析程序的实现步骤:运⾏该程序,观察旋转动画效果。
思考: 如果要调整旋转速度,旋转更快或更慢,应该如何修改程序?图3-1(2) 线框六边形在display 函数中添加多边形模式设置语句观看效果。
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); //线框模式添加线宽语句观看效果glLineWidth(2.0); //设置线宽重回多边形填充模式:glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); //填充模式(3) 在图形中添加字符"Hello",观察结果;然后将"Hello"字符改为⾃⼰名字的拼⾳或英⽂名字。
如图3-2所⽰。
提⽰:在图形中添加如下代码:glColor3f(1,0,0); //设置红⾊绘制颜⾊glRasterPos2i(30,20); //定位当前光标,起始字符位置glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'H'); //写字符"H"glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'e'); //写字符"e"glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'l'); //写字符"l"glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'l'); //写字符"l"glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'o'); //写字符"o"(4) 变⾊技术举例:在程序头部设置全部变量:int k=0;在myidle函数中添加代码:if (k==1){ glColor3f(1,0,0) ;k=0;}else{glColor3f(1,1,0) ;k=1;}然后在绘制函数中屏蔽原来的绘制颜⾊,运⾏查看效果(5) 六边形静⽌,直线单独旋转,如图3-2所⽰。
我的OpenGL学习

建立一个OpenGL工程
建立过程大家都很清楚,主要看下面一个简 单的代码
#include <GL/glut.h> int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("第一个OpenGL程序"); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0; }
void glLineStipple(GLint factor, GLushort pat tern); 设置虚线的样式
void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_LINE_STIPPLE); glLineStipple(2, 0x0F0F); glLineWidth(10.0f);
OpenGL的安装
首先,选择编译环境:Windows系统的主流编 译环境有Visual Studio,Broland C++ Builder, Dev-C++等 ,我们一般选用的是Visual Studio 系列。
然后,安装GLUT工具包。
OpenGL的安装
Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在 文件夹(VisualStudio系列应该是其安装目录下面 的“VC\PlatformSDK\include\gl文件夹”)。把解 压得到的glut.h放到这个文件夹。 3、把解压得到的glut.lib和glut32.lib放到静态函数库 所在文件夹( VisualStudio系列应该是其安装目录 下面的“VC\lib”文件夹)。 4、把解压得到的glut.dll和glut32.dll放到操作系统目 录下面的system32文件夹内。(典型的位置为: C:\Windows\System32)
opengl实验报告

opengl实验报告OpenGL实验报告引言:OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
Bcb中使用Opengl的学习经历

Bcb中使用Opengl的学习经历作者:太乙散数摘要:用一个简单的例子,阐述了bcb中使用opengl的简单方法,包括初始化框架、旋转和平移图形、清除图像、初始化背景色以及在刷新时保持图像。
关键词:bcb6 opengl 旋转清除平移到今天,终于把bcb6中应用Opengl的基本流程等弄清楚了,想想学之费时费力,特总结出来让后来者方便!网上有很多Opengl应用的书和帖子,我也从中吸取了很多经验,但总感觉这些书和帖子没有把新手最想知道的最基础的东西讲明白。
为了浅显易懂,以一个例子来讲整个流程。
首先创建一个新的Form(Form1 在后面的代码中我是这么定义的),然后在上面放置一个panel(Panel1)和7个Button(具体见图1)。
其中,Button1是绘图按钮,button2是清除按钮,button3是平移图像按钮,button4~7分别左旋、右旋、上旋、下旋按钮(担心图片不能上传,故唠叨几句)。
这个例子的功能就是:在panel1上用opengl绘图,然后用7个button 操作图形。
图1 opengl应用实例下面介绍具体的操作流程:1)设置opengl的绘图环境。
在bcb6中,只需在头文件中加入#include <GL/gl.h>、#include <GL/glu.h>两个命令即可。
2)设置hDC,即绘图区的句柄或指针,目的使程序知道你想在那那个区域绘画。
首先需要在头文件中声明HDC hDC,然后在TForm(Owner)函数下面初始化,本文的绘图区为Panel,所以hDC= hDC=GetDC(Form1->Panel1->Handle);接着要对hDC的像素格式进行设置,SetDCPixelFormat(hDC),其实初学者大可不理会这个函数。
3) 设置RC(Rendering Context),老妖翻译为“图像操作描述表”,很晦涩。
我认为就是与Opengl的绘图功能连接的一个通道,建议翻译为“背景通道”。
OpenGL上机报告

目录实验一中点算法 (2)一、实验目的和要求 (2)二、主要算法描述 (2)三、代码实现 (4)四、实验结果 (7)实验二Bezier曲线画茶壶 (11)一、实验目的和要求 (11)二、主要算法描述 (11)三、代码实现 (12)四、实验结果 (15)心得体会: (16)实验一 中点算法一、实验目的和要求学习使用OpenGL ,初步了解基本的OpenGL 编程方法。
熟练掌握中点算法,知道如何运用中点算法编程绘制直线、椭圆和圆。
编制中点画圆程序,上机实现在给定条件下下用中点算法画出圆形。
二、主要算法描述试验设计思路:圆是一个八分对称的图形,因此在计算圆上像素点的坐标时,可以只计算八分之一个圆,再依照对称原理算出其他七段的像素点(如下图)。
设圆方程的隐函数表示为 类似于中点法绘制直线的原理,我们将平面点划分为圆内和圆外(如下图):圆弧外的点:F(X ,Y)>0;圆弧内的点:F(X ,Y)<0;),(222=-+=R y x y x F假设在),(i i y x 绘制了一个像素,则下一步必须确定像素位置是),1(i i y x +还是)1,1(-+i i y x 更接近圆。
一次由两个点的中点决定,若中点)21,1(-+i i y x 在圆内,则说明)1,1(-+i i y x 更接近圆,否则说明),1(i i y x +更接近圆(如下图)。
为了在计算中避开计算圆的方程时会遇到的平方与开方,故运用迭代方法由式1211++=++i i i x p p 与111212+++-++=i i i i y x p p 计算决定参数。
试验编程思路:1. 输入圆半径r 和圆心),(c c y x ,并得到圆周(圆心在原点)上的第一个点:),0(),(00r y x =2. 计算决策参数的初值:r p -=103. 在每个k x 位置,从0=k 开始,完成下列测试:加入0<k p ,圆心在原点的下一个点位),(1k k y x +,并且1211++=++k k k x p p否则,圆的下一个点是)1,1(-+k k y x ,并且111212+++-++=k k k k y x p p其中11+=+k k x x 且11-=+k k y y4.确定其他七个八分圆中的对称点。
计算机形学实训课程学习总结利用OpenGL进行三维渲染与动设计

计算机形学实训课程学习总结利用OpenGL进行三维渲染与动设计计算机形学实训课程学习总结——利用OpenGL进行三维渲染与动设计在计算机形学实训课程中,我们学习了如何利用OpenGL进行三维渲染与动设计。
通过这门课程的学习,我对计算机图形学和OpenGL有了更深入的了解,并且掌握了一些基本的三维渲染和动画设计技术。
在本文中,我将总结我在这门课程中的学习和体会。
首先,在课程中我们学习了计算机图形学的基础知识。
我们了解了计算机图形学的基本概念、渲染管线的工作原理以及一些基本的数学知识。
这些基础知识为我们后续的学习和实践打下了坚实的基础。
接着,我们学习了OpenGL的基本用法。
OpenGL是一套跨平台、高性能的图形库,广泛应用于计算机图形学和游戏开发领域。
通过学习OpenGL,我们能够使用它提供的接口函数绘制基本的图形和渲染效果。
我们学习了OpenGL的初始化过程、绘制基本图形的方法以及纹理贴图等高级特性的使用方法。
通过编写代码实践,我们能够将所学的知识应用到实际的图形渲染中,达到自己预期的效果。
在实践环节中,我们进行了三维渲染和动画设计的项目实践。
我们学习了如何使用OpenGL绘制三维模型并进行渲染。
通过导入模型文件、设置材质和光照等参数,我们能够让模型呈现逼真的效果。
同时,我们也学习了如何添加动画效果,让模型在场景中运动起来。
通过控制模型的变换矩阵和设置关键帧,我们能够制作出流畅的动画效果。
除了基本的三维渲染和动画设计,我们还学习了一些高级的图形效果和技术。
例如,我们学习了阴影的渲染方法,包括平面阴影和体积阴影的实现。
我们还学习了粒子系统的设计和实现,通过控制粒子的参数和行为,可以制作出各种特效,如烟雾、火焰等。
在整个实践过程中,我不仅学到了很多有关计算机图形学和OpenGL的知识,还提高了编程能力和问题解决能力。
在实现特定效果的过程中,我们经常会遇到各种各样的问题,如渲染错误、性能问题等。
通过查阅资料和与同学讨论,我学会了如何解决这些问题,并且能够修复错误并改进我的代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Bcb中使用Opengl的学习经历作者:太乙散数摘要:用一个简单的例子,阐述了bcb中使用opengl的简单方法,包括初始化框架、旋转和平移图形、清除图像、初始化背景色以及在刷新时保持图像。
关键词:bcb6 opengl 旋转清除平移到今天,终于把bcb6中应用Opengl的基本流程等弄清楚了,想想学之费时费力,特总结出来让后来者方便!网上有很多Opengl应用的书和帖子,我也从中吸取了很多经验,但总感觉这些书和帖子没有把新手最想知道的最基础的东西讲明白。
为了浅显易懂,以一个例子来讲整个流程。
首先创建一个新的Form(Form1 在后面的代码中我是这么定义的),然后在上面放置一个panel(Panel1)和7个Button(具体见图1)。
其中,Button1是绘图按钮,button2是清除按钮,button3是平移图像按钮,button4~7分别左旋、右旋、上旋、下旋按钮(担心图片不能上传,故唠叨几句)。
这个例子的功能就是:在panel1上用opengl绘图,然后用7个button 操作图形。
图1 opengl应用实例下面介绍具体的操作流程:1)设置opengl的绘图环境。
在bcb6中,只需在头文件中加入#include <GL/gl.h>、#include <GL/glu.h>两个命令即可。
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 <Classes.hpp>#include <Controls.hpp>#include <StdCtrls.hpp>#include <Forms.hpp>#include <ExtCtrls.hpp>#include <GL/gl.h>#include <GL/glu.h>//---------------------------------------------------------------------------class TForm1 : public TForm{__published: // IDE-managed ComponentsTButton *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 <vcl.h>#pragma hdrstop#include "openglexam.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){Application->OnIdle = IdleLoop;hDC=GetDC(Form1->Panel1->Handle);//获取一个DC,SetDCPixelFormat(hDC); //调整该DC的象素格式hRC=wglCreateContext(hDC); //用这种DC去创建一个RCwglMakeCurrent(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 PIXELFORMA TDESCRIPTOR pfd = {sizeof(PIXELFORMA TDESCRIPTOR), // Size of this structure1, // V ersion of this structurePFD_DRA W_TO_WINDOW | // Draw to Window (not to bitmap)PFD_SUPPORT_OPENGL | // Support OpenGL calls in windowPFD_DOUBLEBUFFER, // Double buffered modePFD_TYPE_RGBA, // RGBA Color mode24, // Want 24bit color0,0,0,0,0,0, // Not used to select mode0,0, // Not used to select mode0,0,0,0,0, // Not used to select mode32, // Size of depth buffer0, // Not used to select mode0, // Not used to select modePFD_MAIN_PLANE, // Draw in main plane0, // Not used to select mode0,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 contextSetPixelFormat(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和当前DCwglDeleteContext(hRC);//删除该RCDeleteObject(hDC);//删除Windows DC。