如何进行2D射线编排,以不同的颜色为每个形状着色

时间:2019-08-21 10:05:55

标签: glsl webgl

TLDR;

使圆形和三角形具有不同的颜色:https://www.shadertoy.com/view/WtSXzV

我正在尝试使用sdf表示2D形状。我可以通过合并形状A和形状B来制作形状C。但是我不能为形状A和B使用不同的颜色来着色该形状。我想我必须使用光线追赶。

在此site中,光线行进定义为:

void raymarch( out vec4 color, in vec2 pixel )
{
    // setup
    vec3 ro = calcRayOrigin();
    vec3 rd = calcRayDirection( pixel );

    // raymarch: return distance and object id
    float (t,oid) = raymarch( ro, rd );

    // prepare for surfacing
    vec3 pos = ro + t*rd;
    vec3 nor = calcNormal( pos, t );

    // surfacing
    vec2 uv = textureMapping( pos, oid );
    vec3 sur = texture( sampler, uv );

    // ligthing
    vec3 lig = calcLighting( pos, nor, t );

    // point color
    return calcSurfaceColor( sur, lig, t );
}

raymarch函数采用ray originray direction并返回距离和被击中对象的对象ID。我可以使用该对象ID为每个对象着色不同的颜色。

但是它没有给出raymarch函数的定义。我试图这样写:

float raymarch(vec2 ro, vec2 rd)
{

  float total_distance_traveled = 0.0;

  for (int i = 0; i < 50; i++) {

    vec2 current_pos = ro + total_distance_traveled * rd;

    bool outside_bounds = current_pos.x < 0.0 || current_pos.x > 1.0 || current_pos.y < 0.0 || current_pos.y > 1.0;

    float dist = sdHero(current_pos);

    if (dist < 0.001) {
      return dist;
    }

    if (dist > 0.01) {
      break;
    }

    total_distance_traveled += dist;
  }

  return 1.0;
}

这将返回最小距离,但不会返回对象ID,实际上我不太了解此函数的作用。顺便说一句,我不需要闪电或特殊效果,我只想用不同的颜色对每种形状进行平面着色。

因此,基本上,我需要一个2d射线行进算法,该算法能够为组合形状提供不同的颜色。

0 个答案:

没有答案