日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OPenGL笔记--给立方体贴图(纹理)

發布時間:2024/1/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OPenGL笔记--给立方体贴图(纹理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、前置知識
  • 二、效果展示、
  • 三、完整代碼
  • 附、給立方體每個面渲染不同的紋理

一、前置知識

經過前面的學習,我們已經知道了立方體怎么創建了,接下來學習怎么給立方體貼圖;


為了將紋理正確的映射到四邊形上,您必須:

  • 將紋理的 右上角 映射到四邊形的 右上角 ;
  • 紋理的 左上角 映射到四邊形的 左上角 ;
  • 紋理的 右下角 映射到四邊形的 右下角 ;
  • 紋理的 左下角 映射到四邊形的 左下角 ;

如果映射錯誤的話,圖像顯示時可能上下 顛倒,側向一邊或者什么都不是


glTexCoord2f(x, y):

  • 第一個參數是X坐標;0.0 是紋理的左側、0.5 是紋理的中點、 1.0 是紋理的右側;
  • 第二個參數是Y坐標;0.0 是紋理的底部、 0.5 是紋理的中點、1.0 是紋理的頂部;

二、效果展示、



三、完整代碼

#ifndef GL_TEST_H #define GL_TEST_H#include <qgl.h> //因為QGLWidget類被包含在qgl.h頭文件中 #include <glut.h> //使用glut庫中的API #include <QKeyEvent> #include <QTimer>//繼承QGLWidget得到OPenGL窗口部件類 class GL_Test : public QGLWidget { public:GL_Test(QWidget* parent = 0, bool fs = false);~GL_Test();protected:/*************************************************************************************************QGLWidget 類已經內置了對 OpenGL 的處理,就是通過對 initializeGL()、 paintGL()和 resizeGL()這個三個函數實現*************************************************************************************************/void initializeGL() override; //用來初始化OPenGL窗口,可以在里面設定一些有關選項void paintGL() override; //用來繪制OPenGL的窗口,只要有更新發生,這個函數就會被調用void resizeGL(int w, int h) override; //用來處理窗口大小變換這一事件,resizeGL()在處理完后會自動刷新屏幕void keyPressEvent(QKeyEvent* e) override; //Qt鍵盤事件處理函數void loadGLTextures(); //載入指定的圖片并生成相應的紋理protected:bool fullscreen; //用來保存窗口是否處于全屏狀態的變量GLfloat xRot, yRot, zRot; //用來處理立方體的旋轉GLuint texture[1]; //用來存儲紋理(長度為1的數組) };#endif // GL_TEST_H #include "gl_test.h"GL_Test::GL_Test(QWidget* parent, bool fs): QGLWidget(parent) {fullscreen = fs;xRot = 0.0;yRot = 0.0;zRot = 0.0;setGeometry(500,500,640,480); //設置窗口大小、位置setWindowTitle("The first OpenGL Window"); //設置窗口標題if(fullscreen) {showFullScreen();}QTimer* timer = new QTimer(this);connect(timer,&QTimer::timeout,[=]{updateGL();});timer->start(50); }GL_Test::~GL_Test() {}void GL_Test::initializeGL() {loadGLTextures(); //載入紋理glEnable(GL_TEXTURE_2D); //啟用紋理glShadeModel(GL_SMOOTH); //啟用smooth shading(陰影平滑)glClearColor(0.0, 0.0, 0.0, 0.5); //清除屏幕時所用的顏色,rgba【0.0(最黑)~1.0(最亮)】glClearDepth(1.0); //設置深度緩存glEnable(GL_DEPTH_TEST); //啟動深度測試glDepthFunc(GL_LEQUAL); //所作深度測試的類型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //真正精細的透視修正,告訴OPenGL我們希望進行最好的透視修正,這會十分輕微的影響性能,但使得透視圖看起來好一點 }void GL_Test::paintGL() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度緩存//-----------------------------------------glLoadIdentity(); //重置當前的模型觀察矩陣glTranslatef(0.0, 0.0, -5.0);glRotatef(xRot, 1.0, 0.0, 0.0); //繞X軸旋轉xRot度glRotatef(yRot, 0.0, 1.0, 0.0); //繞X軸旋轉yRot度glRotatef(zRot, 0.0, 0.0, 1.0); //繞X軸旋轉zRot度//選擇我們使用的紋理glBindTexture(GL_TEXTURE_2D, texture[0]);//如果您在您的場景中使用多個紋理,您應該使用來 glBindTexture(GL_TEXTURE_2D, texture[所使用紋理對應的數字]) 選擇要綁定的紋理;//當您想改變紋理時,應該綁定新的紋理。并且您不能在glBegin()和glEnd()之間綁定紋理,必須在glBegin()之前或glEnd()之后綁定;//繪制正方形開始glBegin(GL_QUADS);//前面glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );//后面glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 );//頂面glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, 1.0, 1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );//底面glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, -1.0, -1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );//右面glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );//左面glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );glEnd();//繪制正方形結束//-----------------------------------------xRot += 2;yRot += 3;zRot += 4; }void GL_Test::resizeGL(int w, int h) {if(h == 0) { //防止h為0h = 1;}glViewport(0, 0, (GLint)w, (GLint)h); //重置當前的視口(Viewport)glMatrixMode(GL_PROJECTION); //選擇投影矩陣glLoadIdentity(); //重置投影矩陣gluPerspective( 45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0 ); //建立透視投影矩陣glMatrixMode(GL_MODELVIEW); //選擇模型觀察矩陣glLoadIdentity(); //重置模型觀察矩陣 }void GL_Test::keyPressEvent(QKeyEvent* e) {switch (e->key()) {case Qt::Key_Q: {fullscreen = !fullscreen;if(fullscreen) {showFullScreen();}else {showNormal();setGeometry(500,500,640,480);}updateGL();break;}//case Qt::Key_Qcase Qt::Key_Escape: {close();}//Qt::Key_Escape}//switch (e->key()) }void GL_Test::loadGLTextures() {QImage tex,buf;if(!buf.load(":/Images/1591561503-gB5rD.jpg")) { //用QImage類載入紋理圖片QImage dummy(128,128,QImage::Format_RGB32); //如果載入不成功,生成一個128*128的32位色的綠色圖片dummy.fill(Qt::green);buf = dummy;}tex = QGLWidget::convertToGLFormat(buf); //QGLWidget的靜態函數,專門用來轉換圖片glGenTextures(1,&texture[0]); //創建一個紋理glBindTexture(GL_TEXTURE_2D,texture[0]); //使用來自位圖數據生成的典型紋理/*告訴OPenGL將紋理名字texture[0]綁定到紋理目標上;2D紋理只有高度(在Y軸上)和寬度(在X軸上)*///真正的創建紋理//GL_TEXTURE_2D:告訴 OpenGL 此紋理是一個 2D 紋理;//數字0:代表圖像的詳細程度;//數字3:是數據的成分數;//tex.width():是紋理的寬度//tex.height():是紋理的高度;//GL_RGBA:告訴 OpenGL 圖像數據由紅、綠、藍三色數據以及 alpha 通道數據組成;//GL_UNSIGNED_BYTE:意味著組成圖像的數據是無符號字節類型的;//tex.bits():告訴 OpenGL 紋理數據的來源;glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());//告訴 OpenGL 在顯示圖像時,當它比放大得原始的紋理大(GL_TEXTURE_MAG_FILTER)或縮小得比原始得紋理小(GL_TEXTURE_MIN_FILTER)時,//OpenGL 采用的濾波方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//我們都采用 GL_LINEAR,這使得紋理從很遠處到離屏幕很近時都平滑顯示;//使用 GL_LINEAR 需要 CPU 和顯卡做更多的運算,如果您的機器很慢,您也許應該采用 GL_NEAREST;//過濾的紋理在放大的時候,看起來斑駁的很,您也可以結合這兩種濾波方式: 在近處時使用 GL_LINEAR,遠處時 GL_NEAREST; }

附、給立方體每個面渲染不同的紋理

1、創建多個紋理

void GL_Test::loadGLTextures() {QStringList Images;Images << ":/Images/1591561503-gB5rD.jpg";Images << ":/Images/AI.png";Images << ":/Images/wallhaven-283q5m.png";Images << ":/Images/wallhaven-q2oxx7.png";Images << ":/Images/wallhaven-y85ojk.png";Images << ":/Images/wallhaven-z8pm7y.png";for(int i=0; i<6; ++i) {QImage tex,buf;if(!buf.load(Images.at(i))) { //用QImage類載入紋理圖片QImage dummy(128,128,QImage::Format_RGB32); //如果載入不成功,生成一個128*128的32位色的綠色圖片dummy.fill(Qt::green);buf = dummy;}tex = QGLWidget::convertToGLFormat(buf); //QGLWidget的靜態函數,專門用來轉換圖片glGenTextures(1,&texture[i]); //創建1個紋理,存儲在texture[i]中//---------------------------------------------------------------------------------------glBindTexture(GL_TEXTURE_2D,texture[i]); //使用來自位圖數據生成的典型紋理/*告訴OPenGL將紋理名字texture[0]綁定到紋理目標上;2D紋理只有高度(在Y軸上)和寬度(在X軸上)*///真正的創建紋理//GL_TEXTURE_2D:告訴 OpenGL 此紋理是一個 2D 紋理;//數字0:代表圖像的詳細程度;//數字3:是數據的成分數;//tex.width():是紋理的寬度//tex.height():是紋理的高度;//GL_RGBA:告訴 OpenGL 圖像數據由紅、綠、藍三色數據以及 alpha 通道數據組成;//GL_UNSIGNED_BYTE:意味著組成圖像的數據是無符號字節類型的;//tex.bits():告訴 OpenGL 紋理數據的來源;glTexImage2D(GL_TEXTURE_2D,0,3,tex.width(),tex.height(),0, GL_RGBA,GL_UNSIGNED_BYTE,tex.bits());//告訴 OpenGL 在顯示圖像時,當它比放大得原始的紋理大(GL_TEXTURE_MAG_FILTER)或縮小得比原始得紋理小(GL_TEXTURE_MIN_FILTER)時,//OpenGL 采用的濾波方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//我們都采用 GL_LINEAR,這使得紋理從很遠處到離屏幕很近時都平滑顯示;//使 用 GL_LINEAR 需要 CPU 和顯卡做更多的運算,如果您的機器很慢,您也許應該采用 GL_NEAREST;//過濾的紋理在放大的時候,看起來斑駁的很,您也可以結合這兩種濾波方式: 在近處時使用 GL_LINEAR,遠處時 GL_NEAREST;} }

2、不同面使用不同紋理

void GL_Test::paintGL() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度緩存glLoadIdentity(); //重置當前的模型觀察矩陣glTranslatef(0.0, 0.0, zoom);glRotatef(xRot, 1.0, 0.0, 0.0); //繞X軸旋轉xRot度glRotatef(yRot, 0.0, 1.0, 0.0); //繞X軸旋轉yRot度// //選擇我們使用的紋理 // glBindTexture(GL_TEXTURE_2D, texture[filter]); // //如果您在您的場景中使用多個紋理,您應該使用來 glBindTexture(GL_TEXTURE_2D, texture[所使用紋理對應的數字]) 選擇要綁定的紋理; // //當您想改變紋理時,應該綁定新的紋理。并且您不能在glBegin()和glEnd()之間綁定紋理,必須在glBegin()之前或glEnd()之后綁定;//-----------------------------------------glBindTexture(GL_TEXTURE_2D, texture[0]);//繪制正方形開始glBegin(GL_QUADS);//前面glNormal3f(0.0, 0.0, 1.0); //x、y、z,垂直于面的法線向量glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );glEnd();//繪制正方形結束//-----------------------------------------//-----------------------------------------glBindTexture(GL_TEXTURE_2D, texture[1]);//繪制正方形開始glBegin(GL_QUADS);//后面glNormal3f(0.0, 0.0, -1.0); //x、y、z,垂直于面的法線向量glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 );glEnd();//繪制正方形結束//-----------------------------------------//-----------------------------------------glBindTexture(GL_TEXTURE_2D, texture[2]);//繪制正方形開始glBegin(GL_QUADS);//頂面glNormal3f(0.0, 1.0, 0.0); //x、y、z,垂直于面的法線向量glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, 1.0, 1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );glEnd();//繪制正方形結束//-----------------------------------------//-----------------------------------------glBindTexture(GL_TEXTURE_2D, texture[3]);//繪制正方形開始glBegin(GL_QUADS);//底面glNormal3f(0.0, -1.0, 0.0); //x、y、z,垂直于面的法線向量glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, -1.0, -1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );glEnd();//繪制正方形結束//-----------------------------------------//-----------------------------------------glBindTexture(GL_TEXTURE_2D, texture[4]);//繪制正方形開始glBegin(GL_QUADS);//右面glNormal3f(1.0, 0.0, 0.0); //x、y、z,垂直于面的法線向量glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );glEnd();//繪制正方形結束//-----------------------------------------//-----------------------------------------glBindTexture(GL_TEXTURE_2D, texture[5]);//繪制正方形開始glBegin(GL_QUADS);//左面glNormal3f(-1.0, 0.0, 0.0);glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );glEnd();//繪制正方形結束//-----------------------------------------xRot += xSpeed;yRot += ySpeed; }

總結

以上是生活随笔為你收集整理的OPenGL笔记--给立方体贴图(纹理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美伊人 | 一级淫片在线观看 | 麻豆传媒网 | 污视频网址在线观看 | 欧美三级一区二区 | 97夜夜操| 成人在线激情 | 无套内谢老熟女 | 成人在线免费观看视频 | 国产三级按摩推拿按摩 | 九一精品一区 | 亚洲成人av一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 日韩精品久久久久久久酒店 | 国产精品久久久久久一区二区三区 | 91视频黄| 片集网 | 999精品免费视频 | 91午夜精品 | 日本在线一区二区三区 | 青草青草视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 日本不卡在线视频 | 国产视色 | 久久久国产视频 | 亚洲一级影院 | 日韩久久中文字幕 | 国产女主播喷水视频在线观看 | 蜜桃在线一区 | 久久久久国产精品一区 | 超碰123 | 成年精品| 久久亚洲无码视频 | 欧美亚洲在线播放 | 久久久青青草 | 日韩欧美一卡二卡 | 公侵犯人妻一区二区 | 福利二区视频 | 亚洲精品国产成人久久av盗摄 | 色多多在线观看 | 91射区| 久一在线视频 | 91中文字幕视频 | 亚洲一二区在线 | 另类小说色 | 久久免费手机视频 | 91午夜精品亚洲一区二区三区 | 999久久久精品视频 亚洲视频精品在线 | 性一交一乱一精一晶 | 都市激情校园春色亚洲 | 很黄很污的视频网站 | 欧美色图一区二区 | 欧美人妖xxxx | 秋霞二区 | 免费婷婷 | 桃色成人 | 亚洲欧洲av在线 | 国产伦理一区二区 | 免费级毛片 | 69性视频 | 亚洲成人二区 | 国产在线视频99 | 少妇扒开粉嫩小泬视频 | 亚洲精品777| 亚洲精品国产成人无码 | 国产精品久久久久久久久晋中 | 一区二区视频在线 | 国产欧美一区二区三区在线老狼 | sese欧美| 亚洲视频区 | 日韩激情国产 | 国产精品一卡二卡在线观看 | 狠狠一区二区 | 日本肉体xxxx裸体xxx免费 | 日韩精品一区二区三区在线观看 | 亚洲精品视屏 | www.国产色 | 欧美性生交xxxxx久久久缅北 | av小说在线 | 午夜激情男女 | 国产色在线,com | 亚洲av电影天堂男人的天堂 | 51成人网| 国产又粗又猛又黄又爽 | 日产电影一区二区三区 | 九七电影院97理论片 | 成人福利在线播放 | 麻豆成人在线 | 亚洲午夜激情 | av大片在线免费观看 | 欧美一性一交 | 午夜免费视频 | 久久久999久久久 | va在线播放 | 欧美日韩大片在线观看 | 先锋影音中文字幕 | 一道本在线播放 | 97人妻精品一区二区三区免费 | 国内福利视频 |