您好,登錄后才能下訂單哦!
對于開始學習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;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。