GLSL 弹跳球问题

问题描述 投票:0回答:1
#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

graphics glsl shader fragment-shader
1个回答
0
投票

着色器没有状态,因此

pos.x += u_time * speed
speed = -speed
一起不会帮助您在此处实现反弹。

我看到两种可能的解决方案。

  1. 使用三角波函数计算给定
    pos.x
    u_time
  2. 在着色器外部计算
    pos.x
    (您 do 有状态)并通过制服将其传递到着色器,就像使用
    u_time
    一样。
© www.soinside.com 2019 - 2024. All rights reserved.