如何在片段着色器中将边框粗细限制为不超过1个像素?

时间:2013-09-24 14:44:56

标签: opengl-es webgl glsl shader

我正在尝试设置一个香椿着色器,但无论我做什么,我的边框总是在某些点上厚度超过1px:

bad http://dl.dropboxusercontent.com/u/62862049/Screenshots/wg.png

这真的很糟糕。我正在使用以下片段着色器:

precision mediump float;
    varying vec4 pos_var;
    uniform sampler2D rgb;
    uniform sampler2D depth;
    float dep(vec2 pos){
        return texture2D(depth,vec2(float(pos.x)/512.0,float(pos.y)/512.0)).x;
    }
    void main(void) {
        vec4 rgb = texture2D(rgb,vec2((pos_var.x+1.0)*0.5,(pos_var.y+1.0)*0.5));
        vec2 p = vec2(int(floor((pos_var.x+1.0)*0.5*512.0)), int(floor((pos_var.y+1.0)*0.5*512.0)));

        float d = dep(p);
        float dx = dep(vec2(p.x-1.0,p.y));
        float dX = dep(vec2(p.x+1.0,p.y));
        float dy = dep(vec2(p.x,p.y-1.0));
        float dY = dep(vec2(p.x,p.y+1.0));
        float t = 0.0002;
        gl_FragColor = (
            (dx>d+t) || 
            (dX>d+t) || 
            (dy>d+t) || 
            (dY>d+t)) 
            ? vec4(0.0,0.0,0.0,1.0) 
            : rgb;
    }

这是通过将像素的深度与其邻居的深度进行比较来确定像素是否为边界。这里,depth是一个纹理,其中第一遍渲染的每个像素的深度值,rgb是具有颜色的纹理。 dep是获取像素深度的辅助函数,t是任意容差。有没有人知道如何将边框的厚度限制为1?

0 个答案:

没有答案