首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示剪裁平面和剪裁对象之间的边

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

Stack Overflow用户
提问于 2019-02-26 23:45:29
回答 1查看 206关注 0票数 1

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

我的片段着色器当前执行的内容如下:

代码语言:javascript
运行
复制
float dot = dot(world_coordinate, normalize(clipping_normal.xyz)) - clipping_normal.w;
if (dot > 0.0f) 
    discard;

这是可行的,但没有所需的轮廓。我尝试将点积与接近0.0的值进行比较,但这会导致轮廓线的宽度因视图而异,等等。

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

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

使用片段着色器:

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2019-02-27 01:02:38

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

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

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

在片段着色器中工作时,你可能会使用NDC坐标。所以也要把A,B,C,D转换成NDC。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54889249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档