第八章 图像和采样器

本章将介绍图像对象,这是一种特殊类型的内存对象,用来访问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)采样来获取数据。

原文地址:https://www.cnblogs.com/tcsong24/p/7656645.html