【问题标题】:Fragment-shader blur ... how does this work?片段着色器模糊......这是如何工作的?
【发布时间】:2011-01-27 03:14:51
【问题描述】:
uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
  vec4 sample[9];
  for(int i = 0; i < 9; ++i)
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);

  gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
      (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
      sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}

sample[i] = texture2D(sample0, ...) 行是如何工作的?

似乎模糊了图像,我必须首先生成图像,但在这里,我试图查询我正在生成的图像。这是如何工作的?

【问题讨论】:

    标签: fragment-shader


    【解决方案1】:

    它将模糊内核应用于图像。 tc_offset 需要由应用程序正确初始化,以在实际纹理坐标周围形成一个 3x3 的采样点区域:

    0   0   0
    0   x   0
    0   0   0
    

    (假设 x 是原始坐标)。左上采样点的偏移量为-1/width,-1/height。中心点的偏移量需要仔细对齐纹素中心(off-by-0.5 问题)。此外,硬件双线性滤波器可用于廉价地增加模糊量(通过在纹素之间进行采样)。

    着色器的其余部分按样本的距离缩放样本。通常,这也是预先计算好的:

    for(int i = 0; i < NUM_SAMPLES; ++i) {
        result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
    }
    

    【讨论】:

      【解决方案2】:

      一种方法是生成原始图像以渲染到纹理,而不是屏幕。 然后,您使用此着色器和纹理绘制一个全屏四边形,作为对图像进行后处理的输入。

      【讨论】:

        【解决方案3】:

        正如您所注意到的,为了制作模糊图像,您首先需要制作图像,然后再进行模糊处理。此着色器(仅)执行第二步,获取先前生成的图像并对其进行模糊处理。其他地方需要额外的代码来生成原始的非模糊图像。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-17
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多