首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Opengl -高斯模糊置换/不对齐问题

Opengl -高斯模糊置换/不对齐问题
EN

Stack Overflow用户
提问于 2013-01-31 05:27:24
回答 1查看 748关注 0票数 1

我目前已经使用C++在Opengl中实现了一个高斯模糊着色器。高斯模糊起作用。然而,与原始图像相比,结果似乎有一点偏移。由此产生的模糊图像似乎被放置在更高的位置,并将一些内容放置在左侧。而不是与原件居中的位置。

我使用的高斯模糊是一个两遍计算。我基于我在网上找到的演示代码进行高斯计算。

高斯内核计算如下所示:

代码语言:javascript
复制
    for(i = 0; i <= center; ++i)
    {
        result            = exp(-(i*i)/(double)(2*_sigma*_sigma));
        _kernel[center+i]  = _kernel[center-i] = (float)result;
        sum              += (float)result;
        if(i != 0) sum   += (float)result;

    }

    // normalize kernel
    for(i = 0; i <= center; ++i)
    {
        _kernel[center+i] = _kernel[center-i] /= sum;
    }

偏移计算如下所示:

代码语言:javascript
复制
_offsets        = new float [_kernelSize * 2 + 1];
_offsetSize     = _kernelSize * 2 + 1;

float xInc      = 0;

if(_shaderType == S2DGaussianComponentBlurShaderHorizontal)
{
    xInc        = 1.0f / (float)_width;
}
else
{
    xInc        = 1.0f / (float)_height;
}

int   index     = 0;
for (int i = -_kernelSize; i < _kernelSize + 1; ++i)
{
    index            = i + _kernelSize;
    _offsets [index] = i * xInc;
}

frag明暗器如下所示:

代码语言:javascript
复制
#version 120   \n                               \
uniform sampler2D texture;                      \
varying vec4 texcoord;                          \
                                                \
                                                \
uniform int kernelSize;                         \
uniform float weight[50];                       \
uniform float offsets[50];                      \
void main(void)                                 \
{                                               \
vec2 uv  = texcoord.xy;                         \
vec4 sum = vec4(0.0);                           \
for (int i = 0; i< kernelSize; i++)             \
{                                               \
vec4 tmp       = texture2D( texture,  uv + vec2(0.0, offsets[i]) ); \
sum           += tmp * weight[i];               \
}                                               \
                                                \
gl_FragColor = sum;                             \
}"

纹理输入使用以下内容:

代码语言:javascript
复制
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

有什么不对劲的想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-01 04:08:50

我想通了。

看起来'_offsets‘必须和内核的大小一样。这样做的主要原因是,偏移的中心位置必须与内核的中心位置相同。如果您不这样做,那么高斯将不会与纹理正确对齐。

这样做的一种方法是使“_offsets”与内核大小相同。

我已经寻找这个解决方案好几天了-_-‘

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14614116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档