天天看点

[OpenGL]环境搭建以及OpenGL初识 OpenGL初识 OpenGL环境搭建

想往游戏行业发展的话,经常被提及到的就是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,如需转载请自行联系原作者

继续阅读