8.7 OpenGL纹理和采样器:压缩纹理图像

压缩纹理图像 Compressed Texture Images

纹理图像也可以使用已存储在已知压缩图像格式中的图像数据来指定或修改,这些格式包括附录D中定义的格式以及由扩展定义的任何额外格式。

void glCompressedTexImage1D( enum target, int level, enum internalformat, sizei width, int border, sizei imageSize, const void *data );
void glCompressedTexImage2D( enum target, int level, enum internalformat, sizei width, sizei height, int border, sizei imageSize, const void *data );
void glCompressedTexImage3D( enum target, int level, enum internalformat, sizei width, sizei height, sizei depth, int border, sizei imageSize, const void *data );

分别定义了一维、二维和三维纹理图像,其中传入的数据以特定压缩图像格式存储。targetlevelinternalformatwidthheightdepthborder参数的含义与TexImage1DTexImage2DTexImage3D中的相同,但不支持压缩矩形纹理格式。data参数是指向对应于internalformat的特定压缩图像格式存储的压缩图像数据。

如果绑定了像素解包缓冲区(通过PIXEL_UNPACK_BUFFER_BINDING非零值表示),则data是像素解包缓冲区中的偏移量,并且根据此偏移量从缓冲区中读取压缩数据;否则,data是一个指向客户端内存的指针,并从该指针相对应的客户端内存中读取压缩数据。

压缩图像将根据定义internalformat标记的规范进行解码。压缩纹理图像被视为相对于data的一个大小为imageSize字节的ubytes数组。

如果压缩图像未按照定义的图像格式编码,则调用结果未定义。

如果压缩数据按固定大小的纹理块排列,可以使用像素存储模式来选择来自较大包含矩形的子矩形。这些像素存储模式在工作方式上与TexImage*D相同,并如第8.4.4节所述。在本节剩余部分,用blocksizebwbhbd分别表示像素存储模式UNPACK_COMPRESSED_BLOCK_SIZEUNPACK_COMPRESSED_BLOCK_WIDTHUNPACK_COMPRESSED_BLOCK_HEIGHTUNPACK_COMPRESSED_BLOCK_DEPTH的值。blocksize是以字节为单位的压缩块大小;bwbhbd分别是压缩块的宽度、高度和深度(以像素为单位)。

默认情况下,对于压缩图像会忽略像素存储模式UNPACK_ROW_LENGTHUNPACK_SKIP_ROWSUNPACK_SKIP_PIXELSUNPACK_IMAGE_HEIGHTUNPACK_SKIP_IMAGES。要启用UNPACK_SKIP_PIXELSUNPACK_ROW_LENGTHblocksizebw都必须不为零。若还要启用UNPACK_SKIP_ROWSUNPACK_IMAGE_HEIGHT,则bh必须不为零。若还希望启用UNPACK_SKIP_IMAGES,则bd必须不为零。所有参数必须与压缩格式一致才能获得期望的结果。

如果CompressedTexImage1DCompressedTexImage2DCompressedTexImage3D函数的数据参数dataNULL,并且像素解包缓冲对象为零,则会创建一个具有未指定图像内容的纹理图像,就像将NULL指针传递给TexImage1DTexImage2DTexImage3D时一样。


要仅使用特定压缩图像格式存储的输入数据重新指定纹理对象纹理图像的矩形子区域,请使用以下命令:

void glCompressedTexSubImage1D( enum target, int level, int xoffset, sizei width, enum format, sizei imageSize, const void *data );
void glCompressedTexSubImage2D( enum target, int level, int xoffset, int yoffset, sizei width, sizei height, enum format, sizei imageSize, const void *data );
void glCompressedTexSubImage3D( enum target, int level, int xoffset, int yoffset, int zoffset, sizei width, sizei height, sizei depth, enum format, sizei imageSize, const void *data );void glCompressedTextureSubImage1D( uint texture, int level, int xoffset, sizei width, enum format, sizei imageSize, const void *data );
void glCompressedTextureSubImage2D( uint texture, int level, int xoffset, int yoffset, sizei width, sizei height, enum format, sizei imageSize, const void *data );
void glCompressedTextureSubImage3D( uint texture, int level, int xoffset, int yoffset, int zoffset, sizei width, sizei height, sizei depth, enum format, sizei imageSize, const void *data );

