1、OpenGL支持同时使用多个纹理单元,使用GL_TEXTUREi进行标识,使用前需要先激活对应的纹理单元,默认GL_TEXTURE0是激活绑定的。

void glActiveTexture(GLenum texture)

注意,在对uniform进行设置时,纹理的写入并不是其对应的id而是其使用纹理单元的下标序号,这点对于初学者很容易混淆。

2、创建纹理对象后,需要为其设置存储空间与数据格式,设置之后在生命周期内不能被重新定义,那么OpenGL可以不需要跟踪纹理对象的某些数据格式发生的变化。

void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width)//levels是mipmap的纹理级别

void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)//为2D纹理或1D纹理数组设置存储

void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)//为3D纹理或2D纹理数组设置存储

void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)//target必须是GL_TEXTURE_2D_MULTISAMPLE

void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)

void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)//target必须是GL_TEXTURE_2D_MULTISAMPLE_ARRAY,fixedsamplelocations是描述纹素采样样本位置的参数,GL_TRUE表示为纹素的采样子纹素使用相同的位置,GL_FALSE表示使用空间变化的采样位置

上面的固定格式虽好,但有时需要更为灵活的纹理存储,下面是相对于上面存储格式可变得对应方法

void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const void* data)

void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* data)

void glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* data)

void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)

void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)

3、纹理格式

1)纹理内部各式(internal format)是OpenGL用来内部存储开发者给与的纹理数据格式。有如下众多格式:

_SNORM修饰符表示的是有符号的归一化数据,内存中的数据是有符号整形,传递到shader时会转换为浮点型并转换到[-1.0, 1.0]的标准值域中。特殊的,有无符号整形内部格式需要与有无符号采样器配套使用(isampler2D、usampler2D等)。GL_sRGB(GL_SRGB)中s代表的是gamma矫正,是对颜色变化的现行修正。

2)纹理外部格式(external format)是外部通过OpenGL API提供数据的数据存储格式。可变纹理存储空间的格式由format与type两个参数决定,format有如下格式:

type通常为GL_BYTE、GL_FLOAT、GL_INT、GL_UNSIGNED_BYTE、GL_UNALF_FLOAT等基本格式,但是也有一些压缩格式如下:

4、代理纹理(除了GL_TEXTURE_BUFFER都有对应的代理)

5、显示写入纹理数据

纹理数据按从左到右,从上到下的顺序进行布局。

void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* data)

void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* data)

void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLine zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* data)

6、Pixel Unpack缓冲

glTexSubImage2D 的参数data可以是绑定的 GL_PIXEL_UNPACK_BUFFER 内容的数据偏移,没有绑定这个缓冲对象时可以是显示提供的数组等数据。

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);

glBufferData(GL_PIXEL_UNPACK_BUFFER, texturesize, texturedata, GL_STATIC_DRAW);

glBindTexture(GL_TEXTURE_2D, texture);

glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1024, 1024);

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 1024, GL_RGB, nullptr);

7、从帧缓冲中拷贝

当前绑定的帧缓冲内的纹理数据可以拷贝到纹理对象,用作后面的渲染,有下列函数实现该功能(实质等同于调用glReadPixels、glTexImage*D):

void glCopyTexImage1D(GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, Glint border)//y应该是1,border是保留参数,必须是0

void glCopyTexImage1D(GLenum target, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, Glint border)

与大多数函数相同,它也有读取块的方法

void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)

void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)//如是1D数组,yoffset是纹理层数索引

void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width)//如是2D数组、立方体贴图或数组,zoffset是纹理层数的索引

8、从磁盘文件加载纹理数据

9、查询纹理数据

对于纹理缓冲对象,能够写入也能够读取回应用程序内容、其它缓冲对象等。

void glGetTexImage(GLenum target, GLint lod, Glenum format, GLenum type, GLvoid* image)//lod是层次细节级别

使用这个方法是需要格外注意提供的内存大小,OpenGL是不会提供对写入空间的边界检查的,另外,这种读取操作性能堪忧,尽可能的使用GL_PIXEL_PACK_BUFFER读入数据后通过glMapBuffer等较为节省资源的方法传递给应用程序。

10、纹理数据布局

纹理数据多数情况下的布局是从左到右,从上到下,纹素紧密相连,所以OpenGL提供了几个方法令应用程序可以指定纹理数据的布局。

void glPixelStorei(GLenum pname, GLint param)

void glPixelStoref(GLenum pname, GLfloat param)

如果使用的是*_SWAP_BYTES(*号代表 GL_PACK、GL_UNPACK)的参数是GL_FALSE,那么内存中字节的顺序是与具体的系统相关的,GL_TRUE是则字节会被翻转,翻转只对多字节数据格式由影响,与网络字节顺序一个意思。因为需要考虑不同机器上运行同一个程序或者共享图像内容的情景。

参数*_LSB_FIRST只在绘制或者读取以为的图像与位图是使用,这些图像和位图对每个像素保存和恢复一位数据。参数为GL_FALSE是从高位开始取值,那么0X31的为{0,0,1,1,0,0,0,1},为GL_TRUE则从低位开始是{1,0,0,0,1,1,0,0}。

11、采样器对象

void glBindSampler(GLint unit, GLuint sampler)//因为这里是直接指定unit的,所以采样器对象不需要想texture那样每个纹理单元Active的步骤

OpenGL 编程指南 (5.1)的更多相关文章

  1. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  6. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)

    1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...

  7. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  8. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  9. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  10. Opengl编程指南第二章:状态管理、几何绘图

    //http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...

随机推荐

  1. 发ajax响应json格式数据

    1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  2. 等差数列,for循环,递归和尾递归的对比

    生活中,如果1+2+3+4.....+100,大家基本上都会用等差数列计算,如果有人从1开始加,不是傻就是白X,那么程序中呢,是不是也是这样.今天无意中看到了尾递归,以前也写过,但是不知道这个专业名词 ...

  3. P1217 [USACO1.5]回文质数 Prime Palindromes(stringstream,sizeof(num)/sizeof(num[0]),打表)

    题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)( 一亿)间 ...

  4. 面试官:说说TCP和UDP的区别和应用场景

    原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! 上一篇聊完 一文彻底搞懂 TCP三次握手.四次挥手过程及原理 这次聊聊TCP和UDP的区别和场景 TCP/IP 中有两个具有代表 ...

  5. Java泛型(T)与通配符?

    前言:使用泛型的目的是利用Java编译机制,在编译过程中帮我们检测代码中不规范的有可能导致程序错误的代码.例如,我们都知道list容器可以持有任何类型的数据,所以我们可以把String类型和Integ ...

  6. jQuery笔记(三)jQuery中的事件

    ; padding:0;} body { font-size:13px; line-height:130%; padding:60px;} #panel { width:300px; border:1 ...

  7. oracle备份与还原数据

    一.表数据备份与还原 creat table  备份表   select * from  原表  where insert  into  原表  select  *  from  备份表 二.利用备份 ...

  8. Jmeter实践

    Jmeter时间戳函数 详见:https://blog.csdn.net/dreamtl/article/details/68957447 ${__timeShift(yyyy-MM-dd HH:mm ...

  9. C++使用taskkill 命令强制结束进程

    一:查看 taskkill 命令和参数的方法 window系统下,快捷键win + R 打开运行 ,输入cmd回车,在 cmd 里面输入: taskkill /?  二:语法: taskkill [/ ...

  10. LeetCode 938. 二叉搜索树的范围和

    题目链接:https://leetcode-cn.com/problems/range-sum-of-bst/ 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜 ...