前面畫的雖然都是三維的點操做,可是畫出的圖形看不出三維的效果 緩存
簡單的理解一下:三維裏的圖形比二維多的是 視點與物體的相對位置佈局,以及有投影變換 網絡
因此咱們須要理解的三維中的幾個概念: 框架
視圖變換----觀測三維模型的角度不一樣,顯示內容不一樣 函數
模型變換----三維模型的放大,縮小,移動,旋轉 oop
投影----三維模型應該近大遠小 佈局
視口的設置-----只看模型一部分,該如何顯示,選擇性視野忽略症 性能
雙緩存-----顯存裏一塊用來繪製圖形,一塊用來顯示,提升性能用 測試
垂直同步------所有繪製好了再顯示,提升性能用 spa
FPS的測試方法:FPS即每秒多少針,測試方法是屢次求平均值 orm
一個三維圖形代碼的例子框架與解釋,通常是先設置投影,再設置視圖,再畫
#include <GLUT/GLUT.h>
#include <math.h>
void display( void ){
//清除顏色緩存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//先設置投影參數再設置視點佈局參數
//投影參數解決視角,長寬比,近點,遠點4個問題
//視點佈局解決眼睛位置,物體位置,眼睛與物體方向 3個問題
//設置投影變換參數
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective // 設置透視圖
(45, // 透視角設置爲 45 度,在Y方向上以角度爲單位的視野
1.0, // 窗口的寬與高比
0.1f, // 視野透視深度:近點1.0f
3000.0f // 視野透視深度:始點0.1f遠點1000.0f
);
//開始畫模型
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//眼睛位於(0,10,100)位置,物體位於(0,0,0)位置,方向是從上往下看(0,1,0)
gluLookAt(10,10,100,0,0,0,0,1,0);
glColor3f(0.5f, 0.7f, 1.0f);
//生成三角
glBegin(GL_LINES);
for(int i=-1000;i<=1000;i+=10)
{
glVertex3f(0,0,i);
glVertex3f(10,10,i);
glVertex3f(0,0,i);
glVertex3f(-10,10,i);
}
glEnd();
//生成網絡
int x=(int)(40*2);
glBegin(GL_LINES);
for(int i=-x;i<=x;i+=4)
{
glVertex3i(-x,0,i);
glVertex3i(x,0,i);
glVertex3i(i,0,x);
glVertex3i(i,0,-x);
}
glEnd();
//生成球體
GLUquadricObj * pObj;
pObj = gluNewQuadric();
gluQuadricDrawStyle(pObj,GLU_LINE);
gluQuadricNormals(pObj,GLU_SMOOTH);
gluSphere(pObj,16,16,16);
glFlush();
}
void testDisplay(void){
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //設置顯示屬性爲RBGA顏色,雙緩存
glutInitWindowPosition(200, 200);//設置窗口位置
glutInitWindowSize(WIDTH,HEIGHT);//設置窗口大小
glutCreateWindow("OpenGL測試");//生成窗口
glutDisplayFunc(&display);//設置顯示回調函數
}
/***************************/
int main(int argc, const char * argv[])
{
glutInit(&argc, argv);//初始化GLUT
testDisplay();
glutMainLoop();//事件循環
return 0;}