Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 显示剪裁平面和剪裁对象之间的边_Opengl_Glsl_Shader_Fragment Shader - Fatal编程技术网

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图片很好,有代码的更好。您可以编辑您的问题并同时添加这两个问题。使用更多信息更新了我的问题。