想往遊戲行業發展的話,經常被提及到的就是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,如需轉載請自行聯系原作者