Opengl — смещение размытия по Гауссу / проблема смещения

В настоящее время я реализовал гауссовский размытие шейдера в Opengl с использованием C ++. Гауссово размытие работает. Однако результаты выглядят немного смещенными по сравнению с исходным изображением. Получающееся изображение размытия, кажется, помещено немного выше, а немного левее. И не по центру на том же месте, что и оригинал.

Гауссово размытие, которое я использую, является двухпроходным вычислением.
Я основал гауссовский расчет на демонстрационном коде, который нашел в Интернете.

Расчет ядра по Гауссу выглядит следующим образом:

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

Есть мысли, что может быть не так?

1

Решение

Я понял.

Похоже, что _offsets ‘должен быть того же размера, что и ядро. Основная причина этого заключается в том, что центральное положение смещений должно быть в том же положении, что и центральное положение ядра. Если вы этого не сделаете, то гауссиан не будет правильно выровнен с текстурой.

Один из способов сделать это — сделать «_offsets» того же размера, что и ядро.

Я искал это решение в течение нескольких дней -_-

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]