使圆形和三角形具有不同的颜色: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 origin
和ray 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射线行进算法,该算法能够为组合形状提供不同的颜色。