對于開始學(xué)習(xí)opengl的人來說 下載一個(gè)可以運(yùn)行的代碼,對自己的鼓舞極大,但是網(wǎng)上下載的程序大多數(shù)由于這樣那樣的原因不能運(yùn)行.有時(shí)會(huì)抱怨:照抄的啊 咋不行呢?其實(shí)原因很簡單 主要是環(huán)境變了 庫配置不對 版本不對 有的庫是debug 而有的是release 所以導(dǎo)致不能運(yùn)行.
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了榆樹免費(fèi)建站歡迎大家使用!下面這個(gè)例子是紋理貼圖: 圖片必須是能被2整除的 比如 128X128 512X512 文件名:MF.bmp 保證你運(yùn)行而且可以手動(dòng)控制旋轉(zhuǎn) ,由于開始貼在正面,所以你看到的是平面.按D鍵 立即旋轉(zhuǎn).
/ fangkuai.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include "glut.h" //引用相關(guān)包
#include <windows.h>
#include "glaux.h"> //用的是擴(kuò)展庫
#include <stdio.h> //基本IO口函數(shù)庫 本例主要是讀文件
#pragma comment( lib, "winmm.lib")//這個(gè)是加載聲音
#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]; // 存儲(chǔ)一個(gè)紋理
AUX_RGBImageRec *LoadBMP(CHAR *Filename) // 載入位圖圖象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 確保文件名已提供
{
return NULL; // 如果沒提供,返回 NULL
}
File=fopen(Filename,"r"); // 嘗試以讀方式打開文件
if (File) // 文件存在么?
{
fclose(File); // 關(guān)閉句柄
return auxDIBImageLoadA(Filename); // 載入位圖并返回指針
}
return NULL; // 如果載入失敗,返回 NULL
}
int LoadGLTextures() // 載入位圖(調(diào)用上面的代碼)并轉(zhuǎn)換成紋理
{
int Status=FALSE; // 狀態(tài)指示器
AUX_RGBImageRec *TextureImage[1]; // 創(chuàng)建紋理的存儲(chǔ)空間 這里創(chuàng)建一個(gè)
memset(TextureImage,0,sizeof(void *)*1); // 將指針設(shè)為 NULL
// 載入位圖,檢查有無錯(cuò)誤,如果位圖沒找到則退出
if (TextureImage[0]=LoadBMP("mf.bmp")) //加載位圖 AUX只支持bmp格式
{
Status=TRUE; // 將 Status 設(shè)為 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) // 從這里開始進(jìn)行所有的繪制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當(dāng)前的模型觀察矩陣
glTranslatef(0.0f,0.0f,-5.0f); // 移入屏幕 5 個(gè)單位 網(wǎng)屏幕深處移動(dò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); //清理顏色,為黑色,(也可認(rèn)為是背景顏色) 透明色不能是背景透明
glCullFace(GL_BACK); //背面裁剪(背面不可見)
glEnable(GL_CULL_FACE); //啟用裁剪
glEnable(GL_TEXTURE_2D);
LoadGLTextures(); //載入紋理貼圖
}
//當(dāng)窗口大小改變時(shí),會(huì)調(diào)用這個(gè)函數(shù)
void reshape(GLsizei w,GLsizei h)
{
//這里小說明一下:矩陣模式是不同的,他們各自有一個(gè)矩陣。投影相關(guān)
//只能用投影矩陣。(只是目前情況下哦,等我學(xué)多了可能就知道為什么了。)
glViewport(0,0,w,h); //設(shè)置視口
glMatrixMode(GL_PROJECTION); //設(shè)置矩陣模式為投影變換矩陣,GL_PROJECTION GL_TEXTURE
glLoadIdentity(); //變?yōu)閱挝痪仃?/p>
gluPerspective(60, (GLfloat)w / h, 0, 1000); //設(shè)置投影矩陣
glMatrixMode(GL_MODELVIEW); //設(shè)置矩陣模式為視圖矩陣(模型)
glLoadIdentity(); //變?yōu)閱挝痪仃?/p>
}
//鍵盤輸入事件函數(shù)
void keyboard(unsigned char key,int x,int y)
{
switch(key)
{
case 'd': //當(dāng)按下鍵盤上d時(shí),以沿X軸旋轉(zhuǎn)為主
xrot+=1.0f; //設(shè)置旋轉(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)建窗口以后,不然會(huì)無效。
LoadGLTextures();
glutDisplayFunc(display);
glutReshapeFunc(reshape); //繪制圖形時(shí)的回調(diào)
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標(biāo)題:opengl一個(gè)可以運(yùn)行的立方體貼圖-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article36/diocpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、App設(shè)計(jì)、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化、App開發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容