通过 Autostereograms 案例学习 OpenGL 和 OpenCL 的互操作性
引言
在过去的十年里, GPU (图形处理单元)已经从特殊硬件(特供)转变成可以在数值计算领域开辟新篇章的高性能计算机设备。
许多算法可以使用拥有巨大的处理能力的GPU来高速执行和处理大数据量。即使在通常的情况下,不可能将图形硬件编程化, 图形硬件也可以加快算法与图像的处理。 举个例子:通常情况下可以用来计算图形差分,模糊图像, 合并图像,甚至是进行图像(或数组)平均值计算。
随后,可编程方式的出现给编程者带来了极大的便利。 可编程方式所提供的新的可能性,更广泛类别的算法可以移植到GPU来执行。需要转换一定的思路来适应使用屏幕渲染的形式来表达出算法。
现如今可编程GPU支持更高级别的编程范例,可以把它们称之为GPGPU (通用图形处理单元). 新模式允许执行更加通用的算法其不涉及到GPU硬件设备相关内容,可不关心图形化来编制程序了。
本文探讨不通过GPGPU的API而是用可扩展可编程渲染管道autostereogram与GPGPU进行交互.(译注:这个意思是autostereogram为GPGPU的一个框架么?)autostereogram场景渲染深度缓冲使用GPU的OpenGL和OpenCL (GPGPU) 内核,并且OpenGL GLSL (可编程渲染通道) 着色器的深度数据不必被CPU读取。
案例分析:Autostereogram
本文只提供autostereogram生成算法基础,将不涉及到更多细节,更具体的信息请参阅其他资料。
Autostereograms的普遍使用将使立体图像重新流行。Autostereograms可以使单个图片不聚焦在平面上,以3D场景的形式进行显示 ,最常用的方式是三维场景的展示。
autostereograms编码3D场景的能力并不是最好的, 但很快, 观看隐藏在autostereograms的这些"奥秘" 场景将变的非常容易。
本文所实现的算法是最简单的autostereogram生成算法之一,该算法简单地重复某个可平铺模式(可以是一个可平铺纹理或者一个随机生成的纹理),并根据输入深度图中像素的z深度来改变其“重复长度”:
对于输出图的每一行:
复制该重复纹理的一整行 (该瓦片)
对输入深度图中该行的每一个像素:
复制离左边 one-tile-width 个像素的那个像素的颜色, 然后减去偏移量 X
对于最大深度(离眼睛最远),X为0,对于最小深度(离眼睛最近),X为最大像素偏移量(~30 像素)
因此,查看器中的像素越是接近,重复模式就越短。这就是诱导眼睛和大脑认为该图像是三维图像的基础。输出图的宽度将会是重复图与输入深度图之和,这样就可以给最初那个未经改变的重复图的拷贝留出足够的空间。
当为之后的结果和性能比较呈现一个参考实现时,一个有着确切描述的CPU实现会在稍后被测试,而不是提供一个更加正式的算法描述。
参考:
- stereograms描述:http://en.wikipedia.org/wiki/Stereogram
- autostereogram描述:http://en.wikipedia.org/wiki/Autostereogram
- autostereogram查看技术:http://www.hidden-3d.com/how_to_view_stereogram.php
- stereograms的非技术性与技术性讨论:http://www.techmind.org/stereo/stereo.html
一般实现预览:
下图给出了总体的算法流程