我正在编写一个小型3D应用程序,我想要突出显示带有彩色边缘的选定对象。我使用FBO将正常场景渲染为两个颜色附件。第一个仅包含正常颜色输出,第二个存储场景中所有可见对象的拾取ID(颜色选择)。 现在我想将这两个纹理传递到我的片段着色器中,并输出第一个纹理的正常颜色值或黄色,如果此片段位于当前对象的边缘。这就是我的着色器的相关部分的样子:
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);
}
在我看来这应该有用,但有两个问题:
到目前为止,我认为sum总是为0,而且pickID大于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);
任何想法?