• 理论基础
    纹理贴图:通俗地讲就是可以把我们读取的纹理加载到图元表面的一种技术,这样大大的提高了图像的表现质量。

  • 实例代码
    //读取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--纹理贴图基础相关推荐

  1. C++ Opengl纹理贴图源码

    C++ Opengl纹理贴图源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...

  2. OpenGL 纹理贴图

    纹理贴图允许把一幅砖墙图像映射到一个多边形的表面上,并把正面墙画成单个多边形.纹理贴图能够保证当这个多边形变形或渲染时,映射到多边形表面的图像也能够表现出正确的行为. 纹理贴图是一个相当大的主题,并且 ...

  3. 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )

    文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...

  4. Qt5.6.0+OpenGL 纹理贴图首战告捷

    重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...

  5. C++写纹理贴图中OBJ文件和MTL(材质)文件

    在VTK 或者Opengl纹理贴图中都会用到模型文件,当使用vtkOBJImporter函数读取模型数据时,需要对应的MTL文件才能实现纹理贴图,但是网上大多数的OBJ文件和MTL文件都是由模型软件导 ...

  6. opengl生成图片php,(转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片...

    转:http://blog.csdn.net/junzia/article/details/52842816 前面几篇博客,我们将了Android中利用OpenGL ES 2.0绘制各种形体,并在上一 ...

  7. openCV读入图片,openGL实现纹理贴图

    本文结合结合openCV,openGL的优点,实现混合编程. (1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便: (2)OpenGL是跨平台的图形程序接口,它用于二维,三维 ...

  8. OpenGL(二十二) gluBuild2DMipmaps 加载Mip纹理贴图

    当纹理被用于渲染一个面积比它本身小很多的对象时,会由于纹理图像的降采样率不足而导致混叠现象,主要的表现特征是纹理图像的闪烁,出现纹理躁动.特别是在场景远近移动变换时,这种闪烁情况更为明显,严重可能会影 ...

  9. OpenGL ES之十——纹理贴图(展示一张图片)

    概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...

  10. 现代opengl 设计入门,坐标系统和立方体的纹理贴图

    本文在 现代opengl 设计入门,纹理贴图 一文的基础上,引入opengl坐标系统,实现立方体的纹理贴图.介绍了opengl 的5个空间,3个变换矩阵.如果看这部分介绍比较繁琐,可以直接看看效果图, ...

最新文章

  1. 更好的Java虚拟机Zing: 更好的性能,无停顿,更快的启动
  2. 用clock()统计代码的执行时间(C语言)
  3. php linux权限,Linux权限详细介绍
  4. ic5141运行出现cannot compile ahdlcmi module解决方案
  5. Leetcode贪心 验证回文字符串
  6. 解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]
  7. 关于在 matlab 中使用 ode45 算出拉格朗日方程中的关节加速度
  8. mysql日志文件转存_【转】Mysql日志文件
  9. c++内存优化:二级间接索引模式内存池
  10. FunCode太空战机C++实现
  11. 2021年中国新型电力系统行业市场现状、竞争格局与发展方向分析「图」
  12. 【实用】MD5加密工具类及加密过程详解
  13. 2023西安电子科技大学计算机考研信息汇总
  14. 网易游戏再出新招:探索人脸识别功能
  15. JS学习之路系列总结四象阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)...
  16. Uncaught SyntaxError The requested module ‘node_modules.vitevue.jsv=50ccac76‘ does not provide
  17. JSTL引发的内存泄露
  18. SQlServer的日期相减(间隔)dateadd ,datediff 函数
  19. 国内OCR供应商及其演示链接
  20. AS3 加解密的隐藏常用方式分析

热门文章

  1. matlab语音去除白噪声_matlab去除高斯白噪声
  2. vb mysql登录界面_VB\数据库--模拟系统登录界面
  3. 西南科技大学oj题逆置顺序表
  4. 3. DICOM图像层级分类-DCMTK-数据字典避坑
  5. 社区团购微信小程序开发
  6. 【Mendeley】自定义文献引用格式(cite style)并保存
  7. 幼儿园观察记录的目的和目标_幼儿园教育活动内容实施中的观察与记录有何目的...
  8. Unity渲染性能优化总纲
  9. 论文模型构建的步骤_论文实证经验分享|VAR模型实操步骤(下)
  10. github注册以及安装教程