Блум странно появляется в желтом цвете - PullRequest
0 голосов
/ 10 сентября 2018

Problem Привет,

По какой-то причине цвет выглядит как желтый, я не совсем уверен, почему цвет - желтый, это не проблема смешивания, и код кажется правильным.

Я исследовал эту проблему и знаю, что, похоже, у той же проблемы, я думаю, что это может быть связано с фильтрацией текстур fbo, но я не уверен. Мне нужна помощь.

Вот код ..

Код окончательного сбора

#version 330 core

out vec4 FragColor;

in vec2 _texcoord;

in float color;

uniform sampler2D scene;
uniform sampler2D bloom;

uniform float bloom_intensity;

void main()
{              
    const float gamma = 1.3;
    float exposure = 1.0;

    vec3 hdrColor = texture(scene, _texcoord).rgb;      
    vec3 bloomColor = texture(bloom, _texcoord).rgb;

    hdrColor += bloomColor; /// bloom_intensity;

    // tone mapping
    vec3 result = vec3(1.0) - exp(-hdrColor * exposure);

    // also gamma correct while we're at it       
    result = pow(result, vec3(1.0 / gamma));

    FragColor = vec4(result, 1.0);
}

Блум в светлом фрагментном шейдере

// final lighting calculations
    vec3 result = calc_directional_light(Diffuse, Specular, Metalness, AO);

    for (int i = 0; i < 5; i++)
    {
        result += calc_point_light(pointLights[i], Diffuse, Specular);
        result += calc_spot_light(spotLights[i], Diffuse, Specular);
    }

    float brightness = dot(result, vec3(0.2126, 0.7152, 0.0722));
    if(brightness > 0.7)
        BrightColor = vec4(result, 1.0);
    else 
        BrightColor = vec4(0.0, 0.0, 0.0, 1.0);

    FragColor = vec4(result, 1.0);

Настройка цветения

inline void Create(std::vector<GLuint> shader_programs, size_t width, size_t height, float intensity)
{
    _shader_programs = shader_programs;
    _intensity = intensity;

    _fbo = new Fbo(width, height, { new FboAttachment(width, height, GL_RGB16F, GL_RGB, GL_FLOAT, GL_COLOR_ATTACHMENT0),
                                    new FboAttachment(width, height, GL_RGB16F, GL_RGB, GL_FLOAT, GL_COLOR_ATTACHMENT1) }, true);

    _h_blur = new Fbo(width, height, { new FboAttachment(width, height, GL_RGB16F, GL_RGB, GL_FLOAT, GL_COLOR_ATTACHMENT0) }, false);
    _v_blur = new Fbo(width, height, { new FboAttachment(width, height, GL_RGB16F, GL_RGB, GL_FLOAT, GL_COLOR_ATTACHMENT0) }, false);

_u_texturemap[0] = glGetUniformLocation(_shader_programs[0], "textureMap");
_u_texturemap[1] = glGetUniformLocation(_shader_programs[1], "textureMap");

    _u_blurres[0] = glGetUniformLocation(_shader_programs[0], "blur_resolution");
    _u_blurres[1] = glGetUniformLocation(_shader_programs[0], "blur_resolution");
}

Bloom Render

inline virtual void Render()
    {
        _h_blur->Bind();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glUseProgram(_shader_programs[0]);

        glUniform1i(_u_texturemap[0], 0);
        glUniform1f(_u_blurres[0], 128.0f);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, _fbo->GetAttachments()[1]->_texture);

        _screen_rect->Render(1);

        _h_blur->Unbind();

        _v_blur->Bind();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glUseProgram(_shader_programs[1]);

        glUniform1i(_u_texturemap[1], 0);
        glUniform1f(_u_blurres[1], 128.0f);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, _h_blur->GetAttachments()[0]->_texture);

        _screen_rect->Render(1);

        _v_blur->Unbind();
    }
...