OpenGL纹理API简介

简介: 1. 读取文件;2. 载入纹理;3. 更新纹理;4. 插入替换纹理;5. 使用颜色缓存区加载数据, 形成新的纹理;

以下为经常使用的纹理API笔记, 仅做记录学习


1. 读取文件


//参数1:x,矩形左下⻆角的窗⼝口坐标
//参数2:y,矩形左下⻆角的窗⼝口坐标
//参数3:width,矩形的宽,以像素为单位 
//参数4:height,矩形的⾼高,以像素为单位
//参数5:format,OpenGL 的像素格式,参考 表6-1 
//参数6:type,解释参数pixels指向数据,告诉OpenGL 使⽤用缓存区中的什么数据类型来存储颜⾊色分量量,像素数据的数据类型,参考 下图 
//参数7:pixels,指向图形数据的指针
void glReadPixels(GLint x,GLint y,GLSizei width,GLSizei height, GLenum format, GLenum type,const void * pixels);


微信图片_20220508223731.jpg

类型参考


2. 载入纹理


// target:`GL_TEXTURE_1D`、`GL_TEXTURE_2D`、`GL_TEXTURE_3D`。
// Level:指定所加载的mip贴图层次。⼀一般我们都把这个参数设置为0。
// internalformat:每个纹理理单元中存储多少颜⾊色成分。
// width、height、depth参数:指加载纹理理的宽度、⾼高度、深度。==注意!==这些值必须是 2的整数次⽅方。(这是因为OpenGL 旧版本上的遗留留下的⼀一个要求。当然现在已经可以⽀支持不不是 2的整数次⽅方。但是开发者们还是习惯使⽤用以2的整数次⽅方去设置这些参数。)
// border参数:允许为纹理理贴图指定⼀一个边界宽度。
// format、type、data参数:与我们在讲glDrawPixels 函数对于的参数相同
void glTexImage2D(GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,void * data);


至于glTexImage1D,glTexImage3D因为使用的不多,请参考以上函数


3. 更新纹理


void glTexSubImage1D(GLenum target,GLint level,GLint xOffset,GLsizei width,GLenum  format,GLenum type,const GLvoid *data);
void glTexSubImage2D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLsizei width,GLsizei height,GLenum format,GLenum type,const GLvoid *data);
void glTexSubImage3D(GLenum target,GLint level,GLint xOffset,GLint yOffset,GLint  zOffset,GLsizei width,GLsizei height,GLsizei depth,Glenum type,const GLvoid * data);


4. 插入替换纹理


void glCopyTexSubImage1D(GLenum target,GLint level,GLint xoffset,GLint x,GLint y,GLsize width);
void glCopyTexSubImage2D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint x, GLint y,GLsizei width,GLsizei height);
void glCopyTexSubImage3D(GLenum target,GLint level,GLint xoffset,GLint yOffset,GLint zOffset,GLint x,GLint y,GLsizei width,GLsizei height);


5. 使用颜色缓存区加载数据, 形成新的纹理


//x,y 在颜⾊色缓存区中指定了了开始读取纹理理数据的位置; 缓存区⾥里里的数据是源缓存区通过glReadBuffer设置的。
void glCopyTexImage1D(GLenum target,GLint level,GLenum internalformt,GLint x,GLint y,GLsizei width,GLint border);
//注意:不不存在glCopyTextImage3D ,因为我们⽆无法从2D 颜⾊色缓存区中获取体积数据。
void glCopyTexImage2D(GLenum target,GLint level,GLenum  internalformt,GLint x,GLint y,GLsizei width,GLsizei height,GLint border);


纹理对象


//使⽤用函数分配纹理理对象
//指定纹理理对象的数量量 和 指针(指针指向⼀一个⽆无符号整形数组,由纹理理对象标识符填充)。 
void glGenTextures(GLsizei n,GLuint * textTures);
//绑定纹理理状态 //参数target:GL_TEXTURE_1D、GL_TEXTURE_2D GL_TEXTURE_3D
//参数texture:需要绑定的纹理理对象
void glBindTexture(GLenum target,GLunit texture);
//删除绑定纹理理对象
//纹理理对象 以及 纹理理对象指针(指针指向⼀一个⽆无符号整形数组,由纹理理对象标识符填充)。
void glDeleteTextures(GLsizei n,GLuint *textures);
//测试纹理理对象是否有效
//如果texture是⼀一个已经分配空间的纹理理对象,那么这个函数会返回GL_TRUE,否则会返回GL_FALSE。 
GLboolean glIsTexture(GLuint texture);


设置纹理参数


// 参数1:target,指定这些参数将要应⽤用在那个纹理理模式上,⽐如GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。
// 参数2:pname,指定需要设置那个纹理理参数
// 参数3:param,设定特定的纹理理参数的值
glTexParameterf(GLenum target,GLenum pname,GLFloat param);
glTexParameteri(GLenum target,GLenum pname,GLint param);
glTexParameterfv(GLenum target,GLenum pname,GLFloat *param);
glTexParameteriv(GLenum target,GLenum pname,GLint *param);


  • 有关过滤方式


主要有邻近过滤(GL_NEAREST)线性过滤(GL_LINEAR)


微信图片_20220508223614.jpg
左侧为邻近过滤(GL_NEAREST) 右侧为线性过滤(GL_LINEAR)


