关于OpenGL的一些笔记

本文介绍了OpenGL的绘图原理,包括其C/S模型的工作流程、如何将三维物体投影到二维平面并进行像素处理,以及OpenGL中图元的定义与操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenGL指令模型是C/S模型,通常用户程序发出命令提交给内核程序,内核程序再对各种指令进行解释,并初步处理,之后交给操作系统服务而转交给硬件。

 

OpenGL具有超强的图形绘制能力,包括绘制物体、启动光照、管理位图、纹理映射、动画、图像增强以及交互技术等功能。综合以上功能,作为图形硬件的软件接口,OpenGL主要是将三维的物体投影到一个二维的平面上,之后处理得到像素,进行显示。该过程就是OpenGL的绘制过程。

OpenGL首先将物体转化为可以描述物体几何性质的顶点与描述图像的像素,在执行一系列操作后,最终将这些数据转化成像素数据。也就是说,OpenGL是基于点的。在OpenGL中,无论何种情况,指令总是被顺序处理。由一组顶点定义的图元执行完绘制操作后,后继图元才能作用。

有关图元的定义及操作:

图元是由一组顶点定义。这一组顶点可以是一个或多个顶点。可以独立处理该点信息或顺序处理。每个顶点的信息可以是二维的也可以是三维的,。这些坐标可以有由位置坐标、颜色值、法向量、纹理坐标组成。其中,法线、纹理、颜色值会在处理每个顶点的过程中被使用和改变。补充:纹理坐标决定图元上纹理图像的映射方式;法线用于光照计算;颜色和颜色的变化取决于是否有光照。OpenGL将点、线、多边形等通过在函数glBegin()和glEnd()之间的一系列顶点的数据绘制出图形。

一个简单的例子:

一个简单的OpenGL程序如下:(注意,如果需要编译并运行,需要正确安装GLUT)

#include <GL/glut.h>

void myDisplay(void)       //这个就是自定义的函数。想要画什么样子的图形,都可以在这里定义

{

          glClear(GL_COLOR_BUFFER_BIT);

          glRectf(-0.5f, -0.5f, 0.5f, 0.5f); glFlush();

}

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;

}

 

该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。
首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。 本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。 然后看main函数。 int main(int argc, char *argv[]),这个是带命令行参数的main函数,各位应该见过吧?没见过的同志们请多翻翻书,等弄明白了再往下看。 注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。这种以glut开头的函数都是
GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。

1、glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。

 2、glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。更多信息,请自己Google。当然以后的教程也会有一些讲解。

 3、glutInitWindowPosition设置窗口在屏幕中的位置。

 4、glutInitWindowSize,设置窗口的大小

5、glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。

 6、glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。(这个说法不够准确,但准确的说法可能初学者不太好理解,暂时这样说吧)。

7、glutMainLoop,进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。) 在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用myDisplay函数”。于是myDisplay函数就用来画图。观察myDisplay中的三个函数调用,发现它们都以gl开头。这种以gl开头的函数都是OpenGL的标准函数,下面对用到的函数进行介绍。

 

1、glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西,但这里不作介绍。 2、glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。 3、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。其作用跟fflush(stdout)类似。

 

对图元的操作:OpenGL用变换矩阵、光照、反走样、像素操作等方法控制图元的绘制。图元操作处理后,只留下可见部分,准备进行光栅化(投影)处理。像素处理比较特殊:对像素、位图、影像直接进行像素操作,然后进行光栅化,或者是有些数据被存储在纹理中供顶点使用

 

光栅化过程:将图元转化为二维图像,完成每个图像点的颜色与深度的计算,生成结果为基片,即单个图元的二维结果

 

基片操作:处理过程包括基片是否遮挡、测试、融合等,最后得到像素,存入显示帧缓冲中,完成整个绘制过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值