1、使用纹理

GLSL从纹理中读取数据使用内置函数texture的多种重载方法

Gvec4 texture(gsampler1D, float texCoord[,float bias])

Gvec4 texture(gsampler2D, vec2 texCoord[,float bias])//这里开头的g代表的是任意类型的占位符,[]是可选参数

2、纹理坐标

一般是逐顶点提供纹理坐标,然后根据图元间的线段在光栅化对每个片元进行插值得到片元纹理坐标。纹理坐标的范围为[0.0, 1.0],超过这个范围有数种方式决定超出范围的纹理坐标如下:

1)GL_CLAMP_TO_BORDER 范围外使用指定的颜色,需要同时设置GL_TEXTURE_BORDER_COLOR的值

2)GL_CLAMP_TO_EDGE 超出的使用边界值

3)GL_REPEAT 循环使用[0.0, 1.0]纹理坐标

4)GL_MIRROR_REPEAT 循环轴对称地使用[0.0, 1.0]纹理坐标

另外,这些设置时每个通道分开的,GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T、GL_TEXTURE_WRAP_R(str对应于常用坐标系xyz)

3、组织纹理数据

纹理数据的存储可以采用不同于RGBA的分量存储顺序,如ARGB。因此OpengGL提供了swizzle作为与之相关的纹理参数。使用方法glTexParameterri,参数可以是GL_TEXTURE_SWIZZLE_R、GL_TEXTURE_SWIZZLE_G、GL_TEXTURE_SWIZZLE_B、GL_TEXTURE_SWIZZLE_A等,分通道指定,还可以使用glTexParameteriv与GL_TEXTURE_SWIZZLE_RGBA一次性指定所有通道。

static const Glenum abgr_swizzle[] = {GL_ALPHA, GL_RED, GL_GREEN, GL_BLUE};

glBindTexture(GL_TEXTURE_2D, abgr_texture);

glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, abgr_swizzle);

4、复杂纹理类型

1)3D纹理,拥有宽度与高度的同时还有深度,2D宽度与高度的最大值通过GL_MAX_TEXTURE_SIZE查询,3D的则是GL_MAX_3D_TEXTURE_SIZE。

2)纹理数组,可以将有相同大小的1D或2D纹理几何合并成下一个维度的纹理。如果用3D纹理存储2D纹理数组,那么在访问具体的某一2D纹理上会比较麻烦,如有3张纹理的数组,访问第二张时因为索引是r通道值域被限制在了[0.0, 1.0]中,那么需要的值是0.6667,而且3D纹理在纹理片之间进行的滤波并不是希望那样的。

3)立方体贴图,用于环境映射,是6个面以一个立方体6个面的位置关系进行分布的结构。在立方体映射中采样的时候,使用的纹理坐标是3D的,并且被看作是来自原点的方向。最为经典的应用为大名鼎鼎的天空盒啦。

4)阴影采样器纹理,它有一个附加分量是用来与取得的纹素值做比较的参考值,采样返回的是一个[0.0, 1.0]内表示通过比较操作得到的分数,要使用它还需要设置GL_TEXTURE_COMPARE_MOD等状态。

float texture(gsampler1DShadow tex, vec3 p[,float bias])

float texture(gsampler2DShadow tex, vec3 p[,float bias])

float texture(gsamplerCubeShadow tex, vec3 p[,float bias])

float texture(gsampler1DArrayShadow tex, vec3 p[,float bias])

float texture(gsampler2DArrayShadow tex, vec3 p)

float texture(gsampler2DArrayShadow tex, vec4 p[,float bias])

float texture(gsamplerCubeArrayShadow tex, vecP p, float compare)

5)深度模板纹理,从字面上理解就是纹理数据存储的是深度与模板信息,需要对应纹理格式GL_DEPTH_STENCIL

6)纹理缓冲,没有内置的采样器,不支持mipmaps与纹理坐标wrapping,纹理坐标使用的是未归一化的整形坐标。

glGenBuffers(1, &texbuf);

glBindBuffer(GL_TEXTURE_BUFFER, texbuf);

glBufferData(GL_TEXTURE_BUFFER, size, data, GL_STATIC_DRAW);

glGenTexture(1, &texture);

