【问题标题】:Plasma Shader is not rendering as expected等离子着色器未按预期渲染
【发布时间】:2023-01-19 00:47:06
【问题描述】:

我正在尝试从 ShaderToy 破解这个 Plasma 着色器,因此它可以与 Spark AR 一起使用 ... 我非常接近,但是着色器被压缩到角落时存在一个奇怪的问题。有没有着色大师可以给我一些指导?这是它现在在 Spark 中的样子:

输入是屏幕尺寸、屏幕触摸坐标、时间和可能是罪魁祸首的directionvec2。我不完全确定这个输入在做什么。

这是我转换后的着色器代码:

precision highp float;

vec4 main( in vec2 direction, in float time, in vec2 touch, in vec2 screen )
{
    vec2 uv = fragment(std::getVertexTexCoord());
    float t = time/.1 + touch.x;
    vec2  R =  uv.xy, S = screen * 0.01,
          p = ( direction+direction - R ) / R * S,
          q = vec2(cos(-t / 165.), cos( t / 45.))  * S - p;
    t = 1. + cos( length( vec2(cos( t / 98.),  sin( t / 178.)) * S - p ) / 30.) 
           + cos( length( vec2(sin(-t / 124.), cos( t / 104.)) * S - p ) / 20.) 
           + sin( length(q) / 25. ) * sin(q.x / 20.) * sin(q.y / 15.);
    return .5 + .5* cos( (time+touch.y) / vec4(63,78,45,1) + ( t + vec4(0,1,-.5,0) ) *3.14 );
}

这是一个 sca 文件,它是着色器的 Spark AR 格式。

这是来自ShaderToy的这段代码的转换:

void mainImage( out vec4 O, vec2 U )
{
    float t = iTime/.1 + iMouse.x;
    vec2  R =  iResolution.xy, S = vec2(160,100),
          p = ( U+U - R ) / R * S,
          q = vec2(cos(-t / 165.), cos( t / 45.))  * S - p;
    t = 1. + cos( length( vec2(cos( t / 98.),  sin( t / 178.)) * S - p ) / 30.) 
           + cos( length( vec2(sin(-t / 124.), cos( t / 104.)) * S - p ) / 20.) 
           + sin( length(q) / 25. ) * sin(q.x / 20.) * sin(q.y / 15.);
    O = .5 + .5* cos( (iTime+iMouse.y) / vec4(63,78,45,1) + ( t + vec4(0,1,-.5,0) ) *3.14 );
}

希望有人能帮忙。

【问题讨论】:

    标签: glsl shader fragment-shader spark-ar-studio shadertoy


    【解决方案1】:

    问题来自于您将 shadertoy 代码中的 iResolution 变量误解为片段的 uv 坐标。 iResolution 只是一个变量,用于存储屏幕上图像的尺寸(以像素为单位)。每个像素都是一样的。 U 在另一侧,存储以像素为单位测量的片段坐标(因此 uv = U / iResolution )。它在默认的 shadertoy 着色器中被称为 fragCoord

    在你的情况下,因为你已经有uv从0到1,你不需要R来定义pp = ( U + U - R ) / R * S可以变成p = ( U/R + U/R - R/R ) * S然后p = (uv + uv - vec2(1)) * S

    我希望这可以解决您的问题,如果没有,请告诉我。

    编辑:我刚刚意识到你可以进一步简化p的定义,因为- vec2(1)是一个不会真正影响结果的翻译,uv + uv可以通过用@987654336补偿替换为uv @.这样就可以变成p = uv * S

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多