计算机图形学 -- 像素点的生成 [非常详细的解释~]
来源:互联网 发布: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 函数还可以清除其它的东西。
下面是 glBegin 和glEnd两个函数,我们发现他们是成对出现的
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 库。
====================================
- 计算机图形学 -- 像素点的生成 [非常详细的解释~]
- 计算机图形学L系统生成树的简单解释
- 【计算机图形学】一、直线的生成
- 【计算机图形学】二、椭圆的生成
- 【计算机图形学】三、bezier曲线的生成
- 计算机图形学 - 抛物线的中点生成算法
- 计算机图形学-直线的生成算法
- 非常详细的/etc/passwd解释
- 非常详细的/etc/passwd解释
- 非常详细的/etc/passwd解释
- 非常详细的/etc/passwd解释
- 非常详细的/etc/passwd解释
- 非常详细的/etc/passwd解释
- 非常详细的/etc/passwd解释
- springmvc非常详细的解释@Autowired
- 非常详细的/etc/passwd解释
- 计算机图形学的学习
- 计算机图形学的学习
- 10分钟学会松腰
- OpenLayer(Panel & event)
- [google面试CTCI] 2-4 计算两个单链表所代表的数之和
- 对前后摆发力的讨论
- 对大学的期望和目标
- 计算机图形学 -- 像素点的生成 [非常详细的解释~]
- dbms_workload_repository手工管理AWR
- APP支持请回复相关主题帖或邮件至 developer.haipeng.zhao@gmail.com
- 回头看看走过的路,花开花落,很坦然
- debug assertion failed! winocc.cpp line 381
- HEVC码率控制浅析——HM代码阅读之一
- 移植EMCV到DM6467(5)——修改encodedecode demo测试算法封装
- 软件工程基础 八
- 网络性能测试工具iperf编译记录