OpenGL Texture 纹理
Texture 纹理
纹理是一个2D图片(也可以是一个1D和3D的纹理)
效果如下(https://github.com/curtain521517/learnOpenGL)
为了能够映射到三角形上,需要三角形的每个顶点对应各自的**纹理坐标(**Texture Coordinate)
纹理在xy轴上范围是0-1(2D),使用纹理坐标获取纹理颜色叫采样
如下图
纹理环绕方式
环绕方式(Wrapping) | 描述 |
---|---|
GL_REPEAT | 重复纹理图像 |
GL_MIRRORED_REPEAT | 和GL_REPEAT一样,每次图形是镜像放置的. |
GL_CLAMP_TO_EDGE | 纹理坐标会被约束在0-1之前,超出的部份会重复纹理坐标的边缘,产生一种边缘被拉伸的效果 |
GL_CLAMP_TO_BORDER | 超出的坐标为用户指定的边缘颜色。 |
如图
每个选项都可以用glTextParameter 函数来对一个单独的坐标轴设置(s,t,r==>x,y,z)
如
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
- 第一个参数指定了纹理坐标,上面是使用的2D纹理
- 第二个参数是指定设置的坐标轴
- 第三个参数是环绕方式
如果用GL_CLAMP_TO_BORDER,还需要指定一个边缘颜色,使用如下
float borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f};
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
纹理过滤
纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素(Texture Pixel,也叫Texel,译注1)映射到纹理坐标。当你有一个很大的物体但是纹理的分辨率很低的时候这就变得很重要了。你可能已经猜到了,OpenGL也有对于纹理过滤(Texture Filtering)的选项。纹理过滤有很多个选项,但是现在我们只讨论最重要的两种:GL_NEAREST和GL_LINEAR。
GL_NEAREST(邻近过滤)
GL_LINEAR(线性过滤)
当进行放大(Magnify)和缩小(Minify)的时候可以设置纹理过滤选项,可以使用glTextParameter来指定过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
多线渐远纹理
它简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一。多级渐远纹理背后的理念很简单:距观察者的距离超过一定的阈值,OpenGL会使用不同的多级渐远纹理,即最适合物体的距离的那个。由于距离远,解析度不高也不会被用户注意到。同时,多级渐远纹理另一加分之处是它的性能非常好
可以用glGenerateMipmaps创建多级渐远文理
过滤方式 | 描述 |
---|---|
GL_NEAREST_MIPMAP_NEAREST | 使用最邻近的多级渐远纹理来匹配像素大小,并使用邻近插值进行纹理采样 |
GL_LINEAR_MIPMAP_NEAREST | 使用最邻近的多级渐远纹理级别,并使用线性插值进行采样 |
GL_NEAREST_MIPMAP_LINEAR | 在两个最匹配像素大小的多级渐远纹理之间进行线性插值,使用邻近插值进行采样 |
GL_LINEAR_MIPMAP_LINEAR | 在两个邻近的多级渐远纹理之间使用线性插值,并使用线性插值进行采样 |
可以使用glTexParameteri设置过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
放大过滤选项用设置为多级渐变无效,多级渐远过滤主要是使用纹理被缩小的情况,否则会产生一个GL_INVALID_ENUM错误代码
加载与创建纹理
我们使用SOIL来处理一些图片,对于SOIL的安装在单独介绍
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
第四个参数与GL_RG8 很相似。。。
生成一个纹理的过程看起来像这样
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// 为当前绑定的纹理对象设置环绕、过滤方式
...
// 加载并生成纹理
int width, height;
unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
纹理单元
纹理单元是连续的,在一个着色器中可以使用多个纹理,着先激活对应的纹理单元,然后绑定,
就像这样
glActiveTexture(GL_TEXTURE0); //在绑定纹理之前先激活纹理单元
glBindTexture(GL_TEXTURE_2D, texture);
两个纹理单元的例子
//纹理1
GLuint texture1;
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//加载图片1
int width, height;
unsigned char* image = SOIL_load_image("/Users/xufan/learnOpenGL/Textures/box.jpg", &width, &height, 0, SOIL_LOAD_RGB);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);//纹理2
GLuint texture2;
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//加载图片2
image = SOIL_load_image("/Users/xufan/learnOpenGL/Textures/awesomeface.png", &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
渲染流程大致是,先绑定好两个纹理至对应的纹理单元,然后在着色器中定义采样器对应的哪个纹理单元
绘制小结:
解绑时,只需解绑定VAO,VBO,EBO与VAO解绑顺充错乱会没有任何效果
OpenGL Texture 纹理相关推荐
- OpenGL Texture Coordinate Wrapping纹理坐标包装的实例
OpenGL Texture Coordinate Wrapping纹理坐标包装 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <verm ...
- OpenGL Texture Wrap Modes纹理包裹模式的实例
OpenGL wrapmodes纹理包裹模式 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <sb7.h> #include < ...
- OpenGL:纹理Textures
参考资料:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 学习笔记,不一当作参考教程,上面的参考资料是比较 ...
- 【Modern OpenGL】纹理 Textures
说明:跟着learnopengl的内容学习,不是纯翻译,只是自己整理记录. 强烈推荐原文,无论是内容还是排版. 原文链接 本文地址: http://blog.csdn.net/aganlengzi/a ...
- android纹理存储,Android:OpenGL存储纹理多长时间?
openGL存储纹理多长时间? 离开活动时纹理内存是否会被回收? 例如,如果我有以下代码: mGL.glGenTextures(1, mTextures, 0); mGL.glBindTexture( ...
- openCV读入图片,openGL实现纹理贴图
本文结合结合openCV,openGL的优点,实现混合编程. (1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便: (2)OpenGL是跨平台的图形程序接口,它用于二维,三维 ...
- OPenGL笔记--纹理滤波和光源
文章目录 一.前置知识 二.运行效果 三.完整代码 一.前置知识 光源 环境光:环境光来自四面八方:所有场景中的对象都处于环境光的照射中:如果没有环境光,未被漫射光照到的地方就会变得十分黑暗: 漫射光 ...
- OpenGL 5.纹理,混合,矩阵变化
混合 我们先画一个红色方块,再画一个蓝色方块,重叠的部分就是蓝色和红色按照某种方式混合,可以是蓝色完全覆盖红色,也可以是蓝色和红色叠加. 混合定义了如何将片段着色器输出颜色(也就是source)与目标 ...
- OpenGL(十九)——Qt OpenGL波动纹理(旗子的飘动效果)
OpenGL(十九)--Qt OpenGL波动纹理(旗子的飘动效果) 一.场景 在日常的项目中,我们经常会实现波动的一些纹理效果,比如飘动的旗子,水的波纹,地图上某一点的波浪圈圈等...,本篇介绍波动 ...
最新文章
- Camera Lens Coating
- Insufficient free space for journal files
- JavaWeb入门篇(6) 实现字符过滤器 解决全局字符乱码 实现模拟权限拦截
- yii2使用 db log
- 解决【Unable to find the requested .Net Framework Data Provider. It may not be installed.】错误...
- 封装时间转换工具类_利用swig封装C++的dll为C#方便使用
- android 退出多个activity,Android 中 退出多个activity的经典方法
- c++ 二次开发 良田高拍仪_六枝特良田LYV-850加工中心导轨配套防护罩日常维修
- hadoop合并日志_【hadoop】24.MapReduce-shuffle之合并
- Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load
- Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 zipkin 链路跟踪
- [转载]基于TFS实践敏捷-Scrum模式运用
- nodejs 安装教程
- 有趣的硬币 java_有趣的硬币作文
- mysql-proxy之奇虎360 Atlas 安装实现mysql读写分离
- 2018笔试题——求一元一次方程的解
- R语言 面板数据分析 plm包实现(三)——面板数据与面板模型的检验
- python 求和_python pandas行、列求和及累加求和
- Linux C语言 pthread_cond_wait()、pthread_cond_timedwait()函数(不允许cond被唤醒时产生竞争,所以需要和互斥锁搭配)
- linux入门--磁盘管理之分区、格式化与挂载
热门文章
- 计算机技术为什么更新快,为什么电脑更新换代的速度那么快?
- 电脑电子版文件怎么弄_电脑上怎么制作pdf格式的文件?
- c语言在屏幕上显示字母,C语言在屏幕上的显示内容
- 微软 神key的面目
- win10下查看系统自带壁纸的路径
- java 行政区划代码_GitHub - TakWolf/GB2260.java: 中华人民共和国行政区划代码(GB/T 2260),数据库Java版实现。...
- 高清屏概念解析与检测设备像素比的方法
- win7输入网络密码来自动连接
- 48 一个扭了腰的bitcoiner的日常【2020-07-09 2042】
- 《智能制造时代的研发智慧:知识工程2.0》一第1章 知识工程2.0的产生背景