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;
  }
}

我知道这不会按原样工作,因为数组需要恒定大小并且存在强制转换问题 - 现在尝试忽略它,因为无论如何这都不起作用,因为着色器语言不支持动态大小的数组。

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

这是我目前布局的屏幕截图:

请注意,我已经为单个区域(灰色正方形)实现了我的想法——我所需要的只是一些以这种方式动态渲染多个区域的方法。

4

2 回答 2

1

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

纹理!

更具体地说,您可以传入nxm像素纹理(使用最近邻重采样),并传入值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);
}

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

为了进一步扩展这一点,假设您的货架排列在规则网格中,您可以非常轻松地创建一个映射函数,该函数获取当前片段的世界坐标并将其映射到您传入的纹理中的特定像素,然后使用纹理的值来选择如何渲染所述片段。

于 2012-09-18T01:45:25.357 回答
0

由于有关您要以不同方式绘制的信息与顶点相关联,因此您可能最好使用顶点属性将信息与这些顶点一起传输到管道。我不是这方面的专家,但我认为其他任何东西都可能比这更贵。

于 2012-08-01T20:37:39.110 回答