【问题标题】:State dependant rendering in fragment shader片段着色器中的状态相关渲染
【发布时间】:2012-07-30 15:12:04
【问题描述】:

我目前正在撰写关于使用 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;
  }
}

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

我需要的是某种解决方法来解决这个问题。有什么想法吗?

这是我目前布局的截图:

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

【问题讨论】:

    标签: java gwt webgl fragment-shader


    【解决方案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);
    }
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多