微信图片_20220508223620.jpg

两种过滤方式的比较


//纹理理缩⼩小时,使⽤用邻近过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST) 
//纹理理放⼤大时,使⽤用线性过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);


设置环绕方式


//参数1:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D 
//参数2:GL_TEXTURE_WRAP_S、GL_TEXTURE_T、GL_TEXTURE_R,针对s,t,r坐标 
//参数3:GL_REPEAT、GL_CLAMP、GL_CLAMP_TO_EDGE、GL_CLAMP_TO_BORDER
//GL_REPEAT:OpenGL 在纹理理坐标超过1.0的⽅方向上对纹理理进⾏行行重复; //GL_CLAMP:所需的纹理理单元取⾃自纹理理边界或TEXTURE_BORDER_COLOR. //GL_CLAMP_TO_EDGE环绕模式强制对范围之外的纹理理坐标沿着合法的纹理理单元的最后⼀⾏或者最后⼀列来进⾏行行采样。
//GL_CLAMP_TO_BORDER:在纹理理坐标在0.0到1.0范围之外的只使⽤用边界纹理理单元。边界纹理理单元是作为围绕基本图像的额外的⾏行行和列列,并与基本纹理理图像⼀一起加载的。glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_S,GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAR_T,GL_CLAMP_TO_EDGE);


微信图片_20220508223626.jpg

环绕方式


微信图片_20220508224310.png

环绕方式效果图


有关金字塔纹理坐标

微信图片_20220508223724.jpg

金字塔坐标


顶点坐标:

vBackLeft (-1.0,-1.0,-1.0)

vBackRight (1.0,-1.0,-1.0)

vFrontLeft (-1.0,-1.0,1.0)

vFrontRight(1.0,-1.0,1.0)

vApex (0,1.0,0)


纹理理坐标

VBackLeft ( 0,0,0)

VBackRight (0,1,0)

vFrontLeft (0,0,1)

VFrontRight (0,1,1)

vApex (0,0.5,1)




目录
相关文章
|
6月前
|
SQL Java 程序员
Java 8中的Stream API:简介与实用案例
【5月更文挑战第23天】本文将深入探讨Java 8中的Stream API,这是一种能够极大提升Java程序员生产力的新特性。我们将从基础概念开始,然后通过一些实用的案例来展示如何使用Stream API进行数据处理和操作。无论你是Java的初学者还是经验丰富的开发者,本文都将为你提供有价值的信息。
|
6月前
|
安全 Java API
Java 8中的Stream API:简介与实用指南深入理解Java并发编程:线程安全与锁优化
【5月更文挑战第29天】本文旨在介绍Java 8中引入的Stream API,这是一种用于处理集合的新方法。我们将探讨Stream API的基本概念,以及如何使用它来简化集合操作,提高代码的可读性和效率。 【5月更文挑战第29天】 在Java并发编程中,线程安全和性能优化是两个核心议题。本文将深入探讨如何通过不同的锁机制和同步策略来保证多线程环境下的数据一致性,同时避免常见的并发问题如死锁和竞态条件。文章还将介绍现代Java虚拟机(JVM)针对锁的优化技术,包括锁粗化、锁消除以及轻量级锁等概念,并指导开发者如何合理选择和使用这些技术以提升应用的性能。
|
6月前
|
Java API 数据处理
Java 8中的Stream API简介及其在数据处理中的应用
【5月更文挑战第30天】 本文旨在介绍Java 8中引入的Stream API,它是一种用于处理集合的新方法。与传统的循环和迭代器相比,Stream API提供了一种更简洁、高效的方式来处理数据。文章将详细介绍Stream API的基本概念、常用操作以及在实际项目中的应用场景。
|
6月前
|
SQL Java API
Java一分钟之-JPA:Java持久化API简介
【5月更文挑战第14天】Java Persistence API (JPA) 是Java的ORM规范,用于简化数据库操作。常见问题包括实体映射、事务管理和性能问题。避免错误的关键在于明确主键策略、妥善使用事务、优化查询及理解实体生命周期。示例展示了如何定义实体和使用`EntityManager`保存数据。JPA通过标准化API让开发者更专注于业务逻辑,提升开发效率和代码维护性。
79 0
|
6月前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
170 1
|
Java API
Java 反射 API 简介
通常来说,使用反射 API 的第一步便是获取 Class 对象。在 Java 中常见的有这么三种。
100 0
|
6月前
|
JavaScript 前端开发 IDE
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
Vue3【为什么选择Vue框架、Vue简介 、Vue API 风格 、Vue开发前的准备 、Vue项目目录结构 、模板语法、属性绑定 、 】(一)-全面详解(学习总结---从入门到深化)
107 1
|
前端开发 API
Promise(简介、基本使用、API、手写实现 Promise、async与await)(六)
Promise(简介、基本使用、API、手写实现 Promise、async与await)(六)
|
前端开发 API
Promise(简介、基本使用、API、手写实现 Promise、async与await)(五)
Promise(简介、基本使用、API、手写实现 Promise、async与await)(五)
|
前端开发 API
Promise(简介、基本使用、API、手写实现 Promise、async与await)(四)
Promise(简介、基本使用、API、手写实现 Promise、async与await)(四)
下一篇
无影云桌面