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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

opengl纹理示例

發(fā)布時(shí)間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opengl纹理示例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一 一個(gè)簡(jiǎn)單例子

首先做一個(gè)簡(jiǎn)單例子;繪制一個(gè)簡(jiǎn)單的二維紋理圖,并將該圖像映射到一個(gè)四邊形上;代碼;


#include <stdlib.h> #include <GL/glut.h> #define imageWidth 64 #define imageHeight 64 GLubyte image[imageWidth][imageHeight][3];/*繪制一個(gè)簡(jiǎn)單的二維紋理圖*/ void makeImage(void) {int i,j,r,g,b;/*根據(jù)點(diǎn)的位置設(shè)置不同的顏色*/for(i = 0;i < imageWidth;i++){for(j = 0;j <imageHeight;j++){r = (i*j)%255;g = (i*i)%255;b = (j*j)%255;image[i][j][0] = (GLubyte)b;image[i][j][1] = (GLubyte)g;image[i][j][2] = (GLubyte)r;}} }void myInit(void) {glClearColor(0.0,0.0,0.0,0.0);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);makeImage();glPixelStorei(GL_UNPACK_ALIGNMENT,1);/*指定二維紋理映射*/glTexImage2D(GL_TEXTURE_2D,0,3,imageWidth,imageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,&image[0][0][0]);/*設(shè)置紋理參數(shù)*/glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);/*設(shè)置紋理環(huán)境參數(shù)*/glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);glEnable(GL_TEXTURE_2D);glShadeModel(GL_FLAT); }void myDisplay(void) {glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/*將紋理映射到四邊形上*/glBegin(GL_QUADS);/*紋理的坐標(biāo)和四邊形頂點(diǎn)的對(duì)應(yīng)*/glTexCoord2f(0.0,0.0); glVertex3f(-1.0,1.0,0.0);glTexCoord2f(0.0,1.0); glVertex3f(-1.0,-1.0,0.0);glTexCoord2f(1.0,1.0); glVertex3f(1.0,-1.0,0.0);glTexCoord2f(1.0,0.0); glVertex3f(1.0,1.0,0.0);glEnd();glFlush(); }void myReshape(int w,int h) {glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);//glMatrixMode(GL_TEXTURE);glLoadIdentity();gluPerspective(80.0,1.0-(GLfloat)w/(GLfloat)h,1.0,30.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); }int main(int argc,char **argv) {/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(200,200);/*創(chuàng)建窗口*/glutCreateWindow(" Texture ");/*繪制與顯示*/myInit();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return 0; }
效果:



二 示例2

編譯如下一個(gè)例子;需要用到《OpenGL超級(jí)寶典》中的一些庫(kù)和頭文件;未編譯成功;不過(guò)過(guò)程和用到的一些資源比較有用;記錄一下;

1 代碼

#include "gltools.h" //#include "math3d.h" #include <GL/glut.h> #include <stdio.h>// Define targa header. #pragma pack(1) typedef struct{GLbyte identsize; // Size of ID field that follows header (0)GLbyte colorMapType; // 0 = None, 1 = palettedGLbyte imageType; // 0 = none, 1 = indexed, 2 = rgb, 3 = grey, +8=rleunsigned short colorMapStart; // First colour map entryunsigned short colorMapLength; // Number of colorsunsigned char colorMapBits; // bits per palette entryunsigned short xstart; // image x originunsigned short ystart; // image y originunsigned short width; // width in pixelsunsigned short height; // height in pixelsGLbyte bits; // bits per pixel (8 16, 24, 32)GLbyte descriptor; // image descriptor} TGAHEADER; #pragma pack(8)GLbyte *gltLoadTGA(const char *szFileName, GLint *iWidth, GLint *iHeight, GLint *iComponents, GLenum *eFormat){FILE *pFile; // File pointerTGAHEADER tgaHeader; // TGA file headerunsigned long lImageSize; // Size in bytes of imageshort sDepth; // Pixel depth;GLbyte *pBits = NULL; // Pointer to bits// Default/Failed values*iWidth = 0;*iHeight = 0;*eFormat = GL_BGR_EXT;*iComponents = GL_RGB8;// Attempt to open the filpFile = fopen(szFileName, "rb");if(pFile == NULL)return NULL;// Read in header (binary)fread(&tgaHeader, 18/* sizeof(TGAHEADER)*/, 1, pFile);// Do byte swap for big vs little endian #ifdef __APPLE__BYTE_SWAP(tgaHeader.colorMapStart);BYTE_SWAP(tgaHeader.colorMapLength);BYTE_SWAP(tgaHeader.xstart);BYTE_SWAP(tgaHeader.ystart);BYTE_SWAP(tgaHeader.width);BYTE_SWAP(tgaHeader.height); #endif// Get width, height, and depth of texture*iWidth = tgaHeader.width;*iHeight = tgaHeader.height;sDepth = tgaHeader.bits / 8;// Put some validity checks here. Very simply, I only understand// or care about 8, 24, or 32 bit targa's.if(tgaHeader.bits != 8 && tgaHeader.bits != 24 && tgaHeader.bits != 32)return NULL;// Calculate size of image bufferlImageSize = tgaHeader.width * tgaHeader.height * sDepth;// Allocate memory and check for successpBits = (signed char *)malloc(lImageSize * sizeof(GLbyte));if(pBits == NULL)return NULL;// Read in the bits// Check for read error. This should catch RLE or other // weird formats that I don't want to recognizeif(fread(pBits, lImageSize, 1, pFile) != 1){free(pBits);return NULL;}// Set OpenGL format expectedswitch(sDepth){case 3: // Most likely case*eFormat = GL_BGR_EXT;*iComponents = GL_RGB8;break;case 4:*eFormat = GL_BGRA_EXT;*iComponents = GL_RGBA8;break;case 1:*eFormat = GL_LUMINANCE;*iComponents = GL_LUMINANCE8;break;};// Done with Filefclose(pFile);// Return pointer to image datareturn pBits;}static GLint iWidth, iHeight, iComponents; static GLenum eFormat; static GLfloat xRot, yRot;static GLfloat noLight[4] = {0.0f, 0.0f, 0.0f, 1.0f}; static GLfloat ambientLight[4] = {0.3f, 0.3f, 0.3f, 1.0f}; static GLfloat diffuseLight[4] = {0.7f, 0.7f, 0.7f, 1.0f}; static GLfloat brightLight[4] = {1.0f, 1.0f, 1.0f, 1.0f};//光的位置在右上角 static GLfloat lightPos[] = { 5.0f, 5.0f, 5.0f, 1.0f};void SetupRC() {glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glCullFace(GL_BACK);glFrontFace(GL_CCW);glEnable(GL_CULL_FACE);glEnable(GL_DEPTH_TEST);//設(shè)置光照環(huán)境glEnable(GL_LIGHTING);glLightModelfv(GL_LIGHT_MODEL_AMBIENT, noLight);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, brightLight);glLightfv(GL_LIGHT0, GL_POSITION, lightPos);glEnable(GL_LIGHT0);//開啟顏色追蹤glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);glMaterialfv(GL_FRONT, GL_SPECULAR, brightLight);//鏡面光加亮的范圍設(shè)置大一點(diǎn)glMateriali(GL_FRONT, GL_SHININESS, 30);//讀取圖像文件glPixelStorei(GL_UNPACK_ALIGNMENT, 1);void *pImage = NULL;pImage = gltLoadTGA("..\\stone.tga", &iWidth, &iHeight, &iComponents, &eFormat);if (pImage){//加載紋理,然后釋放臨時(shí)的內(nèi)存glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pImage);free(pImage);pImage = NULL;}//設(shè)置紋理過(guò)濾glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//設(shè)置紋理環(huán)境glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);glEnable(GL_TEXTURE_2D); }void RenderScene() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/*金字塔頂點(diǎn)下標(biāo)為0,底部坐標(biāo)如下1______2| ||______|3 4*///金字塔頂點(diǎn)數(shù)組M3DVector3f vertices[5] = {{0.0f, 0.8f, 0.0f},{-.50f, 0.0f, -.50f},{.50f, 0.0f, -.50f},{-.50f, 0.0f, .50f},{.50f, 0.0f, .50f}};//表面法線向量M3DVector3f normal;glPushMatrix();//先往里和往下平移一點(diǎn)glTranslatef(0.0f, -0.3f, -4.0f);if (xRot > 360.5f){xRot = 0.0f;}if (yRot > 360.5f){yRot = 0.0f;}//進(jìn)行旋轉(zhuǎn)glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);xRot += 0.5f;yRot += 0.5f;glBegin(GL_TRIANGLES);//底面的四方形由兩個(gè)三角形組成glColor3f(1.0f, 0.0f, 0.0f);//注意法線和紋理都要在頂點(diǎn)之前設(shè)置glNormal3f(0.0f, -1.0f, 0.0f);glTexCoord2f(0.0f, 1.0f);glVertex3fv(vertices[1]);glTexCoord2f(1.0f, 1.0f);glVertex3fv(vertices[2]);glTexCoord2f(1.0f, 0.0f);glVertex3fv(vertices[4]);glTexCoord2f(1.0f, 0.0f);glVertex3fv(vertices[4]);glTexCoord2f(0.0f, 0.0f);glVertex3fv(vertices[3]);glTexCoord2f(0.0f, 1.0f);glVertex3fv(vertices[1]);//前面glColor3f(0.0f, 1.0f, 0.0f);m3dFindNormal(normal, vertices[0], vertices[3], vertices[4]);glNormal3fv(normal);glTexCoord2f(0.5f, 0.5f);glVertex3fv(vertices[0]);glTexCoord2f(0.0f, 0.0f);glVertex3fv(vertices[3]);glTexCoord2f(1.0f, 0.0f);glVertex3fv(vertices[4]);//左側(cè)面glColor3f(0.0f, 0.0f, 1.0f);m3dFindNormal(normal, vertices[1], vertices[3], vertices[0]);glNormal3fv(normal);glTexCoord2f(0.0f, 0.0f);glVertex3fv(vertices[1]);glTexCoord2f(1.0f, 0.0f);glVertex3fv(vertices[3]);glTexCoord2f(0.5f, 0.5f);glVertex3fv(vertices[0]);//右側(cè)面glColor3f(0.0f, 1.0f, 1.0f);m3dFindNormal(normal, vertices[0], vertices[4], vertices[2]);glNormal3fv(normal);glTexCoord2f(0.5f, 0.5f);glVertex3fv(vertices[0]);glTexCoord2f(0.0f, 0.0f);glVertex3fv(vertices[4]);glTexCoord2f(1.0f, 0.0f);glVertex3fv(vertices[2]);//后面glColor3f(1.0f, 0.0f, 1.0f);m3dFindNormal(normal, vertices[0], vertices[2], vertices[1]);glNormal3fv(normal);glTexCoord2f(0.5f, 0.5f);glVertex3fv(vertices[0]);glTexCoord2f(0.0f, 0.0f);glVertex3fv(vertices[2]);glTexCoord2f(1.0f, 0.0f);glVertex3fv(vertices[1]);glEnd();glPopMatrix();glutSwapBuffers(); }void ChangeSize(GLsizei w, GLsizei h) {if (h == 0)h = 1;glViewport(0, 0, w, h);float fAspect = (GLfloat)w/(GLfloat)h;glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(35.0, fAspect, 1.0, 100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glutPostRedisplay(); }void TimerFunc(int value) {glutPostRedisplay();glutTimerFunc(60, TimerFunc, 1); }int main(int args, char *arv[]) {glutInit(&args, arv);glutInitDisplayMode(GL_RGB | GL_DOUBLE | GL_DEPTH);glutInitWindowSize(800, 600);glutCreateWindow("pyramid");glutDisplayFunc(RenderScene);glutReshapeFunc(ChangeSize);SetupRC();glutTimerFunc(50, TimerFunc, 1);glutMainLoop();return 0; }

2 LNK 1103錯(cuò)誤

Linking...
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
gltools.lib(math3d.obj) : fatal error LNK1103: debugging information corrupt; recompile module
執(zhí)行 link.exe 時(shí)出錯(cuò).




在VC6下選中上圖的 忽略全部默認(rèn)庫(kù)后;不再出現(xiàn)此錯(cuò)誤;我用的VC6,估計(jì)在VS2008以上不會(huì)出現(xiàn)此錯(cuò)誤;


3 關(guān)于gltLoadTGA

參閱此文

http://larrycheung.blog.163.com/blog/static/13172966120129284281428/

另外還需要一個(gè)輔助函數(shù)gltLoadTGA;

我已經(jīng)加入到上面代碼中;

另外還有一個(gè)opengl讀取tga文件的類,在此處;

http://download.csdn.net/detail/jiangcaiyang123/4823365


如果出現(xiàn)下述錯(cuò)誤,

wenli2.cpp(69) : error C2440: '=' : cannot convert from 'void *' to 'signed char *'

pBits = malloc(lImageSize * sizeof(GLbyte));
改為

pBits = (signed char *)malloc(lImageSize * sizeof(GLbyte));

4 用到的庫(kù)

gltools.h, gltools.lib,OpenGL超級(jí)寶典完整源碼 中附帶;

glew庫(kù);偶又額外下了一個(gè)glew-1.9.0;?

在后面鏈接中有;


另外還有一個(gè)

http://blog.csdn.net/van_2013/article/details/47165953

5 LNK 2001錯(cuò)誤

弄好上面;再編譯,還有下述錯(cuò)誤;

Linking...
wenli2.obj : error LNK2001: unresolved external symbol _fclose
wenli2.obj : error LNK2001: unresolved external symbol _free
wenli2.obj : error LNK2001: unresolved external symbol _malloc
wenli2.obj : error LNK2001: unresolved external symbol _fread
wenli2.obj : error LNK2001: unresolved external symbol _fopen
wenli2.obj : error LNK2001: unresolved external symbol __chkesp
wenli2.obj : error LNK2001: unresolved external symbol __fltused
gltools.lib(math3d.obj) : error LNK2001: unresolved external symbol __fltused
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
gltools.lib(math3d.obj) : error LNK2001: unresolved external symbol __CIcos
gltools.lib(math3d.obj) : error LNK2001: unresolved external symbol __CIsin
gltools.lib(math3d.obj) : error LNK2001: unresolved external symbol __CIsqrt
gltools.lib(math3d.obj) : error LNK2001: unresolved external symbol __CItan
Debug/wenli2.exe : fatal error LNK1120: 12 unresolved externals
執(zhí)行 link.exe 時(shí)出錯(cuò).


CIcos、CIsin等這些都是3d的數(shù)學(xué)計(jì)算函數(shù);看樣子需要把?OpenGL超級(jí)寶典完整源碼 中相關(guān)工程編譯;除了gltools.lib外,再獲得math3d的lib和dll,才可以;

目前只有VC6;先到這里吧;


6 資源下載

上面兩個(gè)工程;glew庫(kù)1.9.0, gltools庫(kù),OpenGL超級(jí)寶典完整源碼(第五版);包含在下面;

http://pan.baidu.com/s/1eRF0LTS




《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的opengl纹理示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 手机在线成人av | www.五月天激情 | 亚洲精品国产精华液 | 97自拍偷拍| 黄色片免费网站 | 狠色综合7777夜色撩人 | 国产精品xxxxx | 俄罗斯毛片基地 | 亚洲啊啊 | 成人片黄网站久久久免费 | 综合色在线视频 | 美女露隐私网站 | 五月婷婷在线观看视频 | 成人美女在线观看 | 国产精品入口66mio男同 | 国产成人激情视频 | 91色区| 99亚洲欲妇 | 96在线观看| 国产伦精品一区二区三区免费 | 动漫av在线免费观看 | 国产免费又粗又猛又爽 | 欧美日韩亚洲国产 | 色之久久综合 | 欧美精品卡一卡二 | 国产美女永久免费 | 亚洲天堂视频一区 | 午夜免费福利视频 | 无遮挡aaaaa大片免费看 | 69精品视频 | 91尤物在线| 免费看毛片网站 | 黑人3p波多野结衣在线观看 | 亚洲成人播放器 | 欧美精品日韩在线观看 | 久久免费视屏 | 在线不卡日本 | 亚洲一区第一页 | 少妇无内裤下蹲露大唇视频 | 亚洲视频一区二区在线观看 | 亚洲成人诱惑 | 玖玖色在线 | 狂野少女电影在线观看国语版免费 | 开心激情网五月天 | 亚洲一区二区三区视频在线 | 天天干夜夜干 | 久久97人妻无码一区二区三区 | 亚洲av熟女国产一区二区性色 | 好吊操精品视频 | 国产精品无码一区二区三区三 | 亚洲第七页 | 欧美日韩国产成人精品 | 少妇久久久 | 91污网站 | 欧美精品一区二区蜜臀亚洲 | 国产精品久久久久久久久久久久午夜片 | 九色免费视频 | 中国在线观看免费高清视频播放 | 成人免费播放视频 | 欧美中文字幕 | 少妇人妻一区二区三区 | 欧美做受高潮6 | 国产黄色片视频 | 一区二区乱子伦在线播放 | 日韩欧美在线看 | 日韩国产欧美 | 1024久久| 天天射天天操天天干 | av永久免费网站 | 国产欧美一区二区三区在线老狼 | 欧美少妇一区二区 | 国产99久 | 久久精品国产99久久不卡 | 国产又爽又黄又嫩又猛又粗 | 99久久久无码国产精品性波多 | 欧美精品一 | 欧美视频三区 | 亚洲制服丝袜一区 | 中文字幕精品亚洲 | 一级性生活毛片 | 99精品欧美一区二区蜜桃免费 | 国产在线中文字幕 | 欧美精品综合 | 亚洲毛片儿 | 日韩精品欧美在线 | 精品美女久久 | 免费黄色国产 | 黄频视频在线观看 | 真人一及毛片 | 国产精品白嫩极品美女 | 8090av| 亚洲精选一区二区 | 国产特级黄色片 | 在线免费观看黄网站 | 天天爽夜夜爽夜夜爽精品 | 午夜激情啪啪 | 超碰97在线人人 | 日本美女黄色大片 | 黄色免费网站在线观看 |