第八章 图像和采样器
本章将介绍图像对象,这是一种特殊类型的内存对象,用来访问2维和3维图像数据。本章给出一个使用图像和采样器的例子,并介绍一下概念:
- 图像和采样器对象概述
- 创建图像和采样器对象
- 指定和查询图像格式
- 处理图像的OpenCL C函数
- 传输图像对象数据
8.1 图像和采样器
OpenCL中存在图像对象的主要原因是:这样允许程序充分利用CPU中的高性能纹理硬件。此外还可以从其他硬件得到另外一些优点,因此图像对象是OpenCL中处理2维和3维图像数据的最佳方法。
图像对象封装了有关一个图像的多种信息:
- 图像大小:2维图像的宽度和高度(以及3维图像的深度)。
- 图像格式:内存中图像像素的位深度和布局。
- 内存访问标志:例如,图像是用于读还是写,或者是否可同时读、写。
内核中从图像对象获取数据时需要采样器。采样器告诉图像读取函数如何访问图像:
- 坐标模式:从图像获取数据所用的纹理坐标规格化至范围[0...1]还是范围[0...image_dim-1]。
- 寻址模式:当坐标超出图像边界范围时,从图像获取数据的行为。
- 过滤模式:从图像获取数据时,取一个样本还是实用多个样本过滤。
8.2 创建图像对象
创建图像对象可以通过clCreateImage2D()或clCreateImage3D()完成:
cl_mem clCreateImage2D(cl_context context, cl_mem_flags flags, const cl_image_format* image_format, size_t image_width, size_t image_heigth, size_t image_row_pitch, void* host_ptr, cl_int* errcode_ret) cl_mem clCreateImage3D(cl_context context, cl_mem_flags flags, const cl_image_format* image_format, size_t image_width, size_t image_height, size_t image_depth, size_t image_row_pitch, size_t image_slices_pitch, void* host_ptr, cl_int* errcode_ret)
image_row_pitch如果host_ptr不为NULL,这个值指定图像中各行的字节数。如果值为0,则认为长度等于image_width*(bytes_per_pixel)。
8.3 创建采样器对象
采样器对象指定了从图像获取数据时使用的过滤、寻址和坐标模式。所有这些选项分别对应于GPU硬件获取纹理的能力。
过滤模式指定使用最近(nearest)采样还是线性(linear)采样来获取数据。