我正在尝试设置一个卡通着色器,但无论我做什么,我的边框在某些点上总是比 1px 厚:
坏 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?