Я хочу размыть края изображения, подход, который я предпринял, заключался в том, чтобы отрендерить изображение в буфер кадра, а затем применить к нему размытие по Гауссу.
чем я попытался наложить фактическое изображение поверх размытое изображение, но этот подход, похоже, не работает.
введите описание изображения здесь
Так как это не дает эффекта размытия по краям, но размытое изображение уходит.
Пожалуйста, предложите мне способы, которыми я могу этого добиться, или вы можете показать мне, как это можно сделать во фрагментном шейдере.
Код
// Generate frame buffers
glGenFramebuffers(2, pingpongFBO);
glGenTextures(2, pingpongBuffer);
for (unsigned int i = 0; i < 2; i++)
{
glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[i]);
glBindTexture(GL_TEXTURE_2D, pingpongBuffer[i]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGBA,
GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,pingpongBuffer[i],0);
}
// blur the image
bool horizontal = true, first_iteration = true;
float blurValue = 6;
GLint drawFrameBuffer;
int amount = blurValue;
shaderBlur.use();
shaderBlur.setInt("image", 0);
glDisable(GL_DEPTH_TEST);
glActiveTexture(GL_TEXTURE0);
glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[horizontal]);
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[!horizontal]);
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
for (unsigned int i = 0; i < amount; i++)
{
shaderBlur.setInt("horizontal", horizontal);
glBindFramebuffer(GL_FRAMEBUFFER, pingpongFBO[horizontal]);
if (first_iteration)
{
glBindTexture(GL_TEXTURE_2D, image.textureID);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
glBindTexture(GL_TEXTURE_2D, pingpongBuffer[!horizontal]);
glGenerateMipmap(GL_TEXTURE_2D);
}
renderQuadInner();
horizontal = !horizontal;
if (first_iteration)
first_iteration = false;
}
// Map the image
shader.use();
shader.setInt("u_tex", 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0); // the default frame buffer
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, pingpongBuffer[horizontal]); // the blurred image
renderQuad();
glBindTexture(GL_TEXTURE_2D, image.textureID); // the actual image
renderQuad();
Шейдер размытия
#version 330 core
out vec4 FragColor;
in vec2 TexCoords;
uniform sampler2D image;
uniform bool horizontal;
float offset[3] = float[]( 0.0, 1.3846153846, 3.2307692308 );
uniform float weight[3] = float[] (0.2270270270, 0.316216162, 0.0702702703);
void main()
{
vec2 tex_offset = 3.0 / textureSize(image, 0); // gets size of single texel
vec4 result = texture(image, TexCoords).rgba * weight[0];
vec2 uv = TexCoords.xy;
if(horizontal)
{
for(int i = 1; i < 3; ++i)
{
result += texture(image, TexCoords + vec2(tex_offset.x * i, 0.0)).rgba * weight[i];
result += texture(image, TexCoords - vec2(tex_offset.x * i, 0.0)).rgba * weight[i];
}
}
else
{
for(int i = 1; i < 3; ++i)
{
result += texture(image, TexCoords + vec2(0.0, tex_offset.y * i)).rgba * weight[i];
result += texture(image, TexCoords - vec2(0.0, tex_offset.y * i)).rgba * weight[i];
}
}
FragColor = vec4(result);
}