1. 程式人生 > >OpenGL(13)GLU庫API

OpenGL(13)GLU庫API

/************************http://blog.csdn.net/sunboyiris*************************************/   
//根據OpenGL或GLU錯誤程式碼產生錯誤字串 
const GLubyte* APIENTRY gluErrorString (
    GLenum   errCode);

const wchar_t* APIENTRY gluErrorUnicodeStringEXT (
    GLenum   errCode);

//得到一個描述GLU版本號或支援GLU擴充套件呼叫的字串 
const GLubyte* APIENTRY gluGetString (
    GLenum   name);

/* near和far預設為-1和1,此函式決定一個平行六面體 */
void APIENTRY gluOrtho2D (
    GLdouble left, 
    GLdouble right, 
    GLdouble bottom, 
    GLdouble top);

/*  gluPerspective這個函式指定了觀察的視景體(frustum為錐臺的意思,通常譯為視景體)在世界座標系中的具體大小 */
void APIENTRY gluPerspective (
    GLdouble fovy, 
    GLdouble aspect, 
    GLdouble zNear, 
    GLdouble zFar);

/*將裁剪區域變成一個單位立方體.
 它是用來根據當前滑鼠選擇區域生成一個相應的投影矩陣的。這裡面頭兩個引數不是這個選擇區域的左上角位置,而是整個區域的中心位置。如果錯把它當成左上角,選擇的區域就會斜向上有個偏移。 */
void APIENTRY gluPickMatrix (
    GLdouble x, 
    GLdouble y, 
    GLdouble width, 
    GLdouble height, 
    GLint    viewport[4]);

/* 該函式定義一個檢視矩陣,並與當前矩陣相乘。
第一組eyex, eyey,eyez 相機在世界座標的位置
第二組centerx,centery,centerz 相機鏡頭對準的物體在世界座標的位置
第三組upx,upy,upz 相機向上的方向在世界座標中的方向
你把相機想象成為你自己的腦袋:
第一組資料就是腦袋的位置
第二組資料就是眼睛看的物體的位置
第三組就是頭頂朝向的方向(因為你可以歪著頭看同一個物體)  */
void APIENTRY gluLookAt (
    GLdouble eyex, 
    GLdouble eyey, 
    GLdouble eyez, 
    GLdouble centerx, 
    GLdouble centery, 
    GLdouble centerz, 
    GLdouble upx, 
    GLdouble upy, 
    GLdouble upz);


/* 
用於返回變換後的視窗座標
基本思路
1、將輸入的頂點,通過模型檢視矩陣,變換到模型檢視矩陣的座標系中;

2、將模型檢視矩陣中的頂點,再變換到投影矩陣中;

3、將頂點縮放到[0, 1]的對映區間中;

4、通過視口的位置和大小,計算出當前3D頂點中的螢幕座標(2D座標) */
int APIENTRY gluProject (
    GLdouble        objx, 
    GLdouble        objy, 
    GLdouble        objz,  
    const GLdouble  modelMatrix[16], 
    const GLdouble  projMatrix[16], 
    const GLint     viewport[4], 
    GLdouble        *winx, 
    GLdouble        *winy, 
    GLdouble        *winz);


/* 
gluPorject反過來的過程
思路:
1、首先,需要將輸入的頂點,通過視口變換到[0, 1]之間;
2、然後將頂點縮放到[-1, 1]之間,就是上面程式碼中的scaleMat矩陣的逆矩陣
3、然後乘上投影矩陣的逆矩陣;
4、最後就是乘上模型檢視矩陣的逆矩陣;
 */
int APIENTRY gluUnProject (
    GLdouble       winx, 
    GLdouble       winy, 
    GLdouble       winz, 
    const GLdouble modelMatrix[16], 
    const GLdouble projMatrix[16], 
    const GLint    viewport[4], 
    GLdouble       *objx, 
    GLdouble       *objy, 
    GLdouble       *objz);


//gluScaleImage這個函式用適當的畫素儲存模式改變一個畫素影象的大小來讀取源影象的畫素資料然後把畫素寫入新的目標影象
int APIENTRY gluScaleImage (
    GLenum      format, 
    GLint       widthin, 
    GLint       heightin, 
    GLenum      typein, 
    const void  *datain, 
    GLint       widthout, 
    GLint       heightout, 
    GLenum      typeout, 
    void        *dataout);

/* 如果已經建立0級(解析度最高的)mipmap, 可以使用函式gluBuild1DMipmaps(), gluBuild2DMipmaps() 和 gluBuild3DMipmaps()來定義和建立mipmap金字塔.

塔頂為1X1(對於一維紋理為1; 三維紋理為1X1X1)的mipmap. 如初始影象的大小不是2的冪, 可以使用函式gluBuild*DMipmaps()將影象大小縮放到最接近2的冪,
如紋理太大, 可以使用函式gluBuild*DMipmaps()將影象縮小到足夠的資源來儲存它(使用GL_PROXY_TEXTURE機制確定). */
int APIENTRY gluBuild1DMipmaps (
    GLenum      target, 
    GLint       components, 
    GLint       width, 
    GLenum      format, 
    GLenum      type, 
    const void  *data);

int APIENTRY gluBuild2DMipmaps (
    GLenum      target, 
    GLint       components, 
    GLint       width, 
    GLint       height, 
    GLenum      format, 
    GLenum      type, 
    const void  *data);