18.3 OpenGL读取和复制像素:复制像素

2024-02-17 14:12
文章标签 读取 复制 像素 opengl 18.3

本文主要是介绍18.3 OpenGL读取和复制像素:复制像素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

复制像素 Copying Pixels

几个命令

在帧缓冲区的不同区域之间复制像素数据(参见第18.3.1节)。

或者在纹理和渲染缓冲区的不同区域之间复制像素数据(参见第18.3.2节)。

对于所有这些命令,如果源和目标相同或者是相同底层纹理图像的不同视图,并且如果源和目标区域在帧缓冲区、渲染缓冲区或纹理图像中重叠,那么复制操作产生的像素值是未定义的。

位块传输像素矩形 Blitting Pixel Rectangles

要将像素值矩形从源帧缓冲区的一个区域传输到目标帧缓冲区的另一区域

  • void glBlitFramebuffer( int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, bitfield mask, enum filter );
  • void glBlitNamedFramebuffer( uint readFramebuffer, uint drawFramebuffer, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, bitfield mask, enum filter );

glBlitFramebuffer:用于操作绑定到READ_FRAMEBUFFERDRAW_FRAMEBUFFER的源和目标帧缓冲区。

glBlitNamedFramebuffer:用于操作给定名称的源和目标帧缓冲区对象。

如果没有帧缓冲区绑定到READ_FRAMEBUFFERDRAW_FRAMEBUFFER(对于glBlitFramebuffer),或者readFramebufferdrawFramebuffer为零(对于glBlitNamedFramebuffer),则默认的读或绘制帧缓冲区将用作相应的源或目标帧缓冲区。

mask参数是零,或者是一个或多个值的按位OR运算的结果,指示要复制哪些缓冲区。这些值可以是COLOR_BUFFER_BITDEPTH_BUFFER_BITSTENCIL_BUFFER_BIT,它们在第17.4.3节中有描述。像素对应于这些缓冲区的值从源矩形(srcX0, srcY0)左下角(srcX1, srcY1)右上角定义的位置复制到目标矩形(dstX0, dstY0)左下角(dstX1, dstY1)右上角定义的位置。

在BlitFramebuffer操作时,如果源和目标矩形的尺寸不匹配,则源图像将被拉伸以适应目标矩形。filter参数必须是LINEARNEAREST,指定如果图像被拉伸时要应用的插值方法。仅当源和目标的尺寸相同时,才不应用滤波。如果源或目标矩形指定负宽度或高度(X1 < X0或Y1 < Y0),则图像在相应方向上翻转。如果源和目标矩形都为同一方向指定了负宽度或高度,那么不执行翻转操作。如果选择了线性滤波,并且线性采样的规则要求在源缓冲区的边界外采样,则就好像执行了CLAMP_TO_EDGE纹理采样。

如果源和目标缓冲区相同,并且源和目标矩形重叠,则Blit操作的结果是未定义的。

在图像之间复制 Copying Between Images

  • void glCopyImageSubData( uint srcName, enum srcTarget, int srcLevel, int srcX, int srcY, int srcZ, uint dstName, enum dstTarget, int dstLevel, int dstX, int dstY, int dstZ, sizei srcWidth, sizei srcHeight, sizei srcDepth );

在两个图像对象之间复制一个区域的纹理数据。这些图像对象可以是纹理或渲染缓冲区。该命令的主要功能在于高效地将源图像子区域的数据直接拷贝到目标图像的相应子区域内,类似于 CPU 中的 memcpy 操作。

glCopyImageSubData 不执行通用转换操作,如缩放、重置大小、混合、色彩空间转换或格式转换。它仅允许在兼容的内部格式之间进行复制,包括某些类型的压缩和未压缩内部格式之间的复制(具体规则参见表 18.4)。这种复制不会进行实时的压缩或解压缩。从非压缩内部格式到压缩内部格式的复制时,每个未压缩数据的纹理像素会变成一块压缩数据;而从压缩内部格式到非压缩内部格式时,一块压缩数据会变成一个未压缩数据的纹理像素。此时,未压缩格式的纹理像素大小必须与压缩格式的块大小相同。

函数参数说明如下:

  • srcNamesrcTarget:标识源图像对象的名字及其目标类型。
  • dstNamedstTarget:标识目标图像对象的名字及其目标类型。
  • srcLeveldstLevel:分别指定源和目标的层级细节,在纹理中为有效的 mip 级别,在渲染缓冲区中则必须为零。
  • srcX, srcY, srcZ:定义源图像中矩形子区域的左下角纹理坐标。
  • dstX, dstY, dstZ:定义目标图像中矩形子区域的左下角纹理坐标。
  • srcWidth, srcHeight, srcDepth:定义源和目标子区域的宽度、高度和深度(对于一维数组或多维纹理可能是数组切片数)。

源和目标子区域都必须完全位于各自图像对象所指定层级内,并且尺寸始终以纹理像素单位给出,即使对于压缩纹理格式也是如此。

此函数支持一次性复制一维数组、二维数组、立方体贴图数组或多维纹理的多个切片,或者复制立方体贴图的不同面。只需通过 srcZdstZ 参数指定起始切片,并使用 srcDepth 指定要复制的切片数量。

glCopyImageSubData 函数认为两个内部格式兼容,如果满足以下条件之一:

  1. 格式相同,并且作为基本内部格式时,两个图像的有效内部格式也相同。
  2. 根据用于纹理视图的兼容性规则(在第 8.18 节定义),两个格式被认为是兼容的,特别是当它们在同一张表格 8.22 的同一行列出时。
  3. 其中一个格式是压缩的,另一个是未压缩的,并且这两个格式在表 18.4 中处于同一行。

当存在重叠复制时,会导致未定义的像素值,正如第 18.3 节介绍所述。

这篇关于18.3 OpenGL读取和复制像素:复制像素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/718030

相关文章

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

使用Python实现高效复制Excel行列与单元格

《使用Python实现高效复制Excel行列与单元格》在日常办公自动化或数据处理场景中,复制Excel中的单元格、行、列是高频需求,下面我们就来看看如何使用FreeSpire.XLSforPython... 目录一、环境准备:安装Free Spire.XLS for python二、核心实战:复制 Exce

Java多种文件复制方式以及效率对比分析

《Java多种文件复制方式以及效率对比分析》本文总结了Java复制文件的多种方式,包括传统的字节流、字符流、NIO系列、第三方包中的FileUtils等,并提供了不同方式的效率比较,同时,还介绍了遍历... 目录1 背景2 概述3 遍历3.1listFiles()3.2list()3.3org.codeha

在C#中读取文件的六种主流方法详解

《在C#中读取文件的六种主流方法详解》在C#中读取文件有多种方法,不同方式适用于不同场景(小型文件、大型文件、文本文件或二进制文件),本文给大家介绍了6种主流方法以及其适用场景,需要的朋友可以参考下... 目录方法1:File.ReadAllText(读取整个文本文件)方法2:File.ReadAllLin

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放