片段着色器中的状态依赖渲染

时间:2012-08-01 17:00:34

标签: java gwt webgl fragment-shader

我目前正在研究我的学士论文,即使用GWT插件gwt-g3d创建仓库的3D可视化。

我能够非常有效地显示结构布局。以合适的帧速率渲染200万个顶点,因为我在着色器中保留所有渲染并最小化gl.draw()个调用。但是,我认为我使用这种技术已经走到了尽头,因为它非常静态。我需要的是一种使我的应用程序更具动态性的方法。 由于我习惯于在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;
  }
}

我知道这不会起作用,因为数组需要一个恒定的大小并且存在转换问题 - 现在试着忽略它,因为这不会起作用,因为着色器语言不支持动态大小的阵列。

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

以下是我的布局目前的截图:

请注意,我已经为单个区域(灰色方块)实现了我的想法 - 我只需要通过某种方式动态渲染多个区域。

2 个答案:

答案 0 :(得分: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 s

数组

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

答案 1 :(得分:0)

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