8.4 OpenGL纹理和采样器:像素矩形

像素矩形 Pixel Rectangles

可以使用TexImage*D(参见第8.5节)向GL指定颜色、深度和某些其他值的矩形。这些命令的操作和参数中的一些与ReadPixels(用于从帧缓冲区获取像素值)共享;然而,关于ReadPixels的讨论被推迟到第9章,在详细讨论帧缓冲区之后。尽管如此,我们在本节中指出,与这些命令相关的参数和状态也与ReadPixels相关。

许多参数控制了缓冲区对象或客户端内存中像素的编码(用于读取和写入),以及像素在放置到帧缓冲区中之前(用于读取、写入和复制)或从帧缓冲区中读取后的处理方式。这些参数是通过PixelStore*来设置的。

像素存储模式和像素缓冲对象 Pixel Storage Modes and Pixel Buffer Objects

像素存储模式影响当TexImage*DTexSubImage*DCompressedTexImage*DCompressedTexSubImage*DReadPixels等命令被调用时的操作。像素存储模式通过以下函数进行设置:

void glPixelStore{if}( enum pname, T param );

其中,pname是一个表示要设置的参数的符号常量,param是要设置的值,见下表。

数据转换按照第2.2.1节中指定的规则执行。

除了将像素数据存储在客户端内存中,像素数据还可以存储在缓冲区对象中(在第6节中描述)。当前的像素解压缩和打包缓冲区对象分别由PIXEL_UNPACK_BUFFERPIXEL_PACK_BUFFER目标指定。

初始状态下,对于PIXEL_UNPACK_BUFFER,绑定为零,表示像素图像规范命令(如TexImage*D)从客户端内存指针参数中获取像素。然而,如果绑定了非零缓冲区对象作为当前的像素解压缩缓冲区,那么指针参数将被视为指向指定缓冲区对象的偏移量。

Parameter NameTypeInitial ValueValid Range
UNPACK_SWAP_BYTESbooleanFALSETRUE / FALSE
UNPACK_LSB_FIRSTbooleanFALSETRUE / FALSE
UNPACK_ROW_LENGTHinteger0[0, ∞)
UNPACK_SKIP_ROWSinteger0[0, ∞)
UNPACK_SKIP_PIXELSinteger0[0, ∞)
UNPACK_ALIGNMENTinteger41,2,4,8
UNPACK_IMAGE_HEIGHTinteger0[0, ∞)
UNPACK_SKIP_IMAGESinteger0[0, ∞)
UNPACK_COMPRESSED_BLOCK_WIDTHinteger0[0, ∞)
UNPACK_COMPRESSED_BLOCK_HEIGHTinteger0[0, ∞)
UNPACK_COMPRESSED_BLOCK_DEPTHinteger0[0, ∞)
UNPACK_COMPRESSED_BLOCK_SIZEinteger0[0, ∞)

Table 8.1 PixelStore* parameters pertaining to one or more of TexImage*D, TexSubImage*D, CompressedTexImage*D and CompressedTexSubImage*D

像素矩形的传输 Transfer of Pixel Rectangles

缓冲对象或客户端内存中编码的像素的传输过程在 Figure 8.1 中有详细说明。我们将按照发生的顺序描述此过程的各个阶段。

接受或返回像素矩形的命令会采用以下参数(以及针对其特定功能的其他附加参数):

  • format 是一个符号常量,表示内存中值所代表的内容。
  • widthheight 分别是待传输像素矩形的宽度和高度。
  • data 指向要绘制的数据。这些数据用 type 指定的多种 GL 数据类型之一来表示。type 指定的类型令牌值与它们表示的 GL 数据类型之间的对应关系在 Table 8.2 中给出。
  • 不是所有的 formattype 组合都是有效的。

下面将进一步讨论对 formattype 值组合的有效性的一些额外限制。特定命令可能还会施加额外的约束条件。

  1. byte, short, int, float, or packed pixel component data stream
  2. Unpack (Pixel Storage Operations)
  3. Convert to Float (Pixel Storage Operations)
  4. Expansion to RGBA
  5. RGBA pixel data out

Figure 8.1. Transfer of pixel rectangles to the GL. Output is RGBA pixels. Depth and stencil pixel paths are not shown

