#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;
vec3 color_bg = vec3(1.0);
vec3 circle_color = vec3(0.0, 0.0, 0.0);
void circle(float radius, vec2 pos, vec2 mouse, vec2 view, float speed) {
gl_FragColor = vec4(color_bg, 1.0);
float aspect_ratio = u_resolution.x / u_resolution.y;
pos.x += u_time * speed;
float circle_radius = sqrt(pow((view.x * aspect_ratio - pos.x * aspect_ratio), 2.0) + pow((view.y - pos.y), 2.0));
if(pos.x + radius >= 1.0 || pos.x - radius <= 0.0) {
// Background orange color change for debugging
gl_FragColor = vec4(vec3(0.9686, 0.5529, 0.298), 1.0);
speed = -speed;
}
if(circle_radius <= radius) {
gl_FragColor = vec4(circle_color, 1.0);
}
}
void main() {
vec2 normalized_view = gl_FragCoord.xy/u_resolution;
vec2 normalized_mouse = u_mouse.xy/u_resolution;
vec2 circle_position = vec2(0.5, 0.5);
float speed = 0.2;
circle(0.03, circle_position, normalized_mouse, normalized_view, speed);
}
大家好
我是 GLSL 或“图形编程”的新手(几天)。尽管向 ChatGPT 提出了这个问题,但我和 ChatGPT 都无法解决它,所以,问题是,由于某种原因,圆圈在与边界碰撞时不会弹跳。我不希望您给我写代码,只要详细的解释将不胜感激。我猜它与调用堆栈有关,但仍然..
硬件:MacBook M1 Pro
着色器没有状态,因此
pos.x += u_time * speed
与 speed = -speed
一起不会帮助您在此处实现反弹。
我看到两种可能的解决方案。
pos.x
的u_time
。pos.x
(您 do 有状态)并通过制服将其传递到着色器,就像使用 u_time
一样。