opengl一個可以運行的立方體貼圖-創(chuàng)新互聯(lián)

對于開始學習opengl的人來說 下載一個可以運行的代碼,對自己的鼓舞極大,但是網(wǎng)上下載的程序大多數(shù)由于這樣那樣的原因不能運行.有時會抱怨:照抄的啊 咋不行呢?其實原因很簡單 主要是環(huán)境變了 庫配置不對 版本不對 有的庫是debug 而有的是release 所以導致不能運行.

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、微信小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了榆樹免費建站歡迎大家使用!

下面這個例子是紋理貼圖: 圖片必須是能被2整除的 比如 128X128  512X512 文件名:MF.bmp 保證你運行而且可以手動控制旋轉(zhuǎn) ,由于開始貼在正面,所以你看到的是平面.按D鍵 立即旋轉(zhuǎn).

/ fangkuai.cpp : 定義控制臺應用程序的入口點。

//

#include "stdafx.h"

#include "glut.h"  //引用相關包

#include <windows.h>

#include "glaux.h"> //用的是擴展庫

#include <stdio.h> //基本IO口函數(shù)庫 本例主要是讀文件

#pragma comment( lib, "winmm.lib")//這個是加載聲音

#pragma comment( lib, "opengl32.lib")

#pragma comment( lib, "glu32.lib")

#pragma comment( lib, "glaux.lib")

GLfloat  xrot;  // X 旋轉(zhuǎn)量

GLfloat  yrot;  // Y 旋轉(zhuǎn)量

GLfloat  zrot;  // Z 旋轉(zhuǎn)量

GLuint  texture[1];  // 存儲一個紋理

AUX_RGBImageRec *LoadBMP(CHAR *Filename)   // 載入位圖圖象

{

 FILE *File=NULL;     // 文件句柄

 if (!Filename)      // 確保文件名已提供

 {

 return NULL;     // 如果沒提供,返回 NULL

 }

 File=fopen(Filename,"r");    // 嘗試以讀方式打開文件

 if (File)      // 文件存在么?

 {

 fclose(File);     // 關閉句柄

 return auxDIBImageLoadA(Filename);   // 載入位圖并返回指針

 }

 return NULL;      // 如果載入失敗,返回 NULL

}

int LoadGLTextures()     // 載入位圖(調(diào)用上面的代碼)并轉(zhuǎn)換成紋理

{

 int Status=FALSE;     // 狀態(tài)指示器

 AUX_RGBImageRec *TextureImage[1];   // 創(chuàng)建紋理的存儲空間 這里創(chuàng)建一個

 memset(TextureImage,0,sizeof(void *)*1);  // 將指針設為 NULL

 // 載入位圖,檢查有無錯誤,如果位圖沒找到則退出

 if (TextureImage[0]=LoadBMP("mf.bmp"))  //加載位圖  AUX只支持bmp格式

 {

 Status=TRUE;     // 將 Status 設為 TRUE

 glGenTextures(1, &texture[0]);   // 創(chuàng)建紋理

 // 使用來自位圖數(shù)據(jù)生成 的典型紋理

 glBindTexture(GL_TEXTURE_2D, texture[0]);//依據(jù)加載的位圖創(chuàng)建紋理

 // 生成紋理

 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 線形濾波

 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 線形濾波

 }

 if (TextureImage[0])     // 紋理是否存在

 {

 if (TextureImage[0]->data)    // 紋理圖像是否存在

 {

  free(TextureImage[0]->data);   // 釋放紋理圖像占用的內(nèi)存

 }

 free(TextureImage[0]);    // 釋放圖像結(jié)構(gòu)

 }

 return Status;      // 返回 Status

}

//繪制立方體

void DrawCube(void)     // 從這里開始進行所有的繪制

{

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存

 glLoadIdentity();     // 重置當前的模型觀察矩陣

 glTranslatef(0.0f,0.0f,-5.0f);     // 移入屏幕 5 個單位 網(wǎng)屏幕深處移動

 glRotatef(xrot,1.0f,0.0f,0.0f);     // 繞X軸旋轉(zhuǎn)

 glRotatef(yrot,0.0f,1.0f,0.0f);     // 繞Y軸旋轉(zhuǎn)

 glRotatef(zrot,0.0f,0.0f,1.0f);     // 繞Z軸旋轉(zhuǎn)

 glBindTexture(GL_TEXTURE_2D, texture[0]);    // 選擇紋理

 glBegin(GL_QUADS);//繪制正方形

 // 前面

 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // 紋理和四邊形的左下

 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // 紋理和四邊形的右下

 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // 紋理和四邊形的右上

 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // 紋理和四邊形的左上

 // 后面

 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 紋理和四邊形的右下

 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // 紋理和四邊形的右上

 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // 紋理和四邊形的左上

 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 紋理和四邊形的左下

 // 頂面

 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // 紋理和四邊形的左上

 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // 紋理和四邊形的左下

 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // 紋理和四邊形的右下

 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // 紋理和四邊形的右上

 // 底面

 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 紋理和四邊形的右上

 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 紋理和四邊形的左上

 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // 紋理和四邊形的左下

 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // 紋理和四邊形的右下

 // 右面

 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 紋理和四邊形的右下

 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // 紋理和四邊形的右上

 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // 紋理和四邊形的左上

 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // 紋理和四邊形的左下

 // 左面

 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 紋理和四邊形的左下

 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // 紋理和四邊形的右下

 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // 紋理和四邊形的右上

 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // 紋理和四邊形的左上

 glEnd();

  glFlush();  //立即有效

 xrot+=0.3f;        // X 軸旋轉(zhuǎn)

 yrot+=0.2f;        // Y 軸旋轉(zhuǎn)

 zrot+=0.4f;        // Z 軸旋轉(zhuǎn)

}

void display(void)

{

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // 清楚顏色數(shù)據(jù)和深度數(shù)據(jù)(清屏)

  glLoadIdentity();                   // Reset The View

  glTranslatef(0.0f,0.0f,-5.0f);//旋轉(zhuǎn)

  DrawCube();

  glutSwapBuffers();       //交換緩沖區(qū)。顯示圖形

}

//初始化

void init (void)

{

  glClearColor (0.0, 0.0, 1.0, .0);       //清理顏色,為黑色,(也可認為是背景顏色) 透明色不能是背景透明

  glCullFace(GL_BACK);             //背面裁剪(背面不可見)

  glEnable(GL_CULL_FACE);             //啟用裁剪

  glEnable(GL_TEXTURE_2D);

  LoadGLTextures();       //載入紋理貼圖

}

//當窗口大小改變時,會調(diào)用這個函數(shù)

void reshape(GLsizei w,GLsizei h)

{

  //這里小說明一下:矩陣模式是不同的,他們各自有一個矩陣。投影相關

  //只能用投影矩陣。(只是目前情況下哦,等我學多了可能就知道為什么了。)

  glViewport(0,0,w,h);     //設置視口

  glMatrixMode(GL_PROJECTION);   //設置矩陣模式為投影變換矩陣,GL_PROJECTION  GL_TEXTURE

  glLoadIdentity();         //變?yōu)閱挝痪仃?/p>

  gluPerspective(60, (GLfloat)w / h, 0, 1000);   //設置投影矩陣

  glMatrixMode(GL_MODELVIEW);     //設置矩陣模式為視圖矩陣(模型)

  glLoadIdentity();         //變?yōu)閱挝痪仃?/p>

}

//鍵盤輸入事件函數(shù)

void keyboard(unsigned char key,int x,int y)

{

 switch(key)

 {

 case 'd':   //當按下鍵盤上d時,以沿X軸旋轉(zhuǎn)為主

 xrot+=1.0f;  //設置旋轉(zhuǎn)增量

 glutPostRedisplay();  //重繪函數(shù)

 break;

 case 's':

 yrot+=1.0f;

 glutPostRedisplay();

 break;

 case 'a':

 zrot+=1.0f;

 glutPostRedisplay();

 break;

 default:

 break;

 }

}

int main(int argc, char *argv[])

{

  glutInit(&argc, argv);  //固定格式

  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

  glutInitWindowSize(600, 600);   //顯示框的大小

  glutInitWindowPosition(100,100); //確定顯示框左上角的位置

  glutCreateWindow("OpenGL紋理貼圖");

 init ();                 //初始化資源,這里一定要在創(chuàng)建窗口以后,不然會無效。

 LoadGLTextures();

  glutDisplayFunc(display);

 glutReshapeFunc(reshape);         //繪制圖形時的回調(diào)

  glutKeyboardFunc(keyboard);

  glutMainLoop();

  return 0;

}

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

文章標題:opengl一個可以運行的立方體貼圖-創(chuàng)新互聯(lián)
文章出自:http://bm7419.com/article36/diocpg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、App設計響應式網(wǎng)站、標簽優(yōu)化App開發(fā)、云服務器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設