type Parameter Token NameCorresponding GL Data TypeSpecial InterpretationFloating Point
UNSIGNED_BYTEubyteNoNo
BYTEbyteNoNo
UNSIGNED_SHORTushortNoNo
SHORTshortNoNo
UNSIGNED_INTuintNoNo
INTintNoNo
HALF_FLOAThalfNoYes
FLOATfloatNoYes
UNSIGNED_BYTE_3_3_2ubyteYesNo
UNSIGNED_BYTE_2_3_3_REVubyteYesNo
UNSIGNED_SHORT_5_6_5ushortYesNo
UNSIGNED_SHORT_5_6_5_REVushortYesNo
UNSIGNED_SHORT_4_4_4_4ushortYesNo
UNSIGNED_SHORT_4_4_4_4_REVushortYesNo
UNSIGNED_SHORT_5_5_5_1ushortYesNo
UNSIGNED_SHORT_1_5_5_5_REVushortYesNo
UNSIGNED_INT_8_8_8_8uintYesNo
UNSIGNED_INT_8_8_8_8_REVuintYesNo
UNSIGNED_INT_10_10_10_2uintYesNo
UNSIGNED_INT_2_10_10_10_REVuintYesNo
UNSIGNED_INT_24_8uintYesNo
UNSIGNED_INT_10F_11F_11F_REVuintYesYes
UNSIGNED_INT_5_9_9_9_REVuintYesYes
FLOAT_32_UNSIGNED_INT_24_8_REVn/aYesNo

Table 8.2 Pixel data type parameter values and the corresponding GL data types. Refer to table 2.2 for definitions of GL data types. Special interpretations are described in section 8.4.4.2. Floating-point types are incompatible with INTEGER formats as described above

Format NameElement Meaning and OrderTarget Buffer
STENCIL_INDEXStencil IndexStencil
DEPTH_COMPONENTDepthDepth
DEPTH_STENCILDepth and Stencil IndexDepth and Stencil
REDRColor
GREENGColor
BLUEBColor
RGR, GColor
RGBR, G, BColor
RGBAR, G, B, AColor
BGRB, G, RColor
BGRAB, G, R, AColor
RED_INTEGERiRColor
GREEN_INTEGERiGColor
BLUE_INTEGERiBColor
RG_INTEGERiR, iGColor
RGB_INTEGERiR, iG, iBColor
RGBA_INTEGERiR, iG, iB, iAColor
BGR_INTEGERiB, iG, iRColor
BGRA_INTEGERiB, iG, iR, iAColor

Table 8.3: Pixel data formats. The second column gives a description of and the number and order of elements in a group. Unless specified as an index, formats yield components. Components are floating-point unless prefixed with the letter ’i’, which indicates they are integer

