導航:首頁 > 源碼編譯 > 立方體紋理映射源碼

立方體紋理映射源碼

發布時間:2022-12-28 01:30:59

㈠ 在QT環境下用OpenGL繪制一個邊長為5的立方體,並為立方體貼上自定義紋理。寫出實現該功能的具體

void MyGLWidget::loadGLTexture()
{
QImage image(":/dog.jpg");
image = image.convertToFormat(QImage::Format_RGB888);
image = image.mirrored();
glGenTextures(1, &mTexture[0]);

glBindTexture(GL_TEXTURE_2D,mTexture[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
image.width(), image.height(), 0,
GL_RGB, GL_UNSIGNED_BYTE,
image.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

void MyGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當前的模型觀察矩陣
glTranslatef(0.0f,0.0f,-5.0f); // 移入屏幕 5 個單位
//下面三行使立方體繞X、Y、Z軸旋轉。旋轉多少依賴於變數 xrot , yrot 和 zrot 的值。
glRotatef(mXRotate,1.0f,0.0f,0.0f); // X軸旋轉
glRotatef(mYRotate,0.0f,1.0f,0.0f); // Y軸旋轉
glRotatef(mZRotate,0.0f,0.0f,1.0f); // Z軸旋轉

//下一行代碼選擇我們使用的紋理。
//如果您在您的場景中使用多個紋理,您應該使用來 glBindTexture(GL_TEXTURE_2D, texture[ 所使用紋理對應的數字 ]) 選擇要綁定的
//紋理。當您想改變紋理時,應該綁定新的紋理。有一點值得指出的是,您不能在 glBegin() 和 glEnd() 之間綁定紋理,必須在 glBegin()
//之前或 glEnd() 之後綁定。注意我們在後面是如何使用 glBindTexture 來指定和綁定紋理的。
glBindTexture(GL_TEXTURE_2D, mTexture[0]); // 選擇紋理
//為了將紋理正確的映射到四邊形上,您必須將紋理的右上角映射到四邊形的右上角,紋理的左上角映射到四邊形的左上角,
//紋理的右下角映射到四邊形的右下角,紋理的左下角映射到四邊形的左下角。
//如果映射錯誤的話,圖像顯示時可能上下顛倒,側向一邊或者什麼都不是。
//glTexCoord2f 的第一個參數是X坐標。 0.0f 是紋理的左側。 0.5f 是紋理的中點, 1.0f 是紋理的右側。
//glTexCoord2f 的第二個參數是Y坐標。 0.0f 是紋理的底部。 0.5f 是紋理的中點, 1.0f 是紋理的頂部。
//所以紋理的左上坐標是 X:0.0f,Y:1.0f ,四邊形的左上頂點是 X: -1.0f,Y:1.0f 。其餘三點依此類推。
//試著玩玩 glTexCoord2f X, Y坐標參數。把 1.0f 改為 0.5f 將只顯示紋理的左半部分,把 0.0f 改為 0.5f 將只顯示紋理的右半部分。
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();

}

void MyGLWidget::timerEvent(QTimerEvent *event)
{
//現在增加 xrot , yrot 和 zrot 的值。嘗試變化每次各變數的改變值來調節立方體的旋轉速度,或改變+/-號來調節立方體的旋轉方向。
mXRotate += 0.3f; // X 軸旋轉
mYRotate += 0.2f; // Y 軸旋轉
mZRotate += 0.4f; // Z 軸旋轉

updateGL();

QGLWidget::timerEvent(event);
}

void MyGLWidget::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_F2:
{
mFullScreen = !mFullScreen;
if(mFullScreen) {
showFullScreen();
}
else {
showNormal();
}
updateGL();
break;
}
case Qt::Key_Escape:
{
qApp->exit();
break;
}
}
}

#include "myglwidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyGLWidget w;
w.show();

return a.exec();

————————————————
版權聲

閱讀全文

與立方體紋理映射源碼相關的資料

熱點內容
自己建了伺服器地址 瀏覽:696
命令按鈕的屬性設置 瀏覽:961
證券技術分析pdf 瀏覽:777
linux命令連接oracle 瀏覽:200
墊江停車收費樁怎麼上App 瀏覽:133
好興動app還款怎麼登錄不上去了 瀏覽:665
鄭州雲伺服器託管 瀏覽:722
伺服器地址跟蹤 瀏覽:980
免費google雲伺服器 瀏覽:516
摘譯和編譯的英文 瀏覽:359
熱泵壓縮機選型 瀏覽:121
op手機微信加密如何解除 瀏覽:386
如何在王牌戰爭找到高爆率伺服器 瀏覽:13
江浙小學語文輔導課用什麼APP 瀏覽:99
新夢幻大陸伺服器地址 瀏覽:241
網吧伺服器怎麼更換壁紙 瀏覽:530
linux命令方法 瀏覽:332
linux下載freetype 瀏覽:123
程序員入駐平台 瀏覽:327
程序員大戰外掛 瀏覽:745