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 ...
随机推荐
- AD常用命令以及概念
活动目录服务器常用命令合集如下: net accounts 查看第一台域控的计算机角色net accounts 查看计算机角色net share 查看共享netdom query fs ...
- 最新2019Pycharm安装教程,亲测!最新2019pycharm安装!如何安装Pycharm2019版本!如何安装2019Pycharm永久教程!2019Pycharm永久安装!
Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Python的哈 1.Pycharm下载安装 Pycharm下载 Py ...
- 发布开源项目到Jcenter
前言 为了将阿里云短信开箱即用发布到Jcenter仓库,前前后后花费了1天半的时间,把端午节都搭进去了.终于今天收到了Jcenter的消息,自己发布的包被添加到了Jcenter仓库,也算给开源社区做了 ...
- mybatis+maven自动生成代码框架
说明 通过可配置化,通过数据库自动生成model,da和mapper文件,这对于可定制化开发来说是非常有用的,减少了很多重复的工作. 添加依赖 <properties> <proje ...
- @Autowired、@Resource、@Qualifier区别
@Autowired 1.属于spring的注解,如果不想和Spring耦合的太紧,就不推荐使用. 2.默认情况下,要求依赖对象必须存在,不能为null.如果允许为空,那么设置属性值required为 ...
- python笔记09
今日内容 三元运算 函数 内容详细 三元运算(三目运算) v = 前面 if 条件 else 后面 if 条件: v = '前面' else: v = '后面' # 让用户输入值,如果值是整数,则转换 ...
- pillow 模块
pillow模块 图片处理 中文文档 安装 pip install Pillow 对图片旋转90度显示 from PIL import Image im=Image.open("t.jpg& ...
- tp5使用PHPexcel扩展导出excel表
1,使用composer安装phpexcel包: composer require phpoffice/phpexcel 2,在控制器中创建方法: (1)使用PHPexcel扩展.代码如下 /** * ...
- xctf-ics-07
首先管理页面进入到云平台项目管理中心 发现下面可以查看源码,点击view-source: 这个直接就绕过去了 看第二个 第二个需要满足$_SESSION['admin']==true才行,因此看看第三 ...
- 修改testlink上传文件大小
大家在使用testlink导入测试时,可能会遇到由于上传的文件太大,而不能上传的现象.当然建议大家在导入用例或者上传文件时,不要上传过大的文件,因为这样的速度确实非常慢.可是由于特殊的原因我们必须要导 ...