//glActiveTexture(GL_TEXTURE0);//这一步非必须,因为第一个纹理单元是默认激活

glBindTexture(GL_TEXTURE_BUFFER, texture);

glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA8, texbuf);//将纹理缓冲对象与纹理关联

也有关联部分空间的方法

glTexBufferRange(GLenum target, GLenum internalFormat, GLuint buffer, GLintptr offset, GLsizeiptr size)//offst必须是对齐大小的整数倍

在shader中有纹理缓冲有自己的解析函数,与采样器使用方法相似,需要有uniform的设置有纹理坐标作为参数

vec4 texelFetch(samplerBuffer sb, int coord);

ivec4 texelFetch(isamplerBuffer sb, int coord);

uvec4 texelFetch(usamplerBuffer sb, int coord);

5、纹理视图

OpenGL可以在多个纹理之间共享一个数据存储,每个都能够拥有自己的格式与维数。首先,创建一个纹理并初始化它的存储空间,接着创建父纹理 texture view

void glTextureView(GLuint texture, GLenum target, GLuint origTexture, GLenum internalFormat, GLuint minLevel, GLuint minLayer, GLuint numLayers)//为已经创建的origTexture创建纹理视图,将纹理格式兼容的texture关联到origTexture的存储空间上,其它的参数都是对texture的设置,internalFormat需要与origTexture的存储格式兼容,minLevel与numLevels是关于minmap的参数

6、纹理压缩

压缩主要分为有损无损两大类,现有的ETC、PVPTR等压缩算法均是有损压缩。使用压缩纹理有两种方式,提供原始数据OpenGL进行压缩,因为需要实时所有会使用快速算法使得质量低下;另外一种是提供已经压缩了的纹理数据。

void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const void* data)

void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)

void glCompressedTexImage3D(.......)

7、纹理滤波

使用坐标来从离散采样信号选择临近样本,并且使用原始信号的线性近似来代替这些信号的技术。......

8、点精灵

使用fragment shader渲染的点,运行时考虑点内的片元坐标,点内的坐标是一个二维向量gl_PointCoord,gl_PointCoord是相当精确的数值。

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

  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. 实验一 GIT 代码版本管理

    实验一  GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理: 2)   熟练掌握git的基本指令和分支管理指令: 实验内容: 1)安装git 2)初始配置git ,git ...

  2. Arm开发板+Qt学习之路

    从2015.11.13日开始接触arm开发板,开始学习Qt,到现在已经四个月零17天了,从一个拿到开发板一无所知的小白,到现在能够在开发板上进行开发,有付出有收获. 之前一直没有时间将这个过程中的一些 ...

  3. JVM性能优化系列-(6) 晚期编译优化

    6. 晚期编译优化 晚期编译优化主要是在运行时做的一些优化手段. 6.1 JIT编译器 在部分的商用虚拟机中,java程序最初是通过解释器(Interpreter) 进行解释执行的,当虚拟机发现某个方 ...

  4. 【学习笔记】:JavaScript中的BOM对象

    JavaScript中的BOM对象 BOM(Browser Object Model):浏览器对象模型. BOM可用于对浏览器窗口进行访问,但BOM没有相关的标准,所以根据浏览器的不同,其中定义的对象 ...

  5. 《果壳中的C# C# 5.0 权威指南》 - 学习笔记

    <果壳中的C# C# 5.0 权威指南> ========== ========== ==========[作者] (美) Joseph Albahari (美) Ben Albahari ...

  6. 外部SRAM的种类

    外部SRAM注意事项 为使外部SRAM器件达到出最佳性能,建议遵循以下原则: 使用与连接的主系统控制器的接口数据带宽相同的SRAM. 如果管脚使用或板上空间的限制高于系统性能要求,可以使用较连接的控制 ...

  7. 查找第K大的值

    这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ ...

  8. npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules

    Mac 权限不够  前面加sudo   然后输入密码

  9. 查看mysql是否锁表了

    1.查看表是否被锁: (1)直接在mysql命令行执行:show engine innodb status\G. (2)查看造成死锁的sql语句,分析索引情况,然后优化sql. (3)然后show p ...

  10. c#---params参数

    写一个方法,求一个同学的总成绩 static void Main(string[] args) { , , }; Test("张三", n); Console.ReadKey(); ...