2012-08-01 88 views
3

我目前正在研究关于使用GWT插件gwt-g3d创建仓库的3D可视化的学士论文。在片段着色器中依赖于状态的渲染

我已经尽可能地相当有效地显示结构布局。由于我在着色器中保留了所有的渲染并将我的gl.draw()调用最小化,所以渲染了200万以上的顶点。然而,我认为我使用这种技术已经走到了死胡同,因为它非常静态。我需要的是一种使我的应用程序更具动态性的方法。 因为我习惯于在Java中使用面向对象的编程,所以着色器语言很难让我头脑发热。这就是我在说的...

我想以不同的方式(不同的颜色开始)呈现多个区域(这些区域的数量在初始化时未知)的可视化。所以我用尽片段着色器内是这样的:

... 
uniform vec3 alteredCoords[]; //a coordArray of positions that i want to render alternatively 
... 

// color each of these coords in grey 
for (int i = 0; i < alteredCoords.length(); i++) { 
    if (position.x == alteredCoords[i].x && position.y == alteredCoords[i].y && position.z == alteredCoords[i].z) { 
    gl_FragColor = vec4(100.0/255.0, 100.0/255.0, 100.0/255.0, 1.0); 
    return; 
    } 
} 

我知道,这是行不通的,因为它是,因为数组需要一个固定的大小和有铸造的问题 - 试图忽略,就目前而言,因为这将无法正常工作,因为着色器语言不支持动态大小的数组。

我需要的是这种问题的某种解决方法。有任何想法吗?

这里是什么我的布局看起来像此刻的截图:

请注意,我已经实现了我的想法对一个区域(灰色正方形)已经 - 我需要的是一些方法以这种方式动态呈现多个区域。

回答

0

由于关于要绘制的内容的信息与顶点相关联,因此您可能最好使用vertex attributes将信息与顶点一起传输到管线。我不是这方面的专家,但我认为其他方面可能会比这更贵。

1

这里是典型的解决方法在片段着色器获得动态大小的数组:

纹理!

更具体地,可以在一个n X m像素纹理传递(与最近邻重采样),并通过在值nm制服。纹理采样器使用标准化uv坐标,所以你可以建立一个映射功能,像这样:

uniform sampler2D sampler; 
uniform float n; 
uniform float m; 

vec4 get_texel(float idx) { 
    vec2 idx2d = vec2(
     (mod(idx, n) + 0.5)/n, 
     (floor(idx/n) + 0.5)/m); 
    return texture2D(sampler, idx2d); 
} 

现在你有一个可变大小的数组vec4小号

为了进一步对这个扩展,假设你的书架上您可以很容易地创建一个映射函数,该函数将当前片段的世界坐标映射到您传入的纹理中的特定像素,然后使用纹理的值选择如何渲染所述片段。