显示剪裁平面和剪切对象之间的边

问题描述 投票:1回答:1

我想利用着色器不仅丢弃碎片,如果它们位于预定义平面的一侧,而且还沿着交叉点渲染轮廓。

我的片段着色器目前有以下几点:

float dot = dot(world_coordinate, normalize(clipping_normal.xyz)) - clipping_normal.w;
if (dot > 0.0f) 
    discard;

这可行,但没有所需的轮廓。我尝试将点积与接近0.0的值进行比较,但这会导致轮廓具有不同的宽度,具体取决于视图等...

这就是我想要实现的目标。请注意,平面与球体相交的白色轮廓/边缘具有一致的宽度:

cross-section

以下是我目前看到的结果:

my-result

使用片段着色器:

in vec4 color;
in vec3 world_position; 

out vec4 frag_color;

void main()
{    
    float dist = (dot(clipping_plane.xyz, world_position) - clipping_plane.w) / 
              dot(clipping_plane.xyz, clipping_plane.xyz);

    if(dist >= 0.0f && dist < 0.05f)
        frag_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
    else if(dist < 0.0f) 
        discard;
    else
        frag_color = ComputePhong(color);
}
opengl glsl shader fragment-shader
1个回答
1
投票

交点的轮廓也属于剪切平面,因此到该平面的距离为零。

使用dot(point, normal)是不够的。你需要d= A·x + B·y + C·z + D,它是全距离点到平面公式的分子(没有“模数”)。见plane geometry

这个计算出的d不仅可以给出距离(如果法线A,B,C不是单一的,则在分母中加上正方形),而且它的符号会告诉你这个点的哪一侧。

在片段着色器中工作可能您使用NDC坐标。因此,将A,B,C,D转换为NDC。

© www.soinside.com 2019 - 2024. All rights reserved.