【问题标题】:Changing the size of a pixel depending on it's color with GLSL使用 GLSL 根据颜色更改像素的大小
【发布时间】:2016-05-05 14:28:03
【问题描述】:

我有一个应用程序,它将使用 32 位对方位和强度数据进行编码。我的片段着色器已经解码了这些值,然后根据方位和强度设置颜色。

我想知道是否也可以通过着色器更改绘制像素的大小(可能还有形状)。

例如,假设我们有 4 个可能的强度值,那么 0 将导致绘制单个像素,1 将绘制 2x2 正方形,2 绘制 4x4 正方形,3 绘制半径为 6 像素的圆。

过去,我们必须在 CPU 端完成所有这些工作,我希望将这项工作转移到 GPU 上。

【问题讨论】:

  • 祝你好运使用片段着色器画一个圆。如果你对所有这些使用实际的原语,你可能会得到更好的结果。您可以像片段一样从顶点或几何着色器(没有某些类型的过滤)采样纹理。我不知道详细说明此解决方案是否可行,因为我不知道您的数据集更改的大小或频率。
  • 我最糟糕的情况是每秒刷新两次的 500x750 数组。

标签: opengl glsl


【解决方案1】:

不,片段着色器不能影响它们写入的数据的“大小”。一旦某些东西被光栅化为fragments,它就不再有“大小”了。

如果您正在渲染GL_POINTS primitives,您可以从顶点着色器更改它们的大小。至于点的大小,要确保一个特定的点覆盖确切数量的片段是相当困难的。

【讨论】:

  • 我的应用程序将数据“绘制”到纹理上。然后,该数据由片段着色器解码。顶点着色器可以用来做我需要的吗?不需要我的片段着色器来完成。
【解决方案2】:

我想到的第一件事是做一些类似的模糊技术,但不是模糊纹理,我们用它来寻找具有范围的相邻纹素,以检查它是否具有高于 1.0f 的强度。如果是,则将当前纹理颜色设置为例如红色。

如果您使用的 fbo 与窗口大小相比为 1:1,请在纹理坐标中使用 1/width 和 1/height 以获得大约 1 个像素(不完全是因为它不是像素而是纹素,差不多)

虽然这个工作很好,但它的缺点是它非常昂贵,因为它会具有 n^2 的复杂性并且可能会有一些分支。

编辑:经过一段时间的思考,这可能不适用于偶数的大小

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多