targettexturelevelxoffsetyoffsetzoffsetwidthheightdepth参数与第8.6节中对应的不含“Compressed”前缀的命令中的含义相同(在这些参数出现的情况下)。data指向以format所对应的压缩图像格式存储的压缩图像数据。

指向由dataimageSize参数表示的图像被视为提供给CompressedTexImage1DCompressedTexImage2DCompressedTexImage3D的情况进行解释。

特定压缩内部格式施加的任何限制都是不变的,这意味着如果GL接受并以压缩形式存储纹理图像,在满足以下条件时,向CompressedTex*Image*提供相同的图像不会生成错误:

  • data指向由GetCompressedTexImage(第8.11节)返回的压缩纹理图像。
  • targetlevelformat与向返回dataGetCompressedTexImage调用提供的targetlevelformat参数相匹配。
  • widthheightdepthformatimageSize分别与TEXTURE_WIDTHTEXTURE_HEIGHTTEXTURE_DEPTHTEXTURE_INTERNAL_FORMAT以及在返回data时有效图像级别levelTEXTURE_COMPRESSED_IMAGE_SIZE值相匹配。
  • widthheightdepthformat与当前有效图像级别level下的TEXTURE_WIDTHTEXTURE_HEIGHTTEXTURE_DEPTHTEXTURE_INTERNAL_FORMAT值相匹配。
  • xoffsetyoffsetzoffset均为零。

这个保证不仅适用于由GetCompressedTexImage返回的图像,而且也适用于任何其他同样大小的正确编码的压缩纹理图像。

若修改的图像内部格式是Table 8.14中描述的具体压缩格式之一,则纹理将以相应的纹理图像编码方式存储(参见附录D)。

由于这些特定压缩格式可以轻松地沿4×4纹理单元边界编辑,因此对于CompressedTex*SubImage2DCompressedTex*SubImage3D,对子图像位置和尺寸的限制有所放宽。

在执行CompressedTex*SubImage*调用期间,对于这些具体压缩格式的压缩纹理图像中不与正在修改区域相交的任何4×4纹理单元块,其内容都会被保留。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装虚拟机出现的一些问题

1、在重新打开软件之后出现闪退 解决:[WSL] 解决nsenter: cannot open /proc/320/ns/time: No such file or directory 问题 小白向-CSDN博客2、重新启动xrdp服务命令 解决: sudo systemctl restart xrdp3、将端口从3389改为3390,因为此前…

统信UOS系统窗口特效设置

原文链接:统信UOS系统设置窗口特效 在今天的技术分享中,我们将探讨如何在统信UOS系统上充分利用窗口特效来美化和提升用户界面的交互体验。统信UOS作为一款注重视觉体验和用户友好性的操作系统,提供了丰富的窗口特效设置,让用户可…

利用Java SPI机制实现可插拔的应用插件

自己搭建了个小博客,本文与这篇文章同步: 利用Java SPI机制实现可插拔的应用插件 什么是spi Java SPI(Service Provider Interface)机制是 Java 提供的一种用于实现组件化、可插拔式架构的机制。通过 SPI,Java 应用…

js之防抖与节流

定义:多次触发事件后,事件处理函数只执行一次,并且在触发操作结束时执行,一般用于scroll事件 原理:对处理函数进行延时操作,若设定的延时到来之前再次触发事件,则清除上一次的延时操作定时器&am…

从零开始学HCIA之广域网技术03

