Opengl 显示剪裁平面和剪裁对象之间的边
我想利用着色器不仅丢弃位于预定义平面一侧的片段,而且沿交点渲染轮廓 我的片段着色器当前执行以下操作:Opengl 显示剪裁平面和剪裁对象之间的边,opengl,glsl,shader,fragment-shader,Opengl,Glsl,Shader,Fragment Shader,我想利用着色器不仅丢弃位于预定义平面一侧的片段,而且沿交点渲染轮廓 我的片段着色器当前执行以下操作: float dot = dot(world_coordinate, normalize(clipping_normal.xyz)) - clipping_normal.w; if (dot > 0.0f) discard; 这可以工作,但没有所需的轮廓。我尝试将点积与接近0.0的值进行比较,但这会导致轮廓的宽度随视图等而变化 这就是我想要达到的目标。请注意,平面与球体相交处的白
float dot = dot(world_coordinate, normalize(clipping_normal.xyz)) - clipping_normal.w;
if (dot > 0.0f)
discard;
这可以工作,但没有所需的轮廓。我尝试将点积与接近0.0的值进行比较,但这会导致轮廓的宽度随视图等而变化
这就是我想要达到的目标。请注意,平面与球体相交处的白色轮廓/边缘具有一致的宽度:
下面是我目前看到的结果:
使用片段着色器:
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);
}
为vec4颜色;
在vec3世界排名中;
输出vec4 frag_颜色;
void main()
{
浮点距离=(点(剪裁平面.xyz,世界位置)-剪裁平面.w)/
点(剪裁平面.xyz,剪裁平面.xyz);
如果(距离>=0.0f&&dist<0.05f)
frag_color=vec4(0.0f,0.0f,0.0f,1.0f);
否则如果(距离<0.0f)
丢弃;
其他的
frag_color=ComputePhong(颜色);
}
交点的轮廓也属于剪裁平面,因此到该平面的距离为零
使用点(点,法线)
是不够的。您需要d=A·x+B·y+C·z+d
,它是点到平面的全距离公式的分子(不带“模数”)。看
这个计算出的d
不仅给出了距离(如果法线A、B、C不是幺正的,则在分母中加上正方形),而且它的符号告诉您点在平面的哪一侧
在片段着色器内部工作可能需要使用NDC坐标。因此,也将
A、B、C、D
转换为NDC。您能否添加一个您正在寻找的示例?还有,它应该是精确的还是边缘检测算法足够了?我添加了一个图像,这就够了吗?不,你认为轮廓是什么?白色边缘不是轮廓吗?更新了问题的更多细节我目前正在碎片着色器中使用世界坐标。您的方法提供了一个稍微好一点的结果,但不幸的是仍然不能完全解决问题。轮廓的宽度不一致,并且会随摄影机旋转而变化。如果需要的话,我可以附加一个带有问题图片的链接。@zman图片很好,有代码的更好。您可以编辑您的问题并同时添加这两个问题。使用更多信息更新了我的问题。