想往游戏行业发展的话,经常被提及到的就是OpenGL和DirectX,这两者听起来感觉是一门挺高深的技术,今天我也开始摸索学习OpenGL,那么OpenGL到底是什么?它和DirectX有什么区别和联系?

OpenGL初识

OpenGL只是一套图形函数库

DirectX包含图形、声音、输入、网络等模块。

但就图形而论,DirectX的图形库性能不如OpenGL,OpenGL稳定,可以跨平台使用,DirectX只支持Windows平台,所以OpenGL还是有它的优势!OpenGL ES是OpenGL的嵌入设备版本,为了适合潜入设备性能要求较高,从而OpenGL ES删减了一些低性能的操作方式。

OpenGL的优越性:


  • 与C语言紧密结合

  • 强大的可移植性

  • 套性能的图形渲染


官网:http://www.opengl.org/

OpenGL ES 1.X 和OpenGL ES 2.X的区别:


OpenGL ES 1.X:

For fixed function hardware: OpenGL ES 1.1 is defined relative to the OpenGL 1.5 specification and emphasizes hardware acceleration of the API, but is fully backwards compatible with 1.0. It provides enhanced functionality, improved image quality and optimizations to increase performance while reducing memory bandwidth usage to save power. The OpenGL ES 1.1 Extension Pack is a collection of optional extensions added to OpenGL ES 1.1 that reduced variability and bring significant improvements in image quality and performance.


OpenGL ES 2.X:

For programmable hardware:OpenGL ES 2.0 is defined relative to the OpenGL 2.0 specification and emphasizes a programmable 3D graphics pipeline with the ability to create shader and program objects and the ability to write vertex and fragment shaders in the OpenGL ES Shading Language. OpenGL ES 2.0 does not support the fixed function transformation and fragment pipeline of OpenGL ES 1.x.


OpenGL环境搭建

1.下载OpenGL库文件,点击下载

2.glut.h放在了C:\Program Files\Windows Kits\8.0\Include\um\gl 目录下(通过在C盘搜索GL.h得来)

3.glut.lib和glut32.lib放到 E:\Microsoft Visual Studio 11.0\VC\lib

4.glut.dll和glut32.dll放到"C:\Windows\System32"

5.新建空白工程,随便.c或者.cpp

代码如下:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. #include <gl\glut.h> //包含OpenGL实用库,这是GLUT头文件好含<GL/gl.h>和<GL/glu.h>  

  2.   

  3. //画图函数  

  4. void myDisplay(void)  

  5. {  

  6.     //清除函数  

  7.     glClear(GL_COLOR_BUFFER_BIT);//masks是bit位的,用于标示要被清除的缓冲区。 这个参数有四种:GL_COLOR_BUFFER_BIT,  GL_DEPTHBUFFER_BIT,GL_ACCUM_BUFFER_BIT  和 GL_STENCIL_BUFFER_BIT。//(颜色缓冲,深度缓冲,累加器缓冲,模板缓冲?)  

  8.     /*GL_COLOR_BUFFER_BIT 

  9.         Indicates the buffers currently enabled for color writing.     指出缓冲区当前可用于写入颜色 

  10.     GL_DEPTH_BUFFER_BIT 

  11.         Indicates the depth buffer.                                                   指出是深度缓冲区 

  12.     GL_ACCUM_BUFFER_BIT 

  13.         Indicates the accumulation buffer.                                       指出累加缓冲区 

  14.     GL_STENCIL_BUFFER_BIT 

  15.         Indicates the stencil buffer.                                                  指出模板缓冲区*/  

  16.   

  17.     //绘制一个矩形,四个参数标示了位于对角线(左上角)上的两个点的横、纵坐标。  

  18.     //glRectf(0, 0, 0.5f, 0.5f);  

  19.     glRectf(0.5, 0.5, 1, 1);  

  20.     glRectf(0,0,-0.5f,0.5f);  

  21.   

  22.     //绘制四个点  

  23.     glBegin(GL_POINTS);  

  24.     glVertex2f(0.0f,0.0f);  

  25.     glVertex2f(0.5f,0.0f);  

  26.     glVertex2f(0.0f,-0.5f);  

  27.     glVertex2f(0.5f,-0.5f);  

  28.     glEnd();  

  29.   

  30.     //绘制两条线  

  31.     glBegin(GL_LINES);  

  32.     glVertex2f(-1,0.0f);  

  33.     glVertex2f(-0.5f,0.0f);  

  34.     glVertex2f(-0.75f,0);  

  35.     glVertex2f(-0.75f,-0.5f);  

  36.     glVertex2f(-0.75f,-0.5f);  

  37.     glVertex2f(-0.85f,-0.4f);  

  38.     glEnd();  

  39.   

  40.   

  41.     //保证前面的OpenGL命令会立即执行(而不会让他们在缓冲区等待)  

  42.     glFlush(); //glFlush()清空缓冲区,将指令送往缓硬件立即执行,但是它是将命令传送完毕之后立即返回,不会等待指令执行完毕。当调用glFlush时,物体会一个一个地出现在屏幕上。  

  43.     //glFinish(); //将缓冲区的指令立即送往硬件执行,但是要一直等到硬件执行完这些指令之后才返回。glFinish通常会带来性能上的损失,GPU和CPU并行性能丧失。Direct3D不支持Finish的概念。  

  44.   

  45. }  

  46. int main(int argc, char *argv[])  

  47. {  

  48.     //对GLUT进行初始化,必须在其他GLUT之前调用一次,格式比较死板,一般就照着写一次即可。  

  49.     glutInit(&argc, argv);  

  50.   

  51.     //设置显示方式,GLUT_RGB标示使用RGB颜色,GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)  

  52.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  

  53.   

  54.     //新建窗口在屏幕中的位置  

  55.     glutInitWindowPosition(100, 100);  

  56.   

  57.     //初始化默认的大小  

  58.     glutInitWindowSize(400, 400);  

  59.   

  60.     //根据前面的信息创建窗口,参数为窗口的标题。注意:这里窗口创建后并不会立马显示到屏幕上,需要执行glutMainLoop()才会显示到屏幕上  

  61.     glutCreateWindow("Hello OpenGL-Create By 丁小未");  

  62.   

  63.     //设置一个函数,当需要进行画图时候,这个函数就会被调用  

  64.     glutDisplayFunc(&myDisplay);   

  65.   

  66.     //进行消息循环,理解为可以显示窗口  

  67.     glutMainLoop();  

  68.   

  69.     return 0;  

  70. }  

效果图:



部分解释参考每行代码之后的注释。



欢迎关注我的围脖