繁体   English   中英

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

[英]State dependant rendering in 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;
  }
}

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

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

这是我的布局目前的样子截图:

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

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

纹理!

更具体地说,您可以传入一个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数组

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM