藍(lán)寶書 第二章
1 windows平臺(tái)使用頭文件(根據(jù)環(huán)境不同會(huì)有變化)
#include<windows.h>#include<gl/gl.h>#include<gl/glu.h>
2 openGL變量類型與C語言變量類型對(duì)應(yīng)表
表2.1 第81頁
3 API函數(shù)命名規(guī)則
庫前綴+根命令+參數(shù)數(shù)量+參數(shù)類型
glColor3f(……)
4 常見RGB復(fù)合顏色表
表2.2 89頁
5 單緩沖和雙緩沖
glutInitDisplayMode(GLUT_SIMPLE) ->使用glFlush()
glutInitDisplayMode(GLUT_DOUBLE) ->使用glutSwapBuffers()
6 OpenGL狀態(tài)機(jī)
使用void glEnable(GLenum capability) 啟用某一功能/狀態(tài)
使用void glDisable(GLenum capability) 禁用某一功能/狀態(tài)
使用Glboolean glIsEnabled(GLenum capability) 查詢某一功能/狀態(tài)是否啟用
使用下列函數(shù)獲得功能/狀態(tài)的參數(shù)
void glGetBooleanv(GLenumpname, GLboolean *params);void glGetDoublev(GLenum pname, GLdouble *params);void glGetFloatv(GLenum pname, GLfloat *params);void glGetIntegerv(GLenum pname, GLint *params);
7 保存和恢復(fù)狀態(tài)保存狀態(tài) void glPushAttrib(GLbitfield mask)恢復(fù)狀態(tài) void glPopAttrib(GLbitfield mask)
例如:glPushAtrrib(GL_TEXTURE_BIT|GL_LIGHTING_BIT)
8 錯(cuò)誤信息
返回錯(cuò)誤 Glenum glGetError(void)
返回錯(cuò)誤詳細(xì)信息 const GLubyte* gluErrorString(GLenum errorCode)
表2.3 錯(cuò)誤信息列舉 105頁
9 獲取字符串
const GLubyte *glGetString(GLenum name)
const char* version = (const char*)glGetString(GL_VERSION); 獲取版本號(hào)
glGetString(GL_VENDOR); 返回OpenGL的提供廠商。
glGetString(GL_RENDERER); 返回執(zhí)行OpenGL渲染的設(shè)備,通常就是顯卡的名字。
glGetString(GL_EXTENSIONS); 返回所支持的所有擴(kuò)展,每?jī)蓚€(gè)擴(kuò)展之間用空格隔開。
10 控制行為
void glHint(GLenum target, GLenum mode)
參考http://blog.csdn.net/shuaihj/article/details/7230867
11 OpenGL擴(kuò)展(對(duì)其他設(shè)備/平臺(tái)的支持)
略……
代碼:
例2.1
#include <Windows.h>#include <GL/GL.h>#include <GL/GLU.h>#include <GL/glut.h>void RenderScene(void){ // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT);//清除緩沖 GL_COLOR_BUFFER_BIT: 當(dāng)前可寫的顏色緩沖 // Flush drawing commands glFlush();}///////////////////////////////////////////////////////////// Set up the rendering statevoid SetuPRC(void){ glClearColor(0.0f, 0.0f, 1.0f, 1.0f);}///////////////////////////////////////////////////////////// Main program entry pointint main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);//設(shè)置模式 單緩沖 RGB模式 glutCreateWindow("Simple");//創(chuàng)建窗口 glutDisplayFunc(RenderScene);//設(shè)置回調(diào)函數(shù) 循環(huán)調(diào)用 SetupRC();//初始化openGL glutMainLoop();//啟動(dòng)程序 --無返回 return 0;}例2.2#include <Windows.h>#include <GL/GL.h>#include <GL/GLU.h>#include <GL/glut.h>void RenderScene(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(-50.0f, 50.0f, 50.0f, -50.0f);//設(shè)置矩形 glFlush();}void SetupRC(){ glClearColor(0.0f, 0.0f, 1.0f, 0.5f);}void ChangeSize(GLsizei w, GLsizei h)//窗口大小改變函數(shù)---2D{ GLfloat aspectRatio; if (h == 0) h = 1; glViewport(0, 0, w, h);//設(shè)置新窗口大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); aspectRatio = (GLfloat)w / (GLfloat)h; if (w <= h) glOrtho(-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0); else glOrtho(-100.0*aspectRatio, 100.0*aspectRatio, -100.0, 100.0, 1.0, -1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}int main(int argc,char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutCreateWindow("GLRect"); glutDisplayFunc(RenderScene);//顯示回調(diào)函數(shù) glutReshapeFunc(ChangeSize);//窗口大小變形回調(diào)函數(shù) SetupRC(); glutMainLoop(); return 0;}例2.3 跳動(dòng)方塊
#include <Windows.h>#include <GL/GL.h>#include <GL/GLU.h>#include <GL/glut.h>//初始化方塊位置和大小GLfloat x1 = 0.0f;GLfloat y1 = 0.0f;GLfloat rsize = 25;//每一步x y移動(dòng)的方向GLfloat xstep = 5.0f;GLfloat ystep = 5.0f;GLfloat windowWidth;GLfloat windowHight;void RenderScene(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(x1, y1, x1 + rsize, y1 - rsize); glutSwapBuffers(); //glFlush();}void TimerFunction(int value){ if (x1 > windowWidth - rsize || x1 < -windowWidth) xstep = -xstep; if (y1>windowHight || y1 < -windowHight + rsize) ystep = -ystep; x1 += xstep; y1 += ystep; if (x1>(windowWidth - rsize + xstep)) x1 = windowWidth - rsize - 1; else if (x1 < -(windowWidth + xstep)) x1 = -windowWidth - 1; if (y1>(windowHight + ystep)) y1 = windowHight - 1; else if (y1 < -(windowHight - rsize + ystep)) y1 = -windowHight + rsize - 1; glutPostRedisplay();//當(dāng)前窗口需要重新繪制 glutTimerFunc(100, TimerFunction, 1);//確保函數(shù)循環(huán)調(diào)用}void SetupRC(){ glClearColor(0.0f, 0.0f, 1.0f, 0.5f);}void ChangeSize(GLsizei w, GLsizei h){ GLfloat aspectRatio; if (h == 0) h = 1; glViewport(0, 0, w, h);//設(shè)置新窗口大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); aspectRatio = (GLfloat)w / (GLfloat)h; if (w <= h) glOrtho(-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0); else glOrtho(-100.0*aspectRatio, 100.0*aspectRatio, -100.0, 100.0, 1.0, -1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}int main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowSize(800, 600); glutCreateWindow("Bounce"); glutDisplayFunc(RenderScene);//顯示回調(diào)函數(shù) glutReshapeFunc(ChangeSize);//窗口大小變形回調(diào)函數(shù) glutTimerFunc(33, TimerFunction, 1);//定時(shí)調(diào)用函數(shù) 時(shí)間 函數(shù) 區(qū)別值 SetupRC(); glutMainLoop(); return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注