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. javaweb简单的学生信息录入系统

    讲一下思路,主界面的设计就是用html表单元素,百度查找各个元素的用法,按照自己的想法摆放即可,表单提交后会把数据交给serverlet去处理,在那里定义几个字符串变量来储存获取到的数据,然后按照项目 ...

  2. Spark学习之路 (十二)SparkCore的调优之资源调优[转]

    概述 在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如 ...

  3. c#获取所有枚举

    获取所有的枚举 1.将所有的枚举单独成一个项目 2.通Assembly加载程序集 3.通过Assembly对象的GetTypes获取所有的枚举类型 4.通过Enum.GetValues可以得到枚举的所 ...

  4. Codeforces Round #622 (Div. 2) C2 - Skyscrapers (hard version) 单调栈

    从左往右扫,找到比第i个小的第一个数字,l[i] = l[last] + (i - last) * m[i],用单调栈O(n)维护这个过程,再从右往左扫,同理可以算出r数组,注意一下long long ...

  5. Fastbin attack

    Fastbin Attack 暂时接触到了两种针对堆分配机制中fastbin的攻击方式,double free和house of spirit Double free 基本原理 与uaf是对free之 ...

  6. JS 获取验证码 倒计时

    setInterval 一个定时器搞定 <style> button{ background: #45BCF9; color: #fff; padding: 4px 10px; borde ...

  7. Python instagram 爬虫项目

    直接介绍一下具体的步骤以及注意点: instagram 爬虫注意点 instagram 的首页数据是 服务端渲染的,所以首页出现的 11 或 12 条数据是以 html 中的一个 json 结构存在的 ...

  8. 获取redis cluster master对应的slot分布情况

    需求:原生的redis-trib.rb功能是强大,但输出的内容过于繁杂,比如我需要关注哪些master对应哪些slots,不是很直观,如果集群的规模更大的话,那么输出的结果获取信息更加困难. 说明:这 ...

  9. git配置多仓库

    git配置多仓库 github , gitee , coding , gitlab , gitlab.company ..... 真TM多 . 真TM多 . 真TM多 . 生成ssh 生成ssh 密钥 ...

  10. centos7 配置mailx使用外部smtp发送外网邮件

    1- 安装 1.1- 安装mailx yum install mailx -y 2- 配置 2.1- 配置外部发件邮箱 vim /etc/mail.rc 在最后加上: //如果不存在,则编辑/etc/ ...