中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

opengl 一個可以運行的立方體貼圖

發布時間:2020-09-24 08:04:22 來源:網絡 閱讀:758 作者:WZM3558862 欄目:開發技術

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

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

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

//


#include "stdafx.h"

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

#include <windows.h>

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

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


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

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

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

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


GLfloat  xrot;   // X 旋轉量

GLfloat  yrot;   // Y 旋轉量

GLfloat  zrot;   // Z 旋轉量

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()         // 載入位圖(調用上面的代碼)并轉換成紋理

{

 int Status=FALSE;         // 狀態指示器

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

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

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

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

 {

  Status=TRUE;         // 將 Status 設為 TRUE

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


  // 使用來自位圖數據生成 的典型紋理

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

  // 生成紋理

  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);    // 釋放紋理圖像占用的內存

  }


  free(TextureImage[0]);       // 釋放圖像結構

 }

 return Status;          // 返回 Status

}


//繪制立方體

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

{

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

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


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

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

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

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

 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 軸旋轉

 yrot+=0.2f;              // Y 軸旋轉

 zrot+=0.4f;              // Z 軸旋轉

}


void display(void)

{

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

    glLoadIdentity();                                    // Reset The View

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


    DrawCube();


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

}


//初始化

void init (void) 

{

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


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

    glEnable(GL_CULL_FACE);                        //啟用裁剪

    glEnable(GL_TEXTURE_2D);

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

}


//當窗口大小改變時,會調用這個函數

void reshape(GLsizei w,GLsizei h)

{

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

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


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

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

    glLoadIdentity();                //變為單位矩陣

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

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

    glLoadIdentity();                //變為單位矩陣

}


//鍵盤輸入事件函數

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

{

 switch(key)

 {

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

  xrot+=1.0f;   //設置旋轉增量

  glutPostRedisplay();   //重繪函數

  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 ();                                //初始化資源,這里一定要在創建窗口以后,不然會無效。

 LoadGLTextures();

    glutDisplayFunc(display);

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

    glutKeyboardFunc(keyboard);

    glutMainLoop();

    return 0;

}


 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

比如县| 六盘水市| 青铜峡市| 苍溪县| 镇巴县| 南充市| 广东省| 开阳县| 松潘县| 灵宝市| 武城县| 广宗县| 南江县| 梅河口市| 贵德县| 泸溪县| 乌海市| 曲靖市| 深州市| 北票市| 宝应县| 修武县| 津市市| 海丰县| 营山县| 仁怀市| 株洲县| 泰和县| 黄浦区| 翼城县| 喀喇| 库尔勒市| 晋城| 柞水县| 慈利县| 正镶白旗| 五大连池市| 镇宁| 巴彦县| 平凉市| 农安县|