单个对象上的高斯模糊

时间:2016-07-08 13:39:46

标签: opengl blur deferred-rendering gaussianblur

我已经实现了一个简单的高斯模糊,并将其与延迟着色相结合,并且它可以工作。当我试图将另一个对象添加到场景时,对象也会受到模糊的影响,这不是我正在寻找的。是否有可能使模糊只影响目标对象的图像,还是应该影响整个场景?

对于模糊我使用2个顶点着色器,一个计算水平纹理坐标,另一个计算垂直纹理坐标。两个顶点着色器都使用相同的片段着色器,该着色器仅计算这些预先计算的纹理坐标上的纹素的颜色的高斯加权平均值。

模糊对象的片段着色器:

vec3 color;
    color += texture(gColorSpec, v_blurTexCoords[ 0]).rgb *0.0044299121055113265;
    color += texture(gColorSpec, v_blurTexCoords[ 1]).rgb*0.00895781211794;
    color += texture(gColorSpec, v_blurTexCoords[ 2]).rgb*0.0215963866053;
    color += texture(gColorSpec, v_blurTexCoords[ 3]).rgb*0.0443683338718;
    color += texture(gColorSpec, v_blurTexCoords[ 4]).rgb*0.0776744219933;
    color += texture(gColorSpec, v_blurTexCoords[ 5]).rgb*0.115876621105;
    color += texture(gColorSpec, v_blurTexCoords[ 6]).rgb*0.147308056121;
    color += texture(gColorSpec, v_texCoord         ).rgb*0.159576912161;
    color += texture(gColorSpec, v_blurTexCoords[ 7]).rgb*0.147308056121;
    color += texture(gColorSpec, v_blurTexCoords[ 8]).rgb*0.115876621105;
    color += texture(gColorSpec, v_blurTexCoords[ 9]).rgb*0.0776744219933;
    color += texture(gColorSpec, v_blurTexCoords[10]).rgb*0.0443683338718;
    color += texture(gColorSpec, v_blurTexCoords[11]).rgb*0.0215963866053;
    color += texture(gColorSpec, v_blurTexCoords[12]).rgb*0.00895781211794;
    color += texture(gColorSpec, v_blurTexCoords[13]).rgb*0.0044299121055113265;
    ...

在这种情况下,gColorSpec是延迟着色的颜色样本(图像)。

在延迟着色的闪电通道中,我激活了第一个和第二个顶点着色器。

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        //object without blur
        ShadersWithoutBlur.Use();
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, gPosition);
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, gNormal);
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, gColorSpec);
        // Also send light relevant uniforms
        glUniform3fv(glGetUniformLocation(ShadersWithoutBlur.shaderProgram, "lightPos"), 1, &lightPos[0]);
        glUniform3fv(glGetUniformLocation(ShadersWithoutBlur.shaderProgram, "lightColor"), 1, &lightColor[0]);
        glUniform3fv(glGetUniformLocation(ShadersWithoutBlur.shaderProgram, "viewPos"), 1, &camera.Position[0]);
        glUniform3fv(glGetUniformLocation(ShadersWithoutBlur.shaderProgram, "kd"), 1, &kd[0]);

        //Blur object
        FirstLightningPass.Use();
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, gPosition);
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, gNormal);
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, gColorSpec);
        // Also send light relevant uniforms
        glUniform3fv(glGetUniformLocation(FirstLightningPass.shaderProgram, "lightPos"), 1, &lightPos[0]);
        glUniform3fv(glGetUniformLocation(FirstLightningPass.shaderProgram, "lightColor"), 1, &lightColor[0]);
        glUniform3fv(glGetUniformLocation(FirstLightningPass.shaderProgram, "viewPos"), 1, &camera.Position[0]);
        glUniform3fv(glGetUniformLocation(FirstLightningPass.shaderProgram, "kd"), 1, &kd[0]);

        SecondLightningPass.Use();
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, gPosition);
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, gNormal);
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, gColorSpec);
        glUniform3fv(glGetUniformLocation(SecondLightningPass.shaderProgram, "lightPos"), 1, &lightPos[0]);
        glUniform3fv(glGetUniformLocation(SecondLightningPass.shaderProgram, "lightColor"), 1, &lightColor[0]);
        glUniform3fv(glGetUniformLocation(SecondLightningPass.shaderProgram, "viewPos"), 1, &camera.Position[0]);
        glUniform3fv(glGetUniformLocation(SecondLightningPass.shaderProgram, "kd"), 1, &kd[0]);
        // Finally render quad
        RenderQuad();   

已经尝试过:由于我使用了延迟着色,我尝试制作另一个帧缓冲区来渲染几何体,然后仅用于模糊图像对象。这并不起作用,因为我似乎只需要一个帧缓冲,它将整个场景几何体相加。我还尝试添加另一个替换gColorSpec的附件,只是为了检查它是否与另一个gColorSpec的另一个图像对象有连接。

0 个答案:

没有答案
相关问题