使用颜色拾取纹理(OpenGL)的边缘检测着色器

时间:2013-04-22 16:06:50

标签: opengl glsl shader textures

我正在编写一个小型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);
}

在我看来这应该有用,但有两个问题:

  • ID为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);

任何想法?

0 个答案:

没有答案