2013-02-13 39 views
2

我正在读取一个由16位图像组成的z-stack(即图像数组)。我是webgl着色器的新手,我遇到了如何遍历数组的问题。我在哪个webgl着色器将数组转换为图像

我希望将整个可变长度的图像列表(最多可达数百个)放到GPU上。然后,随着z堆栈中的每次更改,gpu都将渲染新图像。目前,我有以下:

<script id="shader-vertex" type="x-shader/x-vertex"> 
attribute float a_fluxes; 
varying float v_flux; 
attribute vec2 a_position; 
uniform vec2 u_resolution; 

void main() { 
    vec2 zeroToOne = a_position/u_resolution; 
    gl_Position = vec4((zeroToOne * 2.0 - 1.0) * vec2(1, -1), 0, 1); 
    v_flux = a_fluxes/256.; 
} 
</script> 
<script id="shader-fragment" type="x-shader/x-fragment"> 
precision highp float; 
varying float v_flux; 

void main() { 
    gl_FragColor = vec4(v_flux, v_flux, v_flux, 1); 
} 
</script> 

图像(X,Y,和z)的3维阵列应该被转换成一维列表进入a_fluxes。

如何迭代z图像之一的x和y尺寸?我是否使用循环迭代顶点着色器,还是需要将所有可能的像素x,y坐标数组传递给顶点着色器?我真的应该在片段着色器上进行这些计算吗?

+0

您不会遍历x,y坐标,而且您不希望:否则,该工作将如何在GPU单元之间分配?循环并不总是容易分开。 OpenGL将这些工作划分为单元并为您迭代。至于如何最好地处理这种情况,那么这超出了我目前的新手经验。 – JayC 2013-02-14 05:32:58

回答

0

如果您打算使用GPU在它们之间跳转,那么我认为您可以将纹理放在一起放入图集(图像的二维数组作为一个图像)。 WebGL不支持卷纹理,如果它建议我使用每张图片的切片 - 但相反,您可能最好从较大合成图像的UV空间中切出窗口,其中每个窗口对应到您的一个子图像。