OpenGL 编程指南 (5.1)
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)的更多相关文章
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- VS15 openGL 编程指南 配置库 triangle例子
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...
- [转]OpenGL编程指南(第9版)环境搭建--使用VS2017
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...
- opengl编程指南
第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口. 1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...
- OpenGl编程指南第7版(红宝书)环境配制
环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...
- OpenGL编程指南(第九版) Tiangles 学习笔记
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...
- 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法
解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
随机推荐
- Android View的事件分发机制探索
概述 Android事件传递机制也是Android系统中比较重要的一块,事件类型有很多种,这里主要讨论TouchEvent的事件在framework层的传递处理机制.因为对于App开发人员来说,理解f ...
- YARN安装和使用
简介 Yet Another Resource Negotiator ,负责整个集群资源的调度,和管理,支持多框架资源统一调度(HIVE spark flink) 开启yarn 安装hadoop,可以 ...
- 如何开启音乐二倍速?不下载其他软件【win10】
使用windows自带的windows media player开启N倍速 绪言 额……暑假将终,我想起了件事:貌似我忘记帮你们开好二倍速再走了. 可能我回(六班)来的机会也比较少,废话不多说,直接看 ...
- bitset刷题记录
大佬的bitset用法小结 https://www.cnblogs.com/zwfymqz/p/8696631.html BZOJ3687简单题 题意:求子集的算术和的异或和,子集大小为n(n< ...
- demo 基于html css 实现小米官网部分内容搭建
文件夹目录 mi-site-----------主文件夹 css------------css文件文件夹 fonts.css---矢量图标css index.css---主页面样式css reset. ...
- shadow文件中密码的加密方式
1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...
- 【学习笔记】:一天搞定HTML
PS:许多控制样式的标签在HTML5中都不推荐使用,建议使用CSS,如align,border等. 一.概念 HTML的英文全称:Hypertext Marked Language 超文本标记语言. ...
- STL-优先级队列-priority_queue
头文件是<queue> 操作很简单 #include <iostream> #include <cstdio> #include <queue> usi ...
- ng-起步
目前,无论你使用什么前端框架,都必然要使用到各种 NodeJS 工具,Angular 也不例外.与其它框架不同,Angular 从一开始就走的"全家桶"式的设计思路,因此 @ang ...
- Typecho的卡哇伊小猫咪小插件(Live2D猫咪插件)
之前看到一个博客,被它博客上的动态小猫咪给吸引了,这个纯粹就是一个在线撸猫的神器啊.但是在网上寻找一番,并没有找到合适的插件,或者说没有找到合适的模型,因此无奈之后,只能向该博主请教,在它写的博客上, ...