计算机图形学 -- 像素点的生成 [非常详细的解释~]

来源:互联网 发布:sql中count的用法 编辑:程序博客网 时间:2024/05/21 06:12


画点

+++++++++++++++++++++++++

glVertex : 指定顶点

“点”是一切的基础。
如何指定一个点呢?OpenGL 提供了一系列函数。它们都以 glVertex开头,后面跟一个数字和 1~2 个字母。
例如:
glVertex2d
glVertex2f
glVertex3f
glVertex3fv
等等。
数字表示参数的个数,2 表示有两个参数,3 表示三个,4 表示四个~ 字母表示参数的类型,
s 表示 16 位整数(OpenGL 中将这个类型定义为 GLshort),
i 表示 32 位整数(OpenGL 中将这个类型定义为 GLint 和 GLsizei),
f 表示 32 位浮点数(OpenGL 中将这个类型定义为 GLfloat 和 GLclampf),
d 表示 64 位浮点数(OpenGL 中将这个类型定义为 GLdouble 和 GLclampd)。
v 表示传递的几个参数将使用指针的方式,见下面的例子。

这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:
(一)glVertex2i(1, 3);
(二)glVertex2f(1.0f, 3.0f);
(三)glVertex3f(1.0f, 3.0f, 0.0f); //如果第三个参数没有指定,则默认为0.0f
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f); //如果第四个参数没有指定,则默认为1.0f
(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
 glVertex3fv(VertexArr3);


Code:


#include <GL/glut.h>#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);    glBegin(GL_POINTS);//把POINT改成LINE就可以画出一条线glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.0f);glEnd();glFlush();}int main(int argc, char *argv[]){    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);    glutInitWindowPosition(100, 100);    glutInitWindowSize(400, 400);    glutCreateWindow("POINT");    glutDisplayFunc(&myDisplay);    glutMainLoop();    return 0;}


下面分别对这些语句进行学习~


先从头文件开始:

首先,需要包含头文件#include <GL/glut.h>,这是 GLUT 的头文件。
本来 OpenGL 程序一般还要包含<GL/gl.h>和<GL/glu.h>,但 GLUT 的头文件中已经自动将这两个文件包含了,不必再次包含


==================================

主函数:

int main(int argc, char *argv[]) : 这个是带命令行参数的 main 函数,平常写的时候一般都省略了

下面是以glutInit开头的四个函数:

首先,以 glut 开头的函数都是GLUT 工具包所提供的函数

-------------------------------------------------------

这四个都是对窗口的初始化函数:

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

参数:
Argc:一个指针,指向从main()函数传递过来的没更改的argc变量。
Argv:一个指针,指向从main()函数传递过来的没更改的argv变量。

main函数的参数是操作系统传的,你不用管,参数直接原样丢给glutinit就可以了。
至于这个参数的用途,就得看你程序怎么写了。

比如说一个播放器,你直接双击运行它就只是运行EXE文件,不执行其它操作,
如果你拖一个视频到播放器的图标上,那么在运行EXE后它还会自动打开这个视频文件进行播放。

-------------------------------------------------------

glutInitDisplayMode,设置显示方式,

Void glutInitDisplayMode(unsighed int mode)

其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。

GLUT_SINGLE 表示使用单缓冲,与之对应的还有 GLUT_DOUBLE(使用双缓冲)。等等

-------------------------------------------------------

glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。

Void glutInitWindowPositon(int x,int y)

参数:

X: 距离屏幕左边的像素数。-1是默认值,意思就是由窗口管理程序决定窗口出现在哪里。如果不使用默认值,那你就自己设置一个值。
Y:距离屏幕上边的像素数。和X一样

-------------------------------------------------------

glutInitWindowSize,这个也简单,设置窗口的大小。

Void glutInitWindowSize(int width,int height)

参数:

Width:窗口的宽度。
Height:窗口的高度。
同样width,height也只是一个参考数字。避免使用负数。

-------------------------------------------------------

接下来的三个函数:

glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。

需要调用 glutMainLoop 才能看到窗口。

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

glutMainLoop,进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。)


==================================

用来画图的子函数:

glClear : 将缓存清除为预先的设置值, glClear的唯一参数表示需要被清除的缓冲区,

GL_COLOR_BUFFER_BIT 表示清除颜色, glClear 函数还可以清除其它的东西。

下面是 glBeginglEnd两个函数,我们发现他们是成对出现的

glBegin和glEnd函数限定了一组或多组图元的定点定义

OpenGL 要求:指定顶点的命令必须包含在 glBegin 函数之后,glEnd 函数之前(否则指定的顶点将被忽略)。并由 glBegin 来指明如何使用这些点。

除了程序中的POINT之外,它还支持其他方式来画出更多复杂的图形:

GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点
GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段
GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形
GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形
GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形
GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形
GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。

在他们之间可以调用的函数有:

glVertex*()   设置顶点坐标 

glColor*()   设置当前颜色 

glIndex*()   设置当前颜色表 
glNormal*()    设置法向坐标 
glEvalCoord*()    产生坐标 
glCallList(),glCallLists()   执行显示列表 
glTexCoord*()   设置纹理坐标 
glEdgeFlag*()   控制边界绘制 

glMaterial*()    设置材质

-------------------------------------------------------

glFlush,保证前面的 OpenGL 命令立即执行(而不是让它们在缓冲区中等待)。其作用跟 fflush(stdout)类似。


==================================

最后来说说这一句代码:#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

作用是去掉执行时必须出现的控制台窗口,要知道,那是很恶心人的


操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。
程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。

在VC下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用你自己编写的 main 函数;
对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的 WinMain 函数。

具体设置哪个入口点是由连接器的“/subsystem:”选项参数确定的,它告诉操作系统如何运行编译生成的.EXE文件。
可以指定四种方式:“CONSOLE|WINDOWS|NATIVE|POSIX”

如果这个选项参数的值为“WINDOWS”,则表示该应用程序运行时不需要控制台,
有关连接器参数选项的详细说明请参考 MSDN 库。

====================================