第二章opengl绘图入门
2.1 生成图像初步
看完这节,自己感觉为后便铺垫的一点就是坐标系的建立,在opengl里,初始坐标是x向右递增,y向上递增。
有些段落时为了以后更深入理解opengl里的函数包做出解释
比如说 伪代码 line(100,50,150,80)其函数原型lineTo
当然,lineTo 函数和drawDot函数一样是需要自己定义的。至于具体怎么样定义,后边会做具体解释。
还有关于cp的概念,以后再做仔细的研究。
2.11
设备无关的编程和opengl
设备无关的编程:同样的程序可以再不同的图形环境里编译和运行,并且能保证在每台机器上显示相同的图形。
2.12
窗口的编程
自己感觉关于事件驱动的编程有点儿深奥~C++学的还是不够深入,而且感觉这方便的知识应该在2.5键盘函数的调用上有关,在看看2.5时在对这段话着重理解。
总之,窗口的创建有以下基本操作:
1. 设计一个窗口类
2. 注册窗口类
3. 创建窗口类
4. 显示及更新窗口
5. 消息循环。(自己也是编程菜鸟,欢迎众位拍砖)
好了,下面就涉及到我关注的重点:OPENGL
4种主要的opengl库:
1基本gl库:它提供opengl的基本函数。
2 GLUT库:GL实用工具包,他主要用来打开窗口,开发和管理菜单,以及管理菜单等。
3 GLU 库:GL实用库,他提供高级例程,处理矩阵操作和绘制二次曲面如球和2次圆柱体。
4GLUI库,只要使用GLUT,GLUI就将适当的运行。GLUI为OPENGL程序提供了良好的控制工具和菜单。
glutDisplayFunc(myDisplay)
glutReshapefunc(myReshape)
…
还有一些鼠标,键盘触发回调函数,就不一一列出了。
最后一个函数glutMainLoop().
当执行这个函数时,程序绘制完初始图形,并进入循环,一直等待时间发生。
2.13如何打开一个窗口画图
void main(int argc,char** argv)
glutInit(&argc,argv);
//初始化工具包
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
// GLUT_SINGLE|GLUT_RGB为两个或关系的状态常量,表明应分配单个显示缓存,而且颜色有所需的红绿蓝三色的数量来指定
glutInitWindowSize(640,480);//指定窗口的大小
glutInitWindowPosition(100,150)该函数指定窗口在屏幕上相对于左上角的位置,拒左边100个像素,顶点150个像素。
glutCreateWindow(“创建窗口的名字”)
//注册回调函数
glutDisplayFunc(myDisplay);
glutReshapeFunc(myReshape);
glutMouseFunc(myMouse);
glutKeyboardFunc(myKenboard);
myInit();
glutMainLoop();
}
2.2 opengl
基本元素图形
具体感念就在这一一略过,感兴趣的朋友可以自己去看书,这里就把已经运行的程序拿出来,最一些具体的函数写一些自己的感想。同时把几个重要函数标出。
#include<windows.h>
#include<gl.h>
#include<glu.h>
#include<glut.h>
#include<math.h>
const int screenWidth=640;
const int screenHeight=480;
GLdouble A,B,C,D;
/*struct GLPoint{
GLfloat x,y;
};
void drawDot(int x, int y)
//
书中没有该函数的定义,后来查找才发现,函数根本就不是库函数里的一员,需要自己定义。同时对于
glBegin()
和
glEnd
也需要多多关注。
{
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glFlush();
}*/
//
定义
myinit
函数,在函数中初始化背景,点颜色等
void myInit(void)
{
glClearColor(1.0,1.0,1.0,0.0);//
使北京变为所需要的颜色,
RBG
结构。
glColor3f(0.0f,0.0f,0.0f);//
所要画点的颜色
glPointSize(2.0);//
所要画点的大小
glMatrixMode(GL_PROJECTION); //
设置合适的矩阵:发射矩阵。
glLoadIdentity();
gluOrtho2D(0.0,640.0,0.0,480.0); //
这三个函数都是不知道的属性设置,还需积雪学习
同时这三个函数也是在建立一个简单的坐标系,在后边涉及到立体坐标系的时候应该有所改变
A=screenWidth/4;
B=0.0;
C=D=screenHeight/2.0;
}
//
画点函数,整个函数的关键部分
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT); //GL_COLOR_BUFFER_BIT
是一个内置常数
glBegin(GL_POINTS);// GL_POINTS
是一个控制常量,可是是划线,也可以使画多变形。
for(GLdouble x=0;x<55000;x+=0.005)
{
GLdouble func=exp(-x)*cos(2*3.14159265*x);
glVertex2d(A*x+B,C*func+D);
}
glEnd();
glFlush();
}//
所画函数的核心语句,每个点都取值。
/*void sierpinski_render(void) //
这个函数时画赛平斯基的函数
{
glClear(GL_COLOR_BUFFER_BIT);
GLPoint T[3]={{10,10},{600,10},{300,450}}; //
定义三个不同的点
int index=rand()%3;
GLPoint point=T[index];
drawDot(point.x,point.y);
for(int i=0;i<55000;i++)
{
index=rand()%3; //
取任意值的函数
point.x=(point.x+T[index].x)/2;
point.y=(point.y+T[index].y)/2;
drawDot(point.x,point.y);
}
glFlush(); //
保证所有数据被显示并处理
}*/
void main(int argc,char ** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,150);
glutCreateWindow("my firse open gl");
glutDisplayFunc(myDisplay);
myInit();
glutMainLoop();
}
后边的主函数在前边已经写过心得,就不多说了~呵呵~这是我写的第一个图形。图形出现的时候,我觉得一切都是值得的。