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. 解决IIS程序池回收webapi定时程序造成的影响

    问题描述: webapi中有一个定时器线程,在iis程序池在1740分钟回收后,定时器中止 问题解决步骤: 1.设置程序池定期回收,设置每天定时回收 2.在windows自带的任务计划中,添加一条任务 ...

  2. Python面试(基础)

    第一部分 必答题 1,简述列举了解的编程语言及语言间的区别? Python 解释型语言,代码简洁,易懂 C语言 编译型语言,底层语言 c++ 编译型语言,在C语言基础上加了面向对象 Java 混合型语 ...

  3. ES6 - 基础学习(3): 变量的解构赋值

    解构赋值概述 1.解构赋值是对赋值运算符的扩展. 2.它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值. 3.代码书写上显得简洁且易读,语义更加清晰明了:而且还方便获取复杂对象中的数据字 ...

  4. Python股票量化第一步环境搭建

    很久之前就希望可以量化分析股票,那么国内的股票数据API也有个,最有名的就是tushare,然后还有baostock. 今天我们就来研究一下这个baostock吧. 首先,我们需要下载一个叫做anac ...

  5. MySQL的JDBC驱动(8.0版本)

    1.引用外部库  mysql-connector-java-8.0.版本的jar 2.jdbc驱动类:com.mysql.jdbc.Driver  改成 com.mysql.cj.jdbc.Drive ...

  6. mysql必知必会--了解SQL

    什么是数据库 数据库这个术语的用法很多,但就本书而言,数据库是一个以某种 有组织的方式存储的数据集合.理解数据库的一种最简单的办法是将其 想象为一个文件柜.此文件柜是一个存放数据的物理位置,不管数据是 ...

  7. 【54】目标检测之Bounding Box预测

    Bounding Box预测(Bounding box predictions) 在上一篇笔记中,你们学到了滑动窗口法的卷积实现,这个算法效率更高,但仍然存在问题,不能输出最精准的边界框.在这个笔记中 ...

  8. 【剑指Offer】63、二叉搜索树的第k个结点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 题解一:DFS 借助栈实现 // 中序非递归 public ...

  9. Magento2 自定义生成日志函数

    /** * @param $info * @param string $file * @return bool */ public function logger($info, $file = &qu ...

  10. jQuery笔记(四)jQuery中的动画

    jQuery最吸引人的地方莫过于能做出绚丽的动画了,也是能极大提高用户体验的地方,这次我们就来一探jQuery中的动画! 一. show()方法和hide()方法 show()方法与hide()方法是 ...