Glsl 有可能把红色改成蓝色吗?

Glsl 有可能把红色改成蓝色吗?,glsl,fragment-shader,Glsl,Fragment Shader,我有一些代码是在 \ifdef glu 精密中泵浮子; #恩迪夫 均匀vec2u_分辨率; 均匀vec2u_小鼠; 均匀浮动u_时间; 浮动重新映射(浮动a、浮动b、浮动c、浮动d、浮动t){ 返回((t-a)/(b-a))*(d-c)+c; } 浮动轮廓(vec2 st){ 返回smoothstep(0.99,1.0,st.y)+smoothstep(0.99,1.0,st.x)+smoothstep(0.01,0.0,st.y)+smoothstep(0.01,0.0,st.x); } 浮动

我有一些代码是在

\ifdef glu
精密中泵浮子;
#恩迪夫
均匀vec2u_分辨率;
均匀vec2u_小鼠;
均匀浮动u_时间;
浮动重新映射(浮动a、浮动b、浮动c、浮动d、浮动t){
返回((t-a)/(b-a))*(d-c)+c;
}
浮动轮廓(vec2 st){
返回smoothstep(0.99,1.0,st.y)+smoothstep(0.99,1.0,st.x)+smoothstep(0.01,0.0,st.y)+smoothstep(0.01,0.0,st.x);
}
浮动鼠标fo(vec2缩放st、vec2 u_鼠标、浮动缩放eval){
vec2 scaledMouse=u_鼠标*scaleVal;
如果(scaledSt.x楼层(scaledMouse.x)&&scaledSt.y楼层(scaledMouse.y)){
//if(u_鼠标.x<100.0){
返回1.0;
}否则{
返回0.0;
}
}
void main(){
vec2 st=gl_FragCoord.xy/u_resolution.xy;
vec3颜色=vec3(0.03,0.07,0.15);
vec3红色=vec3(1.0,0.0,0.0);
vec3大纲颜色=vec3(1.0);
浮动地板;
浮点数=5.0;
vec2 scaledSt=st*scaleVal;
//瓦片
st*=标度值;
地板=地板(标准x);
st=分形(st);
//内色
颜色=混合(颜色、红色、鼠标fo(缩放ST、u_鼠标/u_分辨率.xy、缩放瓦尔));
//轮廓
颜色=混合(颜色、大纲颜色、大纲(st));
gl_FragColor=vec4(颜色,1.0);
}
我想知道,当一个框悬停时,是否有可能将红色变为蓝色?我想如果我要将数据写入纹理并进行查找,我可能会想到如何做到这一点,但即使这样,我也不能完全确定。

使用 使用
mix
在红色和蓝色之间插值。您需要另一个从0-1转换的变量来进行混合,即
mix
的第三个参数

:

void主图像(输出vec4 fragColor,输入vec2 fragCoord)
{
//标准化像素坐标(从0到1)
vec2 uv=fragCoord/iResolution.xy;
vec3红色=vec3(1,0,0);
vec3蓝色=vec3(0,0,1);
//输出到屏幕
fragColor=vec4(混合(红色、蓝色、uv.x),1.0);
}
产生:

在您的情况下,您需要在鼠标进入悬停区域后的一段时间内(例如,.2秒)驱动第三个参数(alpha或lerp参数)。您需要执行以下操作之一:

  • 检测在更高级别输入的悬停,然后将鼠标按下时间作为一个统一的输入
  • 直接从均衡器驱动第三个参数

谢谢你的回复,道格!我熟悉混合函数,但我想知道如何才能知道一个正方形没有被覆盖,并开始转换为蓝色?哎呀!对不起,问题读得太快了。我的错。更新了。
#ifdef GL_ES
precision mediump float;
#endif


uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

float remap(float a, float b, float c, float d, float t) {
    return ((t - a) / (b - a)) * (d-c) + c;
}

float outline(vec2 st) {
    return smoothstep(0.99, 1.0, st.y) + smoothstep(0.99, 1.0, st.x) + smoothstep(0.01, 0.0, st.y) + smoothstep(0.01, 0.0, st.x);
}

float mouseFoo(vec2 scaledSt, vec2 u_mouse, float scaleVal) {
    vec2 scaledMouse = u_mouse * scaleVal;
    if(scaledSt.x < ceil(scaledMouse.x) && scaledSt.x > floor(scaledMouse.x) && scaledSt.y < ceil(scaledMouse.y) && scaledSt.y > floor(scaledMouse.y)) {
    // if(u_mouse.x < 100.0) {
        return 1.0;
    } else {
        return 0.0;         
    }

}

void main(){    
    vec2 st = gl_FragCoord.xy/u_resolution.xy;
    vec3 color = vec3(0.03,0.07,0.15);
    vec3 redColor = vec3(1.0, 0.0, 0.0);
    vec3 outlineColor = vec3(1.0);
    float floorSt;
    float scaleVal = 5.0;
    vec2 scaledSt = st * scaleVal;

    // tile
    st *= scaleVal;
    floorSt = floor(st.x);
    st = fract(st);

    // inner color
    color = mix(color, redColor, mouseFoo(scaledSt, u_mouse/u_resolution.xy, scaleVal));

    // outline
    color = mix(color, outlineColor, outline(st));

    gl_FragColor = vec4(color, 1.0 );
}