本文主要是介绍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_FRAMEBUFFER
和DRAW_FRAMEBUFFER
的源和目标帧缓冲区。
glBlitNamedFramebuffer
:用于操作给定名称的源和目标帧缓冲区对象。
如果没有帧缓冲区绑定到READ_FRAMEBUFFER
或DRAW_FRAMEBUFFER
(对于glBlitFramebuffer
),或者readFramebuffer
或drawFramebuffer
为零(对于glBlitNamedFramebuffer
),则默认的读或绘制帧缓冲区将用作相应的源或目标帧缓冲区。
mask
参数是零,或者是一个或多个值的按位OR运算的结果,指示要复制哪些缓冲区。这些值可以是COLOR_BUFFER_BIT
、DEPTH_BUFFER_BIT
和STENCIL_BUFFER_BIT
,它们在第17.4.3节中有描述。像素对应于这些缓冲区的值从源矩形(srcX0, srcY0)左下角
和(srcX1, srcY1)右上角
定义的位置复制到目标矩形(dstX0, dstY0)左下角
和(dstX1, dstY1)右上角
定义的位置。
在BlitFramebuffer操作时,如果源和目标矩形的尺寸不匹配,则源图像将被拉伸以适应目标矩形。filter
参数必须是LINEAR
或NEAREST
,指定如果图像被拉伸时要应用的插值方法。仅当源和目标的尺寸相同时,才不应用滤波。如果源或目标矩形指定负宽度或高度(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)。这种复制不会进行实时的压缩或解压缩。从非压缩内部格式到压缩内部格式的复制时,每个未压缩数据的纹理像素会变成一块压缩数据;而从压缩内部格式到非压缩内部格式时,一块压缩数据会变成一个未压缩数据的纹理像素。此时,未压缩格式的纹理像素大小必须与压缩格式的块大小相同。
函数参数说明如下:
srcName
和srcTarget
:标识源图像对象的名字及其目标类型。dstName
和dstTarget
:标识目标图像对象的名字及其目标类型。srcLevel
和dstLevel
:分别指定源和目标的层级细节,在纹理中为有效的 mip 级别,在渲染缓冲区中则必须为零。srcX
,srcY
,srcZ
:定义源图像中矩形子区域的左下角纹理坐标。dstX
,dstY
,dstZ
:定义目标图像中矩形子区域的左下角纹理坐标。srcWidth
,srcHeight
,srcDepth
:定义源和目标子区域的宽度、高度和深度(对于一维数组或多维纹理可能是数组切片数)。
源和目标子区域都必须完全位于各自图像对象所指定层级内,并且尺寸始终以纹理像素单位给出,即使对于压缩纹理格式也是如此。
此函数支持一次性复制一维数组、二维数组、立方体贴图数组或多维纹理的多个切片,或者复制立方体贴图的不同面。只需通过 srcZ
和 dstZ
参数指定起始切片,并使用 srcDepth
指定要复制的切片数量。
glCopyImageSubData
函数认为两个内部格式兼容,如果满足以下条件之一:
- 格式相同,并且作为基本内部格式时,两个图像的有效内部格式也相同。
- 根据用于纹理视图的兼容性规则(在第 8.18 节定义),两个格式被认为是兼容的,特别是当它们在同一张表格 8.22 的同一行列出时。
- 其中一个格式是压缩的,另一个是未压缩的,并且这两个格式在表 18.4 中处于同一行。
当存在重叠复制时,会导致未定义的像素值,正如第 18.3 节介绍所述。
这篇关于18.3 OpenGL读取和复制像素:复制像素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!