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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenGL--纹理贴图基础

發布時間:2023/12/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL--纹理贴图基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 理論基礎
    紋理貼圖:通俗地講就是可以把我們讀取的紋理加載到圖元表面的一種技術,這樣大大的提高了圖像的表現質量。

  • 實例代碼
    //讀取tga格式圖片
/*tga圖片頭信息結構*/ #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)/*tga圖片讀取*/ GLbyte *gltReadTGABits(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_RGB;*iComponents = GL_RGB;// Attempt to open the filepFile = 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__LITTLE_ENDIAN_WORD(&tgaHeader.colorMapStart);LITTLE_ENDIAN_WORD(&tgaHeader.colorMapLength);LITTLE_ENDIAN_WORD(&tgaHeader.xstart);LITTLE_ENDIAN_WORD(&tgaHeader.ystart);LITTLE_ENDIAN_WORD(&tgaHeader.width);LITTLE_ENDIAN_WORD(&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 = (GLbyte*)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){ #ifndef OPENGL_EScase 3: // Most likely case*eFormat = GL_BGR;*iComponents = GL_RGB;break; #endifcase 4:*eFormat = GL_BGRA;*iComponents = GL_RGBA;break;case 1:*eFormat = GL_LUMINANCE;*iComponents = GL_LUMINANCE;break;default: // RGB// If on the iPhone, TGA's are BGR, and the iPhone does not// support BGR without alpha, but it does support RGB,// so a simple swizzle of the red and blue bytes will suffice.// For faster iPhone loads however, save your TGA's with an Alpha! #ifdef OPENGL_ESfor(int i = 0; i < lImageSize; i+=3){GLbyte temp = pBits[i];pBits[i] = pBits[i+2];pBits[i+2] = temp;} #endifbreak;}// Done with Filefclose(pFile);// Return pointer to image datareturn pBits; }

//紋理貼圖使用一般步驟:1,初始化:創建紋理對象,設置紋理過濾方式,為當前創建的紋理對象指定紋理 2,使用:激活,指定當前活動紋理并為頂點指定紋理坐標//

#include "GLTools.h"#ifdef __APPLE__ #include <glut/glut.h> #else #define FREEGLUT_STATIC #include <GL/glut.h> #endifGLuint texName; GLbyte *pBits; int nWidth, nHeight, nComponents; GLenum eFormat;void init(void) {glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);glEnable(GL_DEPTH_TEST);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);//設置像素存儲模式//讀取tga圖像數據pBits = gltReadTGABits("/Users/app05/Desktop/opengl/stone.tga", &nWidth, &nHeight, &nComponents, &eFormat);if(pBits == NULL)printf("tga load failed");glGenTextures(1, &texName);//生成1個未使用的紋理對象標志glBindTexture(GL_TEXTURE_2D, texName);//創建紋理對象(存儲紋理數據的容器)/*設置紋理過濾方式*///指當紋理坐標的第一維坐標值大于1.0或小于0.0時,應該如何處理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);//指當紋理坐標的第二維坐標值大于1.0或小于0.0時,應該如何處理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//紋理圖象被使用到一個小于它的形狀上,應該如何處理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);/*設置如果紋理圖象被使用到一個大于它的形狀上時,像素如何填充,可選擇的設置有GL_NEAREST和GL_LINEAR,前者表示“使用紋理中坐標最接近的一個像素的顏色作為需要繪制的像素顏色”,后者表示“使用紋理中坐標最接近的若干個顏色,通過加權平均算法得到需要繪制的像素顏色",后者效果要比前者好。*/glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);//指定二維紋理glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);free(pBits); }void display(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_TEXTURE_2D);//激活二維紋理貼圖//設置紋理貼圖方式(直接覆蓋原來顏色或與原來顏色混合)glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//直接使用紋理覆蓋模式glBindTexture(GL_TEXTURE_2D, texName);//指定當前使用的紋理(第一次使用和第二次使用含義不同)//為每個頂點指定紋理坐標,類似指定法線一樣glNormal()glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);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(2.41421, 1.0, -1.41421);glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);glEnd();glFlush();glDisable(GL_TEXTURE_2D);//關閉二維紋理貼圖 }void reshape(int w, int h) {glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, -3.6); }int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(250, 250);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0; }

總結

以上是生活随笔為你收集整理的OpenGL--纹理贴图基础的全部內容,希望文章能夠幫你解決所遇到的問題。

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