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. Gin框架之参数绑定

    为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString.form表单.JSON.XML等参数到结构 ...

  2. 删除Win10菜单中的幽灵菜单(ms-resource:AppName/Text )

    新建一个 .bat文件,输入以下内容 @echo off taskkill /f /im explorer.exe taskkill /f /im shellexperiencehost.exe ti ...

  3. 查看包名和Activity

    包名:adb shell pm list package -f 获取手机内所有apk对应的路径和包名 f 后加要查找的app的关键词可快速找到你想要的app包名 Activity:adb shell ...

  4. P2055 [ZJOI2009]假期的宿舍【二分图/最大流】

    题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...

  5. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用

    实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...

  6. 10、初识constexpr和常量表达式

    常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.显然字面值属于常量表达式,用于表达式初始化的const对象也是常量表达式. 1.判断一个变量是不是常量表达式 一个对象(表达式)是不是 ...

  7. phpcms搜索给分页代码添加参数方法

    在使用PHPCMS开发网站时遇到了一个搜索功能,需要在搜索结果分页链接上添加一些传递的参数,不然不能够正确翻页. 方法: 找到\phpcms\libs\functions\global.func.ph ...

  8. 方法重载(method overloading)

    为什么需要方法重载? 在编程语言中,名字的使用很重要.创建对象的时候,我们给一块内存区域起一个名字,然后这个名字就是我们创建的对象的引用,只要我们"叫"这个名字,计算机就知道我们在 ...

  9. Linux查看系统硬件信息命令

    Linux查看系统硬件信息命令 查看磁盘类型(是否SSD) cat /sys/block/sda/queue/rotational code:0 SSD盘 code:1 SATA盘 查看物理CPU个数 ...

  10. linux基础之Mini Linux制作

    一.编译一个简单的linux步骤如下: # yum groupinstall ""Development Tools" "Server Platform Dev ...