【发布时间】:2015-10-24 21:37:42
【问题描述】:
我正在尝试制作一个稍微发光的灯泡,然后它会变得不那么强烈。在边缘也稍微暗一点。我找到了一个代码,我认为它创建了我想要创建的效果,但我似乎不太了解它。代码如下:
mat2 rotate2d(float angle){
return mat2(cos(angle),-sin(angle),
sin(angle),cos(angle));
}
float variation(vec2 v1, vec2 v2, float strength, float speed) {
return sin(
dot(normalize(v1), normalize(v2)) * strength + iGlobalTime * speed
) / 100.0;
}
vec3 paintCircle (vec2 uv, vec2 center, float rad, float width) {
vec2 diff = center-uv;
float len = length(diff);
len += variation(diff, vec2(0.0, 1.0), 5.0, 2.0);
len -= variation(diff, vec2(1.0, 0.0), 5.0, 2.0);
float circle = smoothstep(rad-width, rad, len) - smoothstep(rad, rad+width, len);
return vec3(circle);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy / iResolution.xy;
uv.x *= 1.5;
uv.x -= 0.25;
vec3 color;
float radius = 0.35;
vec2 center = vec2(0.5);
//paint color circle
color = paintCircle(uv, center, radius, 0.1);
//color with gradient
vec2 v = rotate2d(iGlobalTime) * uv;
color *= vec3(v.x, v.y, 0.7-v.y*v.x);
//paint white circle
color += paintCircle(uv, center, radius, 0.01);
fragColor = vec4(color, 1.0);
}
我不明白为什么我们需要归一化向量的点积以及它是如何精确选择的:
len += variation(diff, vec2(0.0, 1.0), 5.0, 2.0);
len -= variation(diff, vec2(1.0, 0.0), 5.0, 2.0);
我的意思是 - 为什么先加,然后减? 那为什么会这样:
vec2 uv = fragCoord.xy / iResolution.xy;
uv.x *= 1.5;
uv.x -= 0.25;
这是怎么做到的
vec2 v = rotate2d(iGlobalTime) * uv;
color *= vec3(v.x, v.y, 0.7-v.y*v.x);
使颜色渐变? 如果有人更喜欢在那里观看代码以及它的作用,这里是代码的链接:https://www.shadertoy.com/view/ltBXRc。 我显然不太擅长几何。如果有人可以帮助我,我将不胜感激:)
【问题讨论】:
标签: javascript colors webgl shader glow