首先先从图像中读取纹理:

Program part1:
void SetUpTextureMaps( void ){// This texture object is for the ceiling texture map.GLuint ceilingTexObj;  const char ceilingTexFile[] = "images/ceiling.jpg";glGenTextures( 1, &ceilingTexObj );glBindTexture( GL_TEXTURE_2D, ceilingTexObj );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );if ( ReadImageFile( ceilingTexFile, &imageData, &imageWidth, &imageHeight, &numComponents ) == 0 ) exit( 1 );if ( numComponents != 3 ){fprintf( stderr, "Error: Texture image is not in RGB format.\n" );exit( 1 );}gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, imageWidth, imageHeight,GL_RGB, GL_UNSIGNED_BYTE, imageData );DeallocateImageData( &imageData );}

从代码中可以看到, glGenTextures( 1, &ceilingTexObj )为当前从文件中读入的纹理分配了一个索引值(其实就是一个整数),将其设置为当前active的纹理,然后从文件中读入纹理,这样程序就知道该所以对应的纹理就是读入的这个;

接着,使用纹理,用纹理来进行纹理贴图:

Program part2:
void DrawRoom( void )
{const float ROOM_HALF_WIDTH = ROOM_WIDTH / 2.0f;glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );// Ceiling.
GLfloat matAmbient1[] = { 0.7, 0.7, 0.7, 1.0 };GLfloat matDiffuse1[] = { 0.7, 0.7, 0.7, 1.0 };GLfloat matSpecular1[] = { 0.3, 0.3, 0.3, 1.0 };GLfloat matShininess1[] = { 32.0 };glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient1 );glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse1 );glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular1 );glMaterialfv( GL_FRONT_AND_BACK, GL_SHININESS, matShininess1 );glBindTexture( GL_TEXTURE_2D, ceilingTexObj );glNormal3f( 0.0, -1.0, 0.0 ); // Normal vector.SubdivideAndDrawQuad( 24, 24, 0.0, 0.0, ROOM_HALF_WIDTH, ROOM_HEIGHT, ROOM_HALF_WIDTH,ROOM_WIDTH, 0.0, -ROOM_HALF_WIDTH, ROOM_HEIGHT, ROOM_HALF_WIDTH,ROOM_WIDTH, ROOM_WIDTH, -ROOM_HALF_WIDTH, ROOM_HEIGHT, -ROOM_HALF_WIDTH,0.0, ROOM_WIDTH, ROOM_HALF_WIDTH, ROOM_HEIGHT, -ROOM_HALF_WIDTH );
}

在这里我们使用了ceilingTexObj ,它指向第一部分程序读入的texture,将其设为当前active的纹理,然后实现贴图。

备注:SubdivideAndDrawQuad()实现了纹理坐标与面坐标的对应。

Extra information

当要求用我们自己从某一视点看到的场景来作为纹理的话,我们应该设置好视点的位置,然后进行view,这时我们看到的内容存在后缓冲区里,最后从后缓冲区中读取纹理,进行贴图。

这里我们主要要做的是对比使用buffer中的纹理与使用从图像中读取的纹理在设置纹理时的区别(使用函数SetUpTextureMaps()进行纹理设置):

Program part3:
void SetUpTextureMaps( void )
{
// This texture object is for storing the reflection image.
glGenTextures( 1, &reflectionTexObj );glBindTexture( GL_TEXTURE_2D, reflectionTexObj );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE );
}

对比program part1与program part3,区别在于,part1读入图片之后使用gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, imageWidth, imageHeight,                       GL_RGB, GL_UNSIGNED_BYTE, imageData ) 来生成Mipmaps纹理即用imageData来生成Mipmap;而在part3中我们用glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE ),即设置将GL_GENERATE_MIPMAP设置为GL_TRUE即可,就能从后缓存中的场景产生Mipmap.

Draw时,只需激活即glBindTexture,绘制的时候,程序就会运用该纹理的索引reflectionTexObj 指向内存中该图像,或者我们view后场景在内存中的位置。

// Read color buffer into texture object.
glReadBuffer( GL_BACK );
glBindTexture( GL_TEXTURE_2D, reflectionTexObj );
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, winWidth, winHeight, 0);

这一步完成了从back buffer中读取我们自己view的场景作为纹理。

转载于:https://www.cnblogs.com/qingsunny/archive/2013/03/28/2986147.html

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 设计入门,坐标系统和立方体的纹理贴图

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

  7. 纹理窗口Qt+OpenGL之纹理贴图

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下纹理窗口 NeNe的代码中是加载到了一个正方体当中,代码很长.其实单纯的想要纹理贴图是很便利的.具体的纹理贴图技巧在 ...

  8. OpenGL ES教程VI之纹理贴图(原文对照)

    注:又是一篇,是否有人能解释得清楚,2是重复两次,那么是否N就是重复N次呢?接近1.0的坐标值整数部分加上几就是重复几次吗?这个好像之前验证过不一定的. 转自:http://melord.iteye. ...

  9. OpenGL立方体纹理贴图

    OpenGL正方体纹理贴图 0. 写在最前面 1. 正方体顶点属性构建 2. 绑定多个VAO.VBO 3. 创建多个纹理 4. 渲染循环 5. 实现代码 6. 多个立方体纹理贴图 0. 写在最前面 要 ...

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

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

最新文章

  1. NBIOT-NPSS/NSS/NPBCH的资源位置
  2. bzoj 4695: 最假女选手
  3. 字节一实习生误删公司所有lite模型,几百人为其善后,有员工处理事故到凌晨三点!...
  4. PHP分页类(较完美)
  5. js请求php文件 302,采集某个 url, js 请求 200,浏览器访问 302
  6. 解放人与设备距离,5G时代的远程操控该如何完成
  7. 馒头何瑫写作训练营的学习笔记总结
  8. ccs 移植创建新工程_CCS新工程创建与配置
  9. htmlspecialchars_decode 和 htmlspecialchars
  10. 【入门二】格式化输入/输出
  11. rollup打包js的注意点-haorooms博客分享
  12. win8 计算机服务,Win8.1系统下哪些服务可以关闭
  13. LDPC — 信道编码
  14. openpyxl 取消合并单元格且填充
  15. 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
  16. html div 怎么排版,请html大神解决一个div排版的问题
  17. FBReader阅读引擎支持的功能
  18. 新高考改革之下,有孚网络助力教育信息化进程
  19. C++调用Matlab生成的DLL动态链接库进行混合编程(win10+VS2015+Matlab2016b)
  20. 电驴连接服务器显示无响应,请问使用电驴时,服务器无响应,怎么解决?

热门文章

  1. Dell™ PowerEdge™ R710机架式服务器旨在成为虚拟化企业的构建块
  2. Django 系列博客(二)
  3. 用lua实现ByteArray和ByteArrayVarint
  4. X86逆向教程12:内存补丁的制作
  5. [Swift]LeetCode1051.高度检查器 | Height Checker
  6. Access denied for user 'root'@'localhost' Could not obtain connection
  7. selenium 简介 及浏览器配置
  8. 列出选定月份的时间序列
  9. 软件体系架构课后作业04
  10. oracle中decode方法使用