シンプルなガウスぼかしを実装し、遅延シェーディングと組み合わせましたが、うまくいきました。シーンに別のオブジェクトを追加しようとすると、オブジェクトもぼかしの影響を受けますが、これは私が探しているものではありません。ぼかしをターゲット オブジェクトの画像のみに影響させることは可能ですか、それともシーン全体に影響を与えることになっていますか?
ぼかしには 2 つの頂点シェーダーを使用しています。1 つは水平方向のテクスチャ座標を計算し、もう 1 つは垂直方向のテクスチャ座標を計算します。両方の頂点シェーダーは同じフラグメント シェーダーを使用しており、これらの事前に計算されたテクスチャ座標でテクセルの色のガウス加重平均を計算するだけです。
ぼかしオブジェクトのフラグメント シェーダー:
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
は、ディファード シェーディングのカラー サンプル (イメージ) です。
ディファード シェーディングのライトニング パスでは、1 番目と 2 番目の頂点シェーダーをアクティブにしています。
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();
すでに試しました:遅延シェーディングを使用しているため、ジオメトリをレンダリングする別のフレーム バッファーを作成しようとしました。これは、ぼかし画像オブジェクトにのみ使用されます。シーン全体のジオメトリを追加するフレームバッファが 1 つしか必要ないように見えるため、これは機能しません。また、他の画像オブジェクトgColorSpec
との接続があるかどうかを確認するために、を置き換える別の添付ファイルを追加しようとしました。gColorSpec