这是该算法一个有趣的部分,它将由于不同CPU和GPU的实现而不同。
在此之后,将依据每个像素计算出的纹理坐标堆积出最终的图像。
计算垂直纹理坐标不是主要的挑战,因为只需要垂直重复计算即可。垂直纹理坐标甚至无需在此时计算,只需在接下来的步骤中进行简单处理。这个立体图生成算法的核心实际上就是在输出图像的每个像素中计算出水平纹理坐标。
这一步的操作结果将最终输出相同的小的立体图,其中每个像素保存一个单一的浮点值,它表示在水平纹理坐标的二维图像。 这些浮点值将不断地从左向右出现,其中小数部分将代表(0~1范围内)的实际坐标和整数部分将代表该模式的重复次数。 这种表示是为了避免在寻找关键值时出现的混合值. 例如,如果值0.99和0.01之间的算法,插值将产生0.5左右的样值,但是这是完全错误的。 通过使用值0.99和1.01,插值将产生约1.0样值,这才是对的。
上面的伪码稍作修改就能实现这一中间步骤。在为每一个重复瓷片坐标的整个行设置第一个像素标记之后(比如在0——1之间增加取值个数来获取整个瓷片行),查询步骤就可以开始了。查询步骤是通过查询靠左的一个瓷片宽度数减去一个关于深度的值进行的。所以伪码如下:
For 输出坐标图片的每一行
为所有重复瓷片的第一行写入坐标
For 输入的深度映射行中的每个像素点
在当前写入行中,将靠左的一瓷片宽度像素减去X的偏移量,并实例化坐标系。
where 对于最大深度(人眼识别的最大深度),X值为0 and 对于最小深度(最接近人眼的深度)X是偏移像素的最大值(~30像素)
这个值加“1”,这样可以使得结果连续递增。
在输出坐标图片中存入计算得到的值。
更细致的应用细节由CPU的相关性能、应用来决定,不过考虑到各种运行细节,这个方法依然是水平较高的算法。
立体渲染这最后一步的坐标“形象”,并重复平铺图像作为输入,并简单地通过在合适的位置采样平铺图像最终渲染图像。 它会从输入的坐标“图像“得到水平纹理坐标。他将从输出的坐标"图像"中计算垂直坐标(只是简单的重复自身).
这个采样过程是在GPU上通过自定义着色器完成的。 一个屏幕对齐的四边形开始呈现,接下来的像素着色器则被用来计算最终的颜色渲染。
#version 150
smooth in vec2 vTexCoord;
out vec4 outColor;
// Sampler for the generated offset texture.
uniform sampler2D uOffsetTexture;
// Sampler for the repeating pattern texture.
uniform sampler2D uPatternTexture;
// Scaling factor (i.e. ratio of height of two previous textures).
uniform float uScaleFactor;
void main( )
{
// The horizontal lookup coordinate comes directly from the
// computed offsets stored in the offset texture.
float lOffsetX = texture( uOffsetTexture, vTexCoord ).x;
// The vertical coordinate is computed using a scaling factor
// to map between the coordinates in the input height texture
// (i.e. vTexCoord.y) and where to look up in the repeating pattern.
// The scaling facture is the ratio of the two textures' height.
float lOffsetY = ( vTexCoord.y * uScaleFactor );
vec2 lCoords = vec2( lOffsetX , lOffsetY );
outColor = texture( uPatternTexture , lCoords );
};
这样就完成了算法概述。下一节介绍了CPU执行的坐标生成阶段。