選択したオブジェクトを色付きのエッジで強調表示する小さな 3D アプリケーションを作成しています。FBO を使用して、通常のシーンを 2 つのカラー アタッチメントにレンダリングします。1 つ目は通常のカラー出力のみを含み、2 つ目はシーン内のすべての可視オブジェクトのピッキング ID を格納します (カラー ピッキング)。
次に、これら 2 つのテクスチャをフラグメント シェーダに渡し、最初のテクスチャの通常のカラー値を出力するか、このフラグメントが現在のオブジェクトのエッジにある場合は黄色を出力します。これは、私のシェーダーの関連部分がどのように見えるかです:
uniform sampler2D picking_texture;
uniform sampler2D color_texture;
uniform float pickingID;
uniform float width;
uniform float height;
...
// texture coordinate delta
float dxtex = 1.0 / width; // texture width
float dytex = 1.0 / height; // texture height
// compare neighboring texels in the picking texture (edge detection)
float nLeft = texture2D(picking_texture, gl_TexCoord[1].st + vec2(-dxtex, 0.0)).r;
float nRight = texture2D(picking_texture, gl_TexCoord[1].st + vec2( dxtex, 0.0)).r;
float nTop = texture2D(picking_texture, gl_TexCoord[1].st + vec2( 0.0, dytex)).r;
float nBottom = texture2D(picking_texture, gl_TexCoord[1].st + vec2( 0.0,-dytex)).r;
float sum = nLeft+nRight+nTop+nBottom;
if(sum != 4.0 * pickingID)
{
finalColor = vec4(1.0, 1.0, 0.0, 0.0);
}
私の意見では、これは機能するはずですが、2 つの問題があります。
- ID 0 のオブジェクトは通常どおり色付けされます
- 他のすべては完全に黄色に着色されています
これまでのところ、sum は常に 0 であり、pickingID が 0 より大きいすべてのオブジェクトは黄色で表示されると考えていました。しかし、これは picking_texture のルックアップが常に 0 を返すことを意味します。したがって、テクスチャ (バインディング、texCoords など) に何か問題がある可能性がありますが、何が原因かわかりませんでした。color_texture は期待どおりに機能します。
これは、プログラムの CPU 部分で行っていることです。
シェーダーをリンクおよびバインドした後:
// set locations of the textures
texture_location0 = glGetUniformLocation(shaderProgram->programId(), "color_texture");
glUniform1i(texture_location0, 0);
texture_location1 = glGetUniformLocation(shaderProgram->programId(), "picking_texture");
glUniform1i(texture_location1, 1);
シーンを描画する前に:
// set textures
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, colorTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, pickingTex);
何か案が?