Element SizeDefault Bit OrderingModified Bit Ordering
8 bit[7…0][7…0]
16 bit[15…0][7…0] [15…8]
32 bit[31…0][7…0] [15…8] [23…16] [31…24

Table 8.4: Bit ordering modification of elements when UNPACK_SWAP_BYTES is enabled. These reorderings are defined only when GL data type ubyte has 8 bits,and then only for GL data types with 8, 16, or 32 bits. Bit 0 is the least significant.

type Parameter Token NameGL Data TypeNumber of ComponentsMatching Pixel Formats
UNSIGNED_BYTE_3_3_2ubyte3RGB, RGB_INTEGER
UNSIGNED_BYTE_2_3_3_REVubyte3RGB, RGB_INTEGER
UNSIGNED_SHORT_5_6_5ushort3RGB, RGB_INTEGER
UNSIGNED_SHORT_5_6_5_REVushort3RGB, RGB_INTEGER
UNSIGNED_SHORT_4_4_4_4ushort4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_SHORT_4_4_4_4_REVushort4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_SHORT_5_5_5_1ushort4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_SHORT_1_5_5_5_REVushort4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_INT_8_8_8_8uint4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_INT_8_8_8_8_REVuint4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_INT_10_10_10_2uint4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_INT_2_10_10_10_REVuint4RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER
UNSIGNED_INT_24_8uint2DEPTH_STENCIL
UNSIGNED_INT_10F_11F_11F_REVuint3RGB
UNSIGNED_INT_5_9_9_9_REVuint4RGB
FLOAT_32_UNSIGNED_INT_24_8_REVn/a2DEPTH_STENCIL

Table 8.5: Packed pixel formats

拆包 Unpacking

数据从当前绑定的像素解包缓冲区或客户端内存中作为一系列有符号或无符号字节(GL 数据类型 byte 和 ubyte)、有符号或无符号短整数(GL 数据类型 short 和 ushort)、有符号或无符号整数(GL 数据类型 int 和 uint)或浮点值(GL 数据类型 half 和 float)获取。这些元素根据格式分组为一组包含一个、两个、三个或四个值的集合,形成一个组。Table 8.3 总结了从内存中获取的组的格式;它还指出了那些产生索引的格式以及那些产生浮点或整数分量的格式。

如果绑定了像素解包缓冲区(由非零值的 PIXEL_UNPACK_BUFFER_BINDING 指示),则数据是像素解包缓冲区中的偏移量,并且像素相对于此偏移量从缓冲区解包;否则,数据是指向客户端内存的指针,并且像素相对于指针从客户端内存解包。

默认情况下,每个 GL 数据类型的值的解释方式与客户端的 GL 绑定语言中指定的方式相同。然而,如果启用了 UNPACK_SWAP_BYTES,则值将根据Table 8.4 中修改的位顺序进行解释。修改后的位顺序仅在 GL 数据类型 ubyte 具有八位时定义,然后对于每个特定的 GL 数据类型,仅当该类型用 8、16 或 32 位表示时才定义。

内存中的组被视为按矩形排列。该矩形由一系列行组成,其中第一行的第一组的第一个元素由 data 指向。如果 UNPACK_ROW_LENGTH 的值为零,则一行中的组数为 width;否则,组数为 UNPACK_ROW_LENGTH 的值。如果 p 表示内存中第一行的第一个元素的位置,则第 N 行的第一个元素由以下方式指示:

p + Nk (8.1)

其中 N 是行号(从零开始计数),k 定义为:

if (s ≥ a) k = nl

else

k = a/s * ceil(snl/a)

其中 n 是组中的元素数,l 是行中的组数,aUNPACK_ALIGNMENT 的值,s 是以 GL ubytes 为单位的元素大小。如果每个元素的位数不是 GL ubyte 的位数的1、2、4或8倍,则对于所有 a 的值都有 k = nl。

存在一种机制,用于从较大的包含矩形中选择子矩形的组。该机制依赖于三个整数参数:UNPACK_ROW_LENGTHUNPACK_SKIP_ROWSUNPACK_SKIP_PIXELS。在从内存获取第一组之前,数据指针将按以下方式前进:( UNPACK_SKIP_PIXELS ) n + ( UNPACK_SKIP_ROWS ) k 个元素。然后,从内存中获取宽度组的连续元素(不推进指针),之后指针前进 k 个元素。通过这种方式获取 height 组宽度组的值。

特别解释 Special Interpretations

与表8.5中的类型匹配的类型是一种特殊情况,其中每个组的所有组件都被打包成一个单独的无符号字节、无符号短整数或无符号整数,具体取决于类型。如果类型是FLOAT_32_UNSIGNED_INT_24_8_REV,则每个组的组件都包含在两个32位字中;第一个字包含浮点组件,第二个字包含一个打包的24位未使用字段,后跟一个8位索引。每个打包像素中的组件数量由类型确定,并且必须与格式参数指定的每组组件数量相匹配,如Table 8.5所列。

通常情况下,分量按照从高位到低位的顺序打包,即第一个分量位于位域的最高有效位,后续分量依次占据越来越低的有效位。那些以"_REV"结尾的类型标记名称表示将分量打包顺序反转为从最低到最高有效位。

UNSIGNED_INT_10F_11F_11F_REVUNSIGNED_INT_5_9_9_9_REV 是特例,前者各位被解释为float,后者5是指数(color * 2 ^ ( exp - B - N)): B = 15(指数偏差)和N = 9(尾数位数)。

转换为浮点数 Conversion to floating-point

这一步仅适用于浮点组件的组。它不适用于索引或整数组件。对于包含组件和索引的组,如DEPTH_STENCIL,索引不会被转换。

组中的每个元素都被转换为浮点值。对于无符号或有符号的归一化定点元素,分别使用方程式2.1或2.2。

最终扩展到RGBA Final Expansion to RGBA

该步骤仅适用于非深度组件组。每个组将转换为包含4个元素的组,具体操作如下:如果一个组不包含A元素,则会添加A,并且对于整数组件,将A设置为1,对于浮点组件,将A设置为1.0。如果R、G或B中的任何一个在组中缺失,则会添加每个缺失的元素,并且对于整数组件,将每个缺失的元素赋值为0,对于浮点组件,将每个缺失的元素赋值为0.0。

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

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

相关文章

运营抖店为什么不能多选类目?什么类目适合新手来玩?

大家好,我是电商小布。 想要入驻抖音小店,必备的资质材料就是营业执照。 而执照上的范围,就是我们开店所能选择的经营类目。 有的小伙伴在开店的时候,并没有想明白自己是想要做什么,小店未来的发展方向是什么。 结…

架构师技能9-深入mybatis:Creating a new SqlSession到查询语句耗时特别长

开篇语录:以架构师的能力标准去分析每个问题,过后由表及里分析问题的本质,复盘总结经验,并把总结内容记录下来。当你解决各种各样的问题,也就积累了丰富的解决问题的经验,解决问题的能力也将自然得到极大的…

如何在Shopee平台上进行家居类目选品:有效策略解析

在当今电商行业中,选择合适的产品进行销售至关重要。特别是在Shopee这样竞争激烈的平台上,卖家需要精心挑选家居产品,以提高市场竞争力和销售业绩。以下是一些有效的策略,可供卖家在Shopee平台上进行家居类目选品时参考。 先给大…

基于STM32 单片机智能台灯控制系统的设计

摘要:针对目前我国学生近视率呈现上升趋势、学生坐姿不良等问题,提出了一种基于STM32 单片机智能台灯控制系统。该系统以STM32 单片机为控制核心,通过人体检测模块判断是否有人,实现对台灯亮灭的控制;通过自动调光模块实时检测环境光照强度,利用PWM 脉冲宽度调制技术对台…

只为拿证,软考学哪个最简单?

如果你想在软考中选择一个适合的考试项目,我推荐你考取软考中级职称——系统集成项目管理工程师。接下来,我会详细介绍一下为什么选择这个考试项目。 系统集成项目管理工程师是我国的一个中级职称,该职称的考试由国家人力资源和社会保障部、…

MKdocs添加顶部公告栏

效果如图: docs/overrides下新建main.html ,针对main.html文件 树状结构如下: $ tree -a . ├── .github │ ├── .DS_Store │ └── workflows │ └── PublishMySite.yml ├── docs │ └── index.md │ └──overrides │…

云原生之容器管理工具Portainer

1. 简介 前面文章我们讲Docker、Docker Compose和Docker Swarm都是在Linux系统上手工命令行去操作,在第一次安装的时候可以命令行,以后运维和CICD流程操作中,如果还要命令行去各个节点操作,操作就麻烦了,工作效…

每日学习总结20240222

每日总结 一旦停下来太久,就很难继续了 ——《一个人的朝圣》 20240222 1. 自定义逻辑 请设计一个函数single_track_logic,传入三个参数,第一个参数是int数组,第二个参数是一个int变量,第三个参数是一个以int为返回值&#xff0c…

Android中自定义View时尺寸需要注意的相关事项

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 在Android中自定义View时,一定要用dp或者sp不要用px,这样在不同的…

【0266】postmaster创建共享内存(shared memory)、信号量(semaphores)

1. 前言 postmaster守护进程的每次启动过程中,会先执行一次“共享内存、信号量的重置”。 创建或重新创建共享内存和信号量注意:在每个“生命周期”中,我们通常会分配相同的IPC密钥(如果使用SysV shmem和/或semas)。 这有助于确保在postmaster崩溃并重新启动的情况下,我…

【前端素材】推荐优质后台管理系统GramOs平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具,它通常作为一个独立的后台界面存在,供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能: 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

求逆序对的三种姿势

洛谷P1774 题目&#xff1a;登录 - Luogu Spilopelia​​​​​​ 为什么最小的交换次数就是逆序对的个数&#xff0c;请看相关证明 1、归并排序 // 归并排序解法 #include<iostream> #include<cstring> #include<algorithm> using namespace std; con…

MKP勒索病毒:了解.Henderson@cock.li.mkp变种,以及如何保护您的数据

尊敬的读者&#xff1a; 近年来&#xff0c;网络安全威胁不断涌现&#xff0c;其中勒索病毒尤其令人担忧。最新的一种名为[hudsonLcock.li].mkp、[myersairmail.cc].mkp、.Hendersoncock.li.mkp、[datastorecyberfear.com].mkp的勒索病毒已经开始在网络中传播&#xff0c;并且…

pyspark统计指标计算

下面介绍如何使用pyspark处理计算超大数据的统计指标&#xff0c;主要为&#xff1a;最大值、最小值、均值、方差、标准差、中位数、众数、非重复值等。 # 加载稽核数据 rd_sql f"select * from database.table" spark_data spark.sql(rd_sql)# 计算众数 由于spar…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…

论文选题分享及思路(一)《基于C51单片机的自动化测量产线的设计》

论文选题分享及思路 题目 《基于C51单片机的自动化测量产线的设计》 核心&#xff1a;使用C51单片机按键控制传送带运动&#xff0c;并增加激光测量高度宽度功能及称重功能。 框架&#xff1a;摘要&#xff0c;题目背景&#xff0c;创新点&#xff0c;设计原理&#xff0c;程…

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错&#xff0c;提示无法定位包&#xff0c;提示如下 出现这个问题是因为apt的源没有更新&#xff0c;我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

fly-barrage 前端弹幕库(1):项目介绍

fly-barrage 是我写的一个前端弹幕库&#xff0c;由于经常在 Bilibili 上看视频&#xff0c;所以对网页的弹幕功能一直蛮感兴趣的&#xff0c;所以做了这个库&#xff0c;可以帮助前端快速的实现弹幕功能。 项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff…

Redis信创平替之TongRDS(东方通),麒麟系统安装步骤

我的系统: 银河麒麟桌面系统V10(SP1)兆芯版 1.先进入东方通申请使用 2.客服会发送一个TongRDS包与center.lic给你(我这里只拿到.tar.gz文件,没有网上的什么安装版) 3.上传全部文件到目录中 4.服务节点安装,并启动 tar -zxvf TongRDS-2.2.1.2_P3.Node.tar.gz cd pmemdb/bin/…

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …