gpt4 book ai didi

c++ - Opengl - 高斯模糊移位/错位问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:59:46 34 4
gpt4 key购买 nike

我目前已经使用 C++ 在 Opengl 中实现了一个高斯模糊着色器。高斯模糊有效。然而,与原始图像相比,结果似乎有点偏移。生成的模糊图像似乎放得更高,放得更靠左。并且不以与原始位置相同的位置为中心。

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

高斯核计算如下所示:

    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;
}

偏移量计算如下所示:

_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;
}

片段着色器看起来像这样:

#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; \
}"

纹理输入使用这些:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);

有什么想法可能是错误的吗?

最佳答案

我想通了。

'_offsets' 似乎必须与内核大小相同。这样做的主要原因是偏移量的中心位置必须与内核的中心位置相同。如果不这样做,则高斯将无法与纹理正确对齐。

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

几天来我一直在寻找这个解决方案 -_-'

关于c++ - Opengl - 高斯模糊移位/错位问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14614116/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com