c - 绘制点之间的中点线

标签 c math opengl shader

我正在片段着色器中生成生成的形状,其中一部分涉及绘制对象之间的边界,即它们之间的分界线。

目前我有:
img

期望的效果是:
img
(来源:vinsol.com)

(请注意,绘制线条的形状不相关)

但问题是中心有一点突出。

uniform int objects = 0;
uniform vec2 positions[50];
uniform float radii[50];
uniform float meter = 64;
varying vec2 texPos;
uniform vec2 cameraPosition;
uniform float k1 = sqrt(2*50*50); //smoothness of cells
uniform float k2 = sqrt(2*50*50)/2; //smoothness of cell walls
uniform float lineWidth = 6;

#ifdef VERTEX
vec4 position(mat4 transform_projection, vec4 vertex_position)
{
    texPos = (cameraPosition + vertex_position.xy);
    return transform_projection * vertex_position;
}
#endif

#ifdef PIXEL
float smin( float a, float b, float k )
{
    float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
    return mix( b, a, h ) - k*h*(1.0-h);
}

vec4 effect( vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords ) {
  float finalmin = 0;
  float bordermin = 99999;
  for (int i = 0; i < objects; i++) {
    for (int j = 0; j < i; j++) {
      float di = distance(positions[i], texPos) - radii[i];
      float dj = distance(positions[j], texPos) - radii[j];
      float sm = smin(di, dj, k1);
      
      if (sm < finalmin) {
        finalmin = sm;
        bordermin = min(abs(di-dj),bordermin);
      }
    }
  }
  if (finalmin < 0) {
    // if (smin(borderdist, abs(finalmin), k2) < lineWidth) {
      if (bordermin < lineWidth) {
      color.a = 1;
    }

    return color;
  }
  return vec4(0.1,0,0,1);
}
#endif

注意这是love2d glsl,这就是为什么它有点不同

编辑:我解决了自己的问题

最佳答案

uniform int objects = 0;
uniform vec2 positions[50];
uniform float radii[50];
uniform float meter = 64;
varying vec2 texPos;
uniform vec2 cameraPosition;
uniform float k1 = sqrt(2*50*50); //smoothness of cells
uniform float k2 = sqrt(2*50*50)/4; //smoothness of cell walls
uniform float lineWidth = 6;

#ifdef VERTEX
vec4 position(mat4 transform_projection, vec4 vertex_position)
{
    texPos = (cameraPosition + vertex_position.xy);
    return transform_projection * vertex_position;
}
#endif

#ifdef PIXEL
float smin( float a, float b, float k )
{
    float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
    return mix( b, a, h ) - k*h*(1.0-h);
}

vec4 effect( vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords ) {
  float finalmin = 0;
  float bordermin = 99999;
  int closestobj = -1;


  float mindist = 99999;
  for (int i = 0; i < objects; i++) {
    float dist = distance(positions[i], texPos) - radii[i];
    if (closestobj == -1 || dist < mindist) {
      mindist = dist;
      closestobj = i;
    }
  }

  for (int i = 0; i < objects; i++) {
    for (int j = 0; j < i; j++) {
      float di = distance(positions[i], texPos) - radii[i];
      float dj = distance(positions[j], texPos) - radii[j];
      float sm = smin(di, dj, k1);
      float m = min(di, dj);
      if (sm < finalmin) {
        finalmin = sm;
        if (closestobj == i || closestobj == j) {
          bordermin = min(abs(di-dj), bordermin);
        }
      }
    }
  }
  if (finalmin < 0) {
    if (smin(bordermin, abs(finalmin), k2) < lineWidth) {
    // if (bordermin < lineWidth) {
      color.a = 1;
    }

    return color;
  }
  return vec4(0);
}
#endif

基本上,我所做的只是渲染两点之间的中点线(如果这两点之一是距离片段最近的点)。

关于c - 绘制点之间的中点线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56760509/

相关文章:

c - 双指针有时也用于通过引用将指针传递给函数

c++ - OpenGL 阴影故障

c++ - 使球相互反弹(openGL)

c - 了解 C 中的取消引用、地址和数组下标运算符

c - 多线程项目结构

c - 将输入的字符存储在数组中

opengl - 如何让多边形抗锯齿工作?

algorithm - 在 0-1 数组中查找所有 1 为 “on the left” 的 1 的个数?

c++ - 如何累积 3D 三角形网格的边?在 C C++ 中计算网格边缘的算法?

c++ - 特殊的简单随机数发生器