参考《opengl入门教程》、《OpenGL之坐标转换》、《OpenGL绘制管线操作细节》等资料。
复习下留个备忘:)
/*- * Opengl Demo Test * * Fredric : 2016-7-8 */ #include <GLUT/GLUT.h> void display_demo01(); void display_demo02(); void display_demo03(); void display_demo04(); /* * Main Function */ int main(int argc, char ** argv) { /* glutInit * GLUT初始化 */ glutInit(&argc, argv); /* * int glutCreateWindow(char* name); * 产生一个顶层窗口 * char* name:窗口名称 * return int:窗口标记符号,可以glutGetWindow获取引用 */ glutCreateWindow("Fredric Practice Demo"); /* * void glutDisplayFunc(void (*func)(void)); * 为当前窗口设置显示回调函数 */ glutDisplayFunc(display_demo04); /* * void glutMainLoop() * glut程序进入事件循环 */ glutMainLoop(); } //**************************************************************************** /* * 基础显示函数demo */ void display_demo01(){ /* * void glClear(GLbitfield mask); * 根据mask的要求清除缓冲值 * GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲 * GL_DEPTH_BUFFER_BIT: 深度缓冲 * GL_ACCUM_BUFFER_BIT: 累积缓冲 * GL_STENCIL_BUFFER_BIT: 模板缓冲 */ glClear(GL_COLOR_BUFFER_BIT); /* * void glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) * 等价于: * glBegin(GL_POLYGON); * glVertex2(x1, y1); * glVertex2(x2, y1); * glVertex2(x2, y2); * glVertex2(x1, y2); * glEnd(); * 在opengl的世界坐标系中,(0,0,0)是屏幕中心的原点,整个窗口范围为-1到1 * 在下例中绘制的矩形覆盖全部窗口 */ glRectf(-1.0f, -1.0f, 1.0f, 1.0f); /* * opengl命令立即执行 */ glFlush(); } //**************************************************************************** /* * 绘制基本图形demo */ void display_demo02(){ //绘制点 glClear(GL_COLOR_BUFFER_BIT); /* * 限定一组或多组图元的定义 */ glBegin(GL_POINTS); /* * void glPointSize( GLfloat size); * 定义栅格点的大小,初始大小为1 */ glPointSize(5.0f); glVertex2f(-0.5f, 0.0f); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.0f); glEnd(); glFlush(); //绘制直线 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); //下例中会绘制两条直线 glVertex2f(-0.5f, 0.0f); glVertex2f(0.5f, 0.0f); glVertex2f(-0.5f, -0.3f); glVertex2f(0.5f, 0.3f); glEnd(); glFlush(); //绘制多边形 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5f, 0.0f); glVertex2f(0.5f, 0.0f); glVertex2f(-0.5f, -0.3f); glVertex2f(0.5f, 0.3f); glEnd(); glFlush(); //绘制圆 int n = 40; float pi = 3.1415926; float d = 0.5f; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); for(int i = 0; i < n; i++){ glVertex2f(d*cos(2*pi/n*i), d*sin(2*pi/n*i)); } glEnd(); glFlush(); } //********************************************************************************* /* * 颜色基本处理demo */ void display_demo03(){ float pi = 3.1415926; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_FAN); /* * void glColor3f (GLfloat red, GLfloat green, GLfloat blue); * RGB 三原色值 */ glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(0.0f, 0.0f); for(int i=0; i<=8; ++i) { glColor3f(i * 0x04, 0, 0); glVertex2f(cos(i*pi/4), sin(i*pi/4)); } glEnd(); glFlush(); } //*********************************************************************************** /* * 绘制立体基本形状demo * 在opengl的绘制管线中,主要分为两部分工作: * 1、模型观测变化:即具体物体的现实位置和角度 * 2、投影变换:即将3维信息的图像影射到2维的屏幕中 * 此过程中,涉及6个坐标: * 1、属于模型观测变换: * 1.1、MC(Model Coordinate) -> 模型坐标,即物体对象自己的坐标,如我们说一个正方形的定点1,1,是相对自己的某个原点0,0; * 1.2、WC(Word Coordinate) -> 世界坐标,将N多物体的模型坐标,统一到一个公共的坐标系; * 1.3、VC(View Coordinate) -> 观测坐标,理解为观察的角度,即相机摆放的位置和角度 * 2、属于投影变换: * 2.1、PC(Project Coordinate) -> 将上述模型变换后的3维信息映射到2维平面上,分为正交、斜投影、透射投影等,其中透射投影包涵近小远大的概念; * 2.2、NC(Normalization Coordinate) -> 将投影变换的结果归一化到一个单位为1的空间内 * 3、视口变换: * 3.1 DC(Device Coordinate) -> 实际在设备即屏幕上显示的坐标 */ void display_demo04(){ /* * opengl功能启用,例如: * GL_DEPTH_TEST:启用深度测试,根据坐标远近实现遮挡 * GL_ALPHA_TEST:根据其透明程度看是否被遮挡 * GL_AUTO_NORMAL:能够进行光线反射 * GL_TEXTURE_2D:启用二维纹理 */ glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /* * void glMatrixMode (GLenum mode); * GL_PROJECTION: 对投影视图进行操作 * GL_MODELVIEW: 对模型视图进行操作 * GL_TEXTURE: 对纹理进行操作 */ glMatrixMode(GL_PROJECTION); //把当前矩阵设置为单位矩阵 glLoadIdentity(); /* * void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) * fovy:视角 * aspect:宽高比 * zNear:近点距离 * zFar:远点距离 */ gluPerspective(75, 1, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* * gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ) * eyeX/Y/Z:相机在世界坐标中的位置 * centerX/Y/Z:物体在世界坐标中的位置 * upX/Y/Z: 相机的方向(相对世界坐标系) */ gluLookAt(0, -100, 200, 0, 50, 10, 0, 0, 1); glColor3f(1.0f, 0.5f, 0.0f); /* * glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) * angle:旋转的方向 * x/y/z: 旋转的方向向量 */ glRotatef(-80.0f,10.0f,5.0f,0.0f); /* * void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks) * radius:半径 * slices:经线数量 * stacks:纬线数量 */ glutWireCube(100); glFlush(); }