想往游戏行业发展的话,经常被提及到的就是OpenGL和DirectX,这两者听起来感觉是一门挺高深的技术,今天我也开始摸索学习OpenGL,那么OpenGL到底是什么?它和DirectX有什么区别和联系?
OpenGL只是一套图形函数库
DirectX包含图形、声音、输入、网络等模块。
但就图形而论,DirectX的图形库性能不如OpenGL,OpenGL稳定,可以跨平台使用,DirectX只支持Windows平台,所以OpenGL还是有它的优势!OpenGL ES是OpenGL的嵌入设备版本,为了适合潜入设备性能要求较高,从而OpenGL ES删减了一些低性能的操作方式。
与C语言紧密结合
强大的可移植性
套性能的图形渲染
官网:http://www.opengl.org/
OpenGL ES 1.X:
OpenGL ES 2.X:
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
代码如下:
#include <gl\glut.h> //包含OpenGL实用库,这是GLUT头文件好含<GL/gl.h>和<GL/glu.h>
//画图函数
void myDisplay(void)
{
//清除函数
glClear(GL_COLOR_BUFFER_BIT);//masks是bit位的,用于标示要被清除的缓冲区。 这个参数有四种:GL_COLOR_BUFFER_BIT, GL_DEPTHBUFFER_BIT,GL_ACCUM_BUFFER_BIT 和 GL_STENCIL_BUFFER_BIT。//(颜色缓冲,深度缓冲,累加器缓冲,模板缓冲?)
/*GL_COLOR_BUFFER_BIT
Indicates the buffers currently enabled for color writing. 指出缓冲区当前可用于写入颜色
GL_DEPTH_BUFFER_BIT
Indicates the depth buffer. 指出是深度缓冲区
GL_ACCUM_BUFFER_BIT
Indicates the accumulation buffer. 指出累加缓冲区
GL_STENCIL_BUFFER_BIT
Indicates the stencil buffer. 指出模板缓冲区*/
//绘制一个矩形,四个参数标示了位于对角线(左上角)上的两个点的横、纵坐标。
//glRectf(0, 0, 0.5f, 0.5f);
glRectf(0.5, 0.5, 1, 1);
glRectf(0,0,-0.5f,0.5f);
//绘制四个点
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.0f);
glVertex2f(0.0f,-0.5f);
glVertex2f(0.5f,-0.5f);
glEnd();
//绘制两条线
glBegin(GL_LINES);
glVertex2f(-1,0.0f);
glVertex2f(-0.5f,0.0f);
glVertex2f(-0.75f,0);
glVertex2f(-0.75f,-0.5f);
glVertex2f(-0.85f,-0.4f);
//保证前面的OpenGL命令会立即执行(而不会让他们在缓冲区等待)
glFlush(); //glFlush()清空缓冲区,将指令送往缓硬件立即执行,但是它是将命令传送完毕之后立即返回,不会等待指令执行完毕。当调用glFlush时,物体会一个一个地出现在屏幕上。
//glFinish(); //将缓冲区的指令立即送往硬件执行,但是要一直等到硬件执行完这些指令之后才返回。glFinish通常会带来性能上的损失,GPU和CPU并行性能丧失。Direct3D不支持Finish的概念。
}
int main(int argc, char *argv[])
//对GLUT进行初始化,必须在其他GLUT之前调用一次,格式比较死板,一般就照着写一次即可。
glutInit(&argc, argv);
//设置显示方式,GLUT_RGB标示使用RGB颜色,GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
//新建窗口在屏幕中的位置
glutInitWindowPosition(100, 100);
//初始化默认的大小
glutInitWindowSize(400, 400);
//根据前面的信息创建窗口,参数为窗口的标题。注意:这里窗口创建后并不会立马显示到屏幕上,需要执行glutMainLoop()才会显示到屏幕上
glutCreateWindow("Hello OpenGL-Create By 丁小未");
//设置一个函数,当需要进行画图时候,这个函数就会被调用
glutDisplayFunc(&myDisplay);
//进行消息循环,理解为可以显示窗口
glutMainLoop();
return 0;
效果图:
部分解释参考每行代码之后的注释。
本文转蓬莱仙羽 51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1429146,如需转载请自行联系原作者