从这个答案here开始,我试图将仅包含一些透明部分(png)的纹理仅应用于矩形棱镜的边缘。
我的第一次尝试(左图)是使用线性过滤的4x4纹理。这是代码:
// Normal direction branching
// M: coordinates, MN: normals of the model, sX,sY,sZ. size of the box
if( (abs(MN.x) > abs(MN.y)) && (abs(MN.x) > abs(MN.z)) ) {
// X axis
texCoords = M.yz / vec2(sY, sZ);
} else if( (abs(MN.z) > abs(MN.x)) && (abs(MN.z) > abs(MN.y)) ) {
// Z axis
texCoords = M.xy / vec2(sX, sY);
} else {
// Y axis
texCoords = M.xz / vec2(sX, sZ);
}
texCoords += vec2(0.5);
我对这个结果感到不满意,因为盒子侧面有明显可见的伪影。 之后,我尝试使用距离函数和2x2纹理(中心图片),但是无法参数化映射的纹理到盒子边缘的距离。这是我第二次尝试的代码:
float squared(vec2 pos) {
float at = (atan(pos.x, pos.y) + PI) / (2.0 * PI);
float st = floor(at * 4.0 + 0.5) / 4.0;
float dist = length(pos) * cos((at - st) * 2.0 * PI);
return smoothstep(0.3, 1.0, dist);
}
// Here goes the same direction branching as above
texCoords *= squared(texCoords);
texCoords += vec2(0.5);
我正在尝试获得如右图所示的效果,该纹理将纹理应用于框的所有表面,模拟了边缘的漂亮方形阴影。
我现在正在接近距离函数,因此我不确定在这里应使用哪种方法,而且我想知道这是否是我要尝试的正确方法。
如何在箱子的周围绘制纹理坐标,直到与边缘保持一定距离?