Shadertoy着色器未在p5js中编译

塞缪尔·科布

我一直在尝试导入一些我想在p5.js中使用的漂亮的shadertoy代码。

https://www.shadertoy.com/view/wtGyRz如果有人想看这里,这里是shadertoy代码。

我相信我已经将所有内容都更改为WEBGL的正确格式,但是它始终会出现编译错误,而且我不确定原因。我对WEBGL相对较新,并且使用着色器,因此非常感谢您的帮助。

所以这是我的超级简单的js代码:

let theShader;

function preload(){
  
  theShader = loadShader('shader.vert', 'shader.frag');
}

function setup() {
  createCanvas(windowWidth, windowHeight, WEBGL);
  noStroke();
}

function draw() {  
  shader(theShader);

  theShader.setUniform("iResolution", [width, height]);
  theShader.setUniform("iFrame", frameCount);
  theShader.setUniform("iMouse", [mouseX, map(mouseY, 0, height, height, 0)]);
  theShader.setUniform("iTime", millis()/1000);

  rect(0,0,width, height);
}

function windowResized(){
  resizeCanvas(windowWidth, windowHeight);
}

和我的顶点着色器:

attribute vec3 aPosition;

attribute vec2 aTexCoord;

void main() {

  vec4 positionVec4 = vec4(aPosition, 1.0);
  positionVec4.xy = positionVec4.xy * 2.0 - 1.0;

  gl_Position = positionVec4;
}

最后是错误点,我的片段着色器

#ifdef GL_ES
precision mediump float;
#endif
  
#define width 800.f
#define height 450.f
#define numColors 10
#define numCircles 100

uniform vec2 iResolution;
uniform int iFrame;
uniform vec2 iMouse;
uniform float iTime;


vec3 GetColor(vec2 coord, vec4 circles[numCircles], vec3 colors[numColors], float timeDelay){
    int value = 0;
    float r;
    float xc;
    float yc;
    float d = sqrt((coord[0] - xc)*(coord[0]-xc)+(coord[1]-yc)*(coord[1]-yc));
    for(int i = 0; i < numCircles; i++)
    {
        xc = circles[i][0];
        yc = circles[i][1];
        r = circles[i][2];
        d = sqrt((coord[0] - xc)*(coord[0]-xc)+(coord[1]-yc)*(coord[1]-yc));
        if(d <= r && iTime >= timeDelay * float(i))
        {
            value+= int(circles[i][3]);
        }
    }
    return colors[value % numColors];
}

void main(){
    float timeDelay = 0.05f;
    float timeFactor = 50.f;
    vec3 colors[numColors] = vec3[numColors](vec3(0.976, 0.254, 0.266),vec3(0.952, 0.447, 0.172),vec3(0.972, 0.588, 0.117),\
    vec3(0.976, 0.517, 0.290),vec3(0.976, 0.780, 0.309),vec3(0.564, 0.745, 0.427),vec3(0.262, 0.666, 0.545),\
    vec3(0.301,0.564,0.556),vec3(0.341,0.458,0.564),vec3(0.152,0.490,0.631));
    float timeInt = 0.f;
    int i = 0;
    float xGap = 1.f/11.f;
    float yGap = 1.f/11.f;
    vec4 circles[numCircles];
    for(float y = height * yGap; y < height; y+= height * yGap)
    {
        for (float x = width * xGap; x < width; x += width * xGap)
        {
            circles[i] = vec4(x, y, iTime * timeFactor - timeFactor * timeDelay * float(i),i+1);
            i++;
        }
    }

  vec3 col = GetColor(gl_FragCoord, circles, colors, timeDelay);
  gl_FragColor = vec4(col,1.0);
}

老实说,我不知道为什么它不能编译。对我未经训练的人来说,一切看起来都很好,所以我认为这可能是我不习惯的某种小语法。

man

问题是shadertoy着色器是用于WebGL2的GLSL ES 3.0着色器,但p5.js仅支持GLSL ES 1.0和WebGL1

不兼容包括\几行的末尾,这就是产生此错误的原因

glShaderSource:着色器源包含无效字符

找到了一段时间。Firefox给出了更好的错误

WebGL警告:shaderSource:source包含非法字符0x5c。

删除\字符,您将开始遇到更多相关错误,例如

该死!编译片段着色器时发生错误:
错误:0:33:'%':仅GLSL ES 3.00和更高版本支持整数模运算符
错误:0:37:'0.05f':GLSL ES 3.00之前不支持浮点后缀
错误:0:37:“ 0.05f”:语法错误

删除f后缀,出现更多与版本有关的问题

编译片段着色器时发生错误:
错误:0:33:'%':仅在GLSL ES 3.00和更高版本中支持整数模运算符
错误:0:39:'[]':仅在GLSL ES 3.00和更高版本中支持数组构造函数
错误:0:39:'[]':仅在GLSL ES 3.00及更高版本中支持的一流数组(数组初始化器)
错误:0:39:'=':数组的无效操作
错误:0:39:'=' :无法从“浮点数的三分量向量的常量数组[10]”转换为“浮点数的三分量向量的中型数组[10]”
错误:0:56:“ GetColor”:找不到匹配的重载函数
错误: 0:56:'=':尺寸不匹配
错误:0:56:'=':无法从'const mediump float'转换为'浮点数的三分量向量

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章