C++ opengl中使用重心坐标的抗锯齿线

C++ opengl中使用重心坐标的抗锯齿线,c++,opengl-es,opengl-es-2.0,fragment-shader,vertex-shader,C++,Opengl Es,Opengl Es 2.0,Fragment Shader,Vertex Shader,我正在通过连接两个三角形绘制线段。三角形的每个顶点都获得一组唯一的坐标作为可变变量(vec3 vBC)。然后在片段着色器中,我得到的这个变量的值是一个插值,表示片段在三角形中的位置。我使用这个值来确定片段离三角形边缘有多远,这反过来又用于对边缘进行抗锯齿 请参见下图中的问题: 请注意Rect 1中的锯齿边。这是因为我没有对边BC和DE应用抗锯齿,因为它们是内部边。由于长度x非常小,靠近顶点C和D的边BC和DE上的锯齿边变得可见;这些锯齿状边缘的长度比x长。如果我对这两条边(BC和DE)应用抗锯

我正在通过连接两个三角形绘制线段。三角形的每个顶点都获得一组唯一的坐标作为可变变量(vec3 vBC)。然后在片段着色器中,我得到的这个变量的值是一个插值,表示片段在三角形中的位置。我使用这个值来确定片段离三角形边缘有多远,这反过来又用于对边缘进行抗锯齿

请参见下图中的问题:

请注意Rect 1中的锯齿边。这是因为我没有对边BC和DE应用抗锯齿,因为它们是内部边。由于长度x非常小,靠近顶点C和D的边BC和DE上的锯齿边变得可见;这些锯齿状边缘的长度比x长。如果我对这两条边(BC和DE)应用抗锯齿,我会看到Rect 2。这是因为消除混叠期间的平滑过程会将alpha值0.0指定给位于或非常靠近边缘的碎片。所以抗锯齿BC和DE在内部引入一条白色对角线

所以我的问题是,我怎么可能平滑Rect 1

片段着色器:

varying vec4 DestinationColor;
varying vec2 TexCoordOut;
varying vec3 vBC;
uniform sampler2D Texture;
uniform int TexEnabled;
float edgeFactor();

void main() {
  if (TexEnabled == 1) {
     gl_FragColor = texture2D(Texture, TexCoordOut) * DestinationColor;
  } else{
     gl_FragColor = vec4(DestinationColor.xyz, edgeFactor());
  }
}

float edgeFactor() {
  vec3 d = fwidth(vBC);
  vec3 a3 = smoothstep(vec3(0.0), d*1.5, vBC);
  return a3.y;
};

在着色器代码中,a3.y表示一组坐标中的第二个值(顶点D或C与片段之间的距离),即y表示D(0,1,0)中的1,第一个0和第二个0分别表示x和z

算法基本上是合理的,但您需要一些方法来区分内部边缘和外部边缘,这是简单几何体无法做到的。您需要复制顶点,以便构成内部边的顶点可以具有一些独特的属性,以便它们看起来与外部边不同。也就是说,听起来很贵


创建一个小纹理可能会更简单,该纹理的边缘有一个透明的alpha值,该值应用于整个线宽,沿着线宽重复。它可能比所有额外的逐顶点数据都要快,尤其是在具有延迟几何处理的移动设备上。

该算法基本上是合理的,但您需要一些方法来区分内部边缘和外部边缘,这是使用简单几何体无法做到的。您需要复制顶点,以便构成内部边的顶点可以具有一些独特的属性,以便它们看起来与外部边不同。也就是说,听起来很贵


创建一个小纹理可能会更简单,该纹理的边缘有一个透明的alpha值,该值应用于整个线宽,沿着线宽重复。它可能比所有额外的逐顶点数据都要快,尤其是在具有延迟几何处理的移动设备上。

“注意Rect 1中的锯齿边”不。我只看到一个黑色矩形,在两个角上有一些污迹。这不是我从opengl获得的原始输出。我只是想显示锯齿状边缘的位置。这些“污点”实际上是BC和DE行的尖锐边缘。我希望你能看到BC和DE行的锯齿边缘“这不是我从opengl获得的原始输出”。那么,你怎么期望有人注意到实际上不存在的东西呢?你问的是你提供的图像中没有显示的锯齿状边缘。我想我的解释和图像会把它弄清楚。不管怎样,你现在明白我想表达什么了吗?“注意矩形1中的锯齿状边缘”不。我只看到一个黑色矩形,在两个角上有一些污迹。这不是我从opengl获得的原始输出。我只是想显示锯齿状边缘的位置。这些“污点”实际上是BC和DE行的尖锐边缘。我希望你能看到BC和DE行的锯齿边缘“这不是我从opengl获得的原始输出”。那么,你怎么期望有人注意到实际上不存在的东西呢?你问的是你提供的图像中没有显示的锯齿状边缘。我想我的解释和图像会把它弄清楚。不管怎样,你现在明白我想表达什么了吗?