1、LCP中包含的报文类型 (1)Configure-Request(配置请求),链路层协商过程中发送的第一个报文,该报文表明点对点双方开始进行链路层参数的协商。 (2) Configure-Ack(配置…

详解 CSS 的背景属性

详解 CSS 的背景属性 背景颜色 语法: background-color: [指定颜色]; 注:默认是 transparent (透明) 的,可以通过设置颜色的方式修改 示例代码: 运行效果: 背景图片 语法:background-image: url(...); url 可以是绝对路径 也可…

oracle 设置权限 禁止删除用户

在Oracle中,可以通过修改系统角色来控制用户的操作权限。要禁止删除用户,需要将DROP USER这个特定的系统权限从相应的角色中移除。 下面是一种常见的方法,使用SQL语句进行操作: -- 创建新的角色,并为其分配所有必要的…

小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

C题&#xff1a;C-小苯的IDE括号问题&#xff08;easy&#xff09;_牛客小白月赛87 (nowcoder.com) D题&#xff1a; D-小苯的IDE括号问题&#xff08;hard&#xff09;_牛客小白月赛87 (nowcoder.com) C题代码&#xff1a; #include<bits/stdc.h>using namespace std…

模型 OIIC(目标、障碍、洞察、挑战)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。沟通方案工具。 1 OIIC(目标、障碍、洞察、挑战)模型的应用 1.1 OIIC 驱动的汽车配件渠道优化 一家知名的汽车配件制造商&#xff0c;旗下品牌拥有众多产品&#xff0c;其销售渠道广泛&#xff0c;不仅在…

【涨薪技术】掌握加密签名接口测试实战!

接口加密是指在网络传输过程中&#xff0c;将数据进行加密&#xff0c;以保护数据的安全性。接口加密可以采用多种加密算法&#xff0c;如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。 1加密与加密算法 加密&#xff08;Encrypt&#xff09;是将…

平衡,才是世界生生不息的真谛

凤凰涅槃&#xff0c;浴火重生。这句话是很有哲理的&#xff0c;可以运用到命运中。而对于命运&#xff0c;以中为最好&#xff0c;即是平衡。然而&#xff0c;每一个人&#xff0c;都是要经历命运的锤炼&#xff0c;无论怎样锤炼&#xff0c;都要保持一颗善良的心&#xff0c;…

day06-进程线程通信

1. 尝试处理普通信号 #include "test.h"#define MAXSIZE 128void handler(int signo) {if (SIGINT signo){printf("用户按下了 ctrl c 键\n");} }int main(int argc, char const *argv[]) {if (signal(SIGINT, SIG_IGN) SIG_ERR){perror("signal …

2024.02.23作业

1. 尝试处理普通信号 #include "test.h"#define MAXSIZE 128void handler(int signo) {if (SIGINT signo){printf("用户按下了 ctrl c 键\n");} }int main(int argc, char const *argv[]) {if (signal(SIGINT, SIG_IGN) SIG_ERR){perror("signal …

记录 | docker内执行apt update报错GPG error

1. 执行 sudo apt-get update 命令时遇到这个错误&#xff0c;是服务器没有这个公钥的意思 rootadmin:~# sudo apt-get update Get:1 https://download.docker.com/linux/ubuntu focal InRelease [36.2 kB] Err:1 https://download.docker.com/linux/ubuntu focal InRelease T…

Kaggle Intermediate ML Part Three——Pipeline

Step 1: Define Preprocessing Steps Understanding the Data: Data source: Where is the data coming from? What format is it in (e.g., CSV, JSON)? What does it represent?Data characteristics: What variables are present? What are their types (numerical, c…

【C++刷题】优选算法——双指针

移动零 void moveZeroes(vector<int>& nums) {size_t front 0;size_t back 0;while(back < nums.size() && nums[back] ! 0){back;}front back;while(back < nums.size()){if(0 nums[back]){back;}else{swap(nums[front], nums[back]); }} }…

Sora Text to Video 转换过程和技术要素的技术原理详细描述

转换过程&#xff1a; 初始化阶段&#xff1a;Sora 的转换过程从一个随机噪声图像开始。这个噪声图像是通过随机数生成器产生的&#xff0c;它代表了视频数据的初始状态&#xff0c;其中包含了大量的随机性和不确定性。 神经网络处理&#xff1a;这个噪声图像随后被送入一个预…

python 3.11中安装sympy(符号工具包)

1.python环境&#xff1a; 2.安装遇到问题&#xff1a; … 3.升级pip cmd命令行中&#xff0c;执行如下命令&#xff1a; python.exe -m pip installl --upgrade pip 4.再次安装sympy cmd命令行中&#xff0c;执行如下命令&#xff1a; pip install sympy 5.简单应用 对…

【坑】SpringBoot项目打包后的jar包非常小,只有4KB

一、SpringBoot项目打包后的jar包非常小&#xff0c;只有4KB? 1.1、解决方法 pom.xml中添加如下配置 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>&l…

排列组合简单详解(附10题)(会员版)

非会员,不用注册会员也能看! https://blog.csdn.net/Runcode8/article/details/136274861https://blog.csdn.net/Runcode8/article/details/136274861 一、认识C,P,A: A.排列 A(x,y)=(x!)/[(x-y)!]=x(x-1)...(x-y+1) P.排列 P(x,y)=A(x,y) C.组合